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

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.xdnf.cn/news/18625.html

相关文章:

  • 2-4.Python 编码基础 - 流程控制(判断语句、循环语句、break 语句与 continue 语句)
  • 【Python】新手入门:Python标准库有哪些常用模块?
  • 容器安全实践(二):实践篇 - 从 `Dockerfile` 到 Pod 的权限深耕
  • 美食菜谱数据集(13943条)收集 | 智能体知识库 | AI大模型训练
  • 自学嵌入式第二十六天:数据结构-哈希表、内核链表
  • 从0开始学习Java+AI知识点总结-23.web实战案例(班级和学生增删改查、信息统计)
  • 【Prometheus】Prometheus监控Docker实战
  • C++编程语言:标准库:第36章——字符串类(Bjarne Stroustrup)
  • 【C语言16天强化训练】从基础入门到进阶:Day 8
  • Krea Video:Krea AI推出的AI视频生成工具
  • 知识蒸馏 Knowledge Distillation 序列的联合概率 分解成 基于历史的条件概率的连乘序列
  • 大模型——深度评测智能体平台Coze Studio
  • 2025-08-23 李沐深度学习19——长短期记忆网络LSTM
  • Kafka Streams vs Apache Flink vs Apache Storm: 实时流处理方案对比与选型建议
  • SpringBootWeb入门
  • Ollama 本地部署 Qwen2.5-7b
  • 搜索--常见面试问题
  • Android 之wifi连接流程
  • 使用 LangChain 和 Neo4j 构建知识图谱
  • 一文学会vue的动态权限控制
  • 00后AI创业者崛起与AI商业应用新玩法:从Mercor到历史人物复刻的机遇
  • 【剖析高并发秒杀】从流量削峰到数据一致性的架构演进与实践
  • MySQL GPG 密钥更新问题解决文档
  • Kubernetes网络服务全解析
  • Linux netfilter工作原理详解
  • Mac简单测试硬盘读写速度
  • 暴雨环境漏检率下降78%!陌讯动态融合算法在道路积水识别的工程突破
  • LeetCode 面试经典 150_数组/字符串_找出字符串中第一个匹配项的下标(23_28_C++_简单)(KMP 算法)
  • PyTorch 面试题及详细答案120题(71-85)-- 高级特性与工具
  • Base64 编码优化 Web 图片加载:异步响应式架构(Java 后端 + 前端全流程实现)