LangChain4j中集成Redis向量数据库

redis向量数据库的安装

使用docker安装即可

docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest

使用

引入redis向量和通义千问相关依赖

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-community-redis-spring-boot-starter</artifactId>
        </dependency>
    <dependencyManagement>
        <dependencies>
            <!--LangChain4j官方核心BOM,包含了官方支持的核心模块和功能-->
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-bom</artifactId>
                <version>1.0.0-beta3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--社区维护的BOM,包含了由社区开发和维护的模块,比如第三方集成等-->
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-community-bom</artifactId>
                <version>${langchain4j.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

redis向量数据库配置

langchain4j:
  community:   #阿里向量模型配置
    dashscope:
      embedding-model:
        api-key: #设置自己的apikey
        model-name: text-embedding-v4
      chat-model:
        model-name: qwen-plus-2025-04-28
        api-key: #设置自己的apikey
        enable_thinking: false  #非流式模式时设置为false
    redis:   #redis向量数据库配置
      host: 101.43.94.164
      password:
      port: 6379
      index-name: mytest
      prefix: 'langchain4j:vector:test1:'
      dimension: 1536

    /**
     * 使用的是阿里的text-embedding-v3向量模型
     */
    @Autowired
    private EmbeddingModel embeddingModel;

    /**
     * 使用的是redis向量数据库
     */
    @Autowired
    private EmbeddingStore<TextSegment> embeddingStore;

    /**
     * redis向量数据库测试
     */
    @Test
    public void test1() {
        // 将指定的数据向量化,并存入redis
        TextSegment segment1 = TextSegment.from("I like football.");
        Embedding embedding1 = embeddingModel.embed(segment1).content();
        embeddingStore.add(embedding1, segment1);

        TextSegment segment2 = TextSegment.from("The weather is good today.");
        Embedding embedding2 = embeddingModel.embed(segment2).content();
        embeddingStore.add(embedding2, segment2);

        // 向需要比对的内容向量化
        Embedding queryEmbedding = embeddingModel.embed("What is your favourite sport?").content();
        // 创建搜索对象
        EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder()
                .queryEmbedding(queryEmbedding)
                .maxResults(6) // 指定返回的搜索结果的最大个数
                .build();
        // 进行相似度搜索
        List<EmbeddingMatch<TextSegment>> matches = embeddingStore.search(embeddingSearchRequest).matches();
        // 获取匹配的数据
        EmbeddingMatch<TextSegment> embeddingMatch = matches.get(0);
        // 打印计算的结果
        System.out.println(embeddingMatch.score());
        System.out.println(embeddingMatch.embedded().text());
    }

这是插入到redis向量数据中的数据,注意向量数据在redis中使用json存储
在这里插入图片描述

简单Rag实现

ChatMemory、ChatMemoryProvider相关配置

@Configuration
public class XZAgentConfig {

    @Bean
    public ChatMemory xzChatMemory() {
        return MessageWindowChatMemory.withMaxMessages(20);
    }

    @Autowired
    private SeparateAiMemoryStore separateAiMemoryStore;

	/**
		会话存储和隔离
	**/
    @Bean
    public ChatMemoryProvider xzChatMemoryProvider() {
        return memoryId -> MessageWindowChatMemory
                .builder()
                .chatMemoryStore(separateAiMemoryStore)
                .maxMessages(20)
                .build();
    }


    @Autowired
    private EmbeddingModel embeddingModel;
	
	/**
		配置RedisEmbeddingStore后,会自动创建RedisEmbeddingStore
	**/
    @Autowired
    private EmbeddingStore embeddingStore;

    @Bean
    public ContentRetriever contentRetriever() {
        // 创建一个EmbeddingStoreContentRetriever用于从向量数据库中检索内容
        return EmbeddingStoreContentRetriever.builder()
                // 指定向量模型
                .embeddingModel(embeddingModel)
                // 使用Redis向量存储
                .embeddingStore(embeddingStore)
                // 指定检索结果的最大数量
                .maxResults(1)
                // 设置最小得分阈值
                .minScore(0.8)
                .build();
    }
}

定义AiService

@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,
        chatModel = "qwenChatModel",
        chatMemory = "xzChatMemory",
        chatMemoryProvider = "xzChatMemoryProvider",
        contentRetriever = "contentRetriever")
public interface RAGAssistant {

    String chat(@MemoryId Long memoryId, @UserMessage String userMessage);
}

Controller实现

    /**
     * 输入需要存入向量数据库的文本
     * @return
     */
    @PostMapping("/inputEmbeddingData")
    @Operation(summary = "输入需要转为向量文本的数据", description = "输入需要转为向量文本的数据")
    public String inputEmbeddingData(String input) {
        inputEmbeddDataService.inputEmbeddingData(input);
        return "success";
    }



    @Autowired
    private RAGAssistant ragAssistant;

    /**
     * 用户输入内容,大模型会去向量数据库中进行相似度匹配
     */
    @PostMapping("/testEmbeddingData")
    public String testEmbeddingData(@RequestBody ChatForm chatForm) {
        return ragAssistant.chat(chatForm.getMemoryId(), chatForm.getMessage());
    }

结果
在这里插入图片描述

在这里插入图片描述

参考

  1. DashScope (通义千问)
  2. LangChain4j中
  3. Redis Vector Store
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐