LangChain4j中集成Redis向量数据库实现Rag
使用docker安装即可。
·
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());
}
结果

参考
更多推荐
所有评论(0)