当前位置: 首页 > news >正文

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());}

结果
在这里插入图片描述

在这里插入图片描述

参考

  1. DashScope (通义千问)
  2. LangChain4j中
  3. Redis Vector Store
http://www.dtcms.com/a/347346.html

相关文章:

  • 设计模式详解
  • 服务器支持IPv6吗?如何让服务器支持IPv6
  • 疏老师-python训练营-Day54Inception网络及其思考
  • 电阻的标称阻值
  • Python中可以使用中文命名变量、函数、类和方法吗?详细示例与解析
  • Java集合(Collection、Map、转换)
  • JavaScript性能优化实战:从瓶颈识别到极致体验
  • 进阶版蛋白互作研究方法:构建 “体内 + 体外 + 结构 + 功能” 多维度论证体系
  • 场景题:有100个球,其中50个红球和50个黑球,要分配到两个袋子中。然后随机选择一个袋子,再从中随机取一个球,目标是使取到红球的概率最大。
  • n8n 键盘快捷键和控制
  • 数据整理自动化 - 让AI成为你的数据助手
  • Java八股文-java基础面试题
  • 叮小跳APP:自动跳过广告,提升使用体验
  • jQuery 知识点复习总览
  • 在 Spring Boot 中配置和使用多个数据源
  • JetPack 与 PyTorch 版本对应及资源详情
  • 【深度学习】蒙特卡罗方法:原理、应用与未来趋势
  • c# .net支持 NativeAOT 或 Trimming 的库是什么原理
  • 【Python】新手入门:为什么需要类型注解?如何使用Mypy进行静态类型检查?复杂类型注解语法是怎么样的?
  • 遇到的数学知识补充
  • 利用zip格式文件的更新功能来对xlsx文件做更改
  • Claude Code赋能企业级开发:外卖平台核心系统的智能化重构
  • LDP标签分发协议
  • 疯狂星期四文案网第48天运营日记
  • 深度学习中主流激活函数的数学原理与PyTorch实现综述
  • Spring AI开发指导-对话模型
  • WiFi有网络但是电脑连不上网是怎么回事?该怎么解决?
  • TDengine IDMP 应用场景:工业锅炉监控
  • 【前端面试题✨】HTML 篇(一)
  • 二叉树的经典算法与应用