LangChain4j中集成Redis向量数据库实现Rag
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: #设置自己的apikeymodel-name: text-embedding-v4chat-model:model-name: qwen-plus-2025-04-28api-key: #设置自己的apikeyenable_thinking: false #非流式模式时设置为falseredis: #redis向量数据库配置host: 101.43.94.164password:port: 6379index-name: mytestprefix: 'langchain4j:vector:test1:'dimension: 1536
/*** 使用的是阿里的text-embedding-v3向量模型*/@Autowiredprivate EmbeddingModel embeddingModel;/*** 使用的是redis向量数据库*/@Autowiredprivate EmbeddingStore<TextSegment> embeddingStore;/*** redis向量数据库测试*/@Testpublic void test1() {// 将指定的数据向量化,并存入redisTextSegment 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 {@Beanpublic ChatMemory xzChatMemory() {return MessageWindowChatMemory.withMaxMessages(20);}@Autowiredprivate SeparateAiMemoryStore separateAiMemoryStore;/**会话存储和隔离**/@Beanpublic ChatMemoryProvider xzChatMemoryProvider() {return memoryId -> MessageWindowChatMemory.builder().chatMemoryStore(separateAiMemoryStore).maxMessages(20).build();}@Autowiredprivate EmbeddingModel embeddingModel;/**配置RedisEmbeddingStore后,会自动创建RedisEmbeddingStore**/@Autowiredprivate EmbeddingStore embeddingStore;@Beanpublic 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";}@Autowiredprivate RAGAssistant ragAssistant;/*** 用户输入内容,大模型会去向量数据库中进行相似度匹配*/@PostMapping("/testEmbeddingData")public String testEmbeddingData(@RequestBody ChatForm chatForm) {return ragAssistant.chat(chatForm.getMemoryId(), chatForm.getMessage());}
结果
参考
- DashScope (通义千问)
- LangChain4j中
- Redis Vector Store