langchain4j中使用milvus向量数据库做RAG增加索引
安装milvus向量数据库
官方网址 https://milvus.io/zh
使用docker安装milvus
mkdir -p /data/docker/milvus
cd /data/docker/milvus
wget https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh#在docker中启动milvus
sh standalone_embed.sh start
docker ps -a#停止、删除
sh standalone_embed.sh stop
sh standalone_embed.sh delete
浏览器访问
http://192.168.2.205:9091/webui/
在langchain中使用milvus
- 在
pom.xml
中引入依赖
<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-milvus</artifactId><version>${langchain4j.version}</version></dependency>
- 设置配置信息
milvus:host: 192.168.1.131port: 19530langchain4j:community:dashscope:chat-model:api-key: ${dashscope.key}model-name: qwen-maxembedding-model:api-key: ${dashscope.key}model-name: text-embedding-v3streaming-chat-model:api-key: ${dashscope.key}model-name: qwen-plus
- 配置向量库
@Configuration
@Slf4j
public class EmbeddingStoreConfig {@Autowiredprivate EmbeddingModel embeddingModel;@Value("${milvus.host}")private String host;@Value("${milvus.port}")private Integer port;@Beanpublic EmbeddingStore embeddingStore() {log.info("==========开始创建Milvus的Collection");MilvusEmbeddingStore store = MilvusEmbeddingStore.builder().host(host).port(port).collectionName("langchain_01").dimension(1024).indexType(IndexType.FLAT).metricType(MetricType.COSINE)
// .username("username")
// .password("password").consistencyLevel(ConsistencyLevelEnum.EVENTUALLY).autoFlushOnInsert(true).idFieldName("id").textFieldName("text").metadataFieldName("metadata").vectorFieldName("vector").build();log.info("==========创建Milvus的Collection完成");return store;}}
- 使用向量库存储数据
@SpringBootTest
public class EmbeddingTest {@Autowiredprivate EmbeddingModel embeddingModel;@Autowiredprivate EmbeddingStore embeddingStore;@Testpublic void testEmbeddingModel() {Response<Embedding> embed = embeddingModel.embed("你好");System.out.println("向量维度:" + embed.content().vector().length);System.out.println("向量输出:" + embed.toString());}/*** 将文本转换成向量,然后存储到pinecone中* <p>* 参考:* https://docs.langchain4j.dev/tutorials/embedding-stores*/@Testpublic void testPineconeEmbeded() {//将文本转换成向量TextSegment segment1 = TextSegment.from("我喜欢羽毛球");Embedding embedding1 = embeddingModel.embed(segment1).content();//存入向量数据库embeddingStore.add(embedding1, segment1);TextSegment segment2 = TextSegment.from("今天天气很好");Embedding embedding2 = embeddingModel.embed(segment2).content();embeddingStore.add(embedding2, segment2);}/*** 相似度匹配*/@Testpublic void embeddingSearch() {//提问,并将问题转成向量数据Embedding queryEmbedding = embeddingModel.embed("你最喜欢的运动是什么?").content();//创建搜索请求对象EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder().queryEmbedding(queryEmbedding).maxResults(1) //匹配最相似的一条记录//.minScore(0.8).build();//根据搜索请求 searchRequest 在向量存储中进行相似度搜索EmbeddingSearchResult<TextSegment> searchResult =embeddingStore.search(searchRequest);//searchResult.matches():获取搜索结果中的匹配项列表。//.get(0):从匹配项列表中获取第一个匹配项EmbeddingMatch<TextSegment> embeddingMatch = searchResult.matches().get(0);//获取匹配项的相似度得分System.out.println(embeddingMatch.score()); // 0.8144288515898701//返回文本结果System.out.println(embeddingMatch.embedded().text());}@Testpublic void testUploadKnowledgeLibrary() {//使用FileSystemDocumentLoader读取指定目录下的知识库文档//并使用默认的文档解析器对文档进行解析Document document1 = FileSystemDocumentLoader.loadDocument("D:/knowledge/文档1.md");Document document2 = FileSystemDocumentLoader.loadDocument("D:/knowledge/文档2.md");Document document3 = FileSystemDocumentLoader.loadDocument("D:/knowledge/文档3.md");List<Document> documents = Arrays.asList(document1, document2, document3);//文本向量化并存入向量数据库:将每个片段进行向量化,得到一个嵌入向量EmbeddingStoreIngestor.builder().embeddingStore(embeddingStore).embeddingModel(embeddingModel).build().ingest(documents);}
}
- 配置Agent属性
@Configuration
public class AgentConfig {@Autowiredprivate MongoChatMemoryStore mongoChatMemoryStore;@Autowiredprivate EmbeddingStore embeddingStore;@Autowiredprivate EmbeddingModel embeddingModel;@Beanpublic ChatMemoryProvider chatMemoryProviderXiaozhi() {return memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(20).chatMemoryStore(mongoChatMemoryStore).build();}@BeanContentRetriever contentRetriever() {// 创建一个 EmbeddingStoreContentRetriever 对象,用于从嵌入存储中检索内容return EmbeddingStoreContentRetriever.builder()// 设置用于生成嵌入向量的嵌入模型.embeddingModel(embeddingModel)// 指定要使用的嵌入存储.embeddingStore(embeddingStore)// 设置最大检索结果数量,这里表示最多返回 1 条匹配结果.maxResults(1)// 设置最小得分阈值,只有得分大于等于 0.8 的结果才会被返回.minScore(0.8)// 构建最终的 EmbeddingStoreContentRetriever 实例.build();}
}
- 配置AIService
@AiService(wiringMode = EXPLICIT,
// chatModel = "qwenChatModel",streamingChatModel = "qwenStreamingChatModel",chatMemoryProvider = "chatMemoryProviderXiaozhi",tools = "appointmentTools",contentRetriever = "contentRetriever")
public interface Agent {@SystemMessage(fromResource = "zhaozhi-prompt-template.txt")Flux<String> chat(@MemoryId Long memoryId, @UserMessage String userMessage);
}
- Controller类
@RestController
@RequestMapping("/agent")
public class AgentController {@Autowiredprivate Agent agent;@Operation(summary = "对话")@PostMapping(value = "/chat", produces = "text/stream;charset=utf-8")public Flux<String> chat(@RequestBody ChatForm chatForm) {return agent.chat(chatForm.getMemoryId(), chatForm.getMessage());}
}
源码地址:
https://gitee.com/galen.zhang/langchain-ai-demo/java-ai-langchain4j
注意事项
-
pom.xml
文件中的langchain4j-pinecone
与langchain4j-milvus
依赖了不同版本的gRPC,需要注释掉其中一种向量库 -
milvus
默认有速率限制,写向量库会出现错误
2025-05-13T14:34:50.404+08:00 ERROR 26656 --- [java-ai-langchain4j] [ main] i.m.client.AbstractMilvusGrpcClient : FlushRequest failed, error code: 8, reason: request is rejected by grpc RateLimiter middleware, please retry later: rate limit exceeded[rate=0.1]
2025-05-13T14:34:50.405+08:00 ERROR 26656 --- [java-ai-langchain4j] [ main] i.m.client.AbstractMilvusGrpcClient : FlushRequest failed! Exception:{}
io.milvus.exception.ServerException: request is rejected by grpc RateLimiter middleware, please retry later: rate limit exceeded[rate=0.1]
解决方法:
需要修改配置文件 /milvus/configs/milvus.yaml
quotaAndLimits.flushRate.collection.max
默认值是0.1,需要调高一些
quotaAndLimits.flushRate.collection.max = 10
下载配置文件
wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.11/configs/milvus.yaml
修改docker启动配置,挂载外部配置文件
vi standalone_embed.sh
增加一行 -v $(pwd)/milvus.yaml:/milvus/configs/milvus.yaml \
sudo docker run -d \--name milvus-standalone \--security-opt seccomp:unconfined \-e ETCD_USE_EMBED=true \-e ETCD_DATA_DIR=/var/lib/milvus/etcd \-e ETCD_CONFIG_PATH=/milvus/configs/embedEtcd.yaml \-e COMMON_STORAGETYPE=local \-v $(pwd)/milvus.yaml:/milvus/configs/milvus.yaml \-v $(pwd)/volumes/milvus:/var/lib/milvus \-v $(pwd)/embedEtcd.yaml:/milvus/configs/embedEtcd.yaml \-v $(pwd)/user.yaml:/milvus/configs/user.yaml \-p 19530:19530 \-p 9091:9091 \-p 2379:2379 \--health-cmd="curl -f http://localhost:9091/healthz" \--health-interval=30s \--health-start-period=90s \--health-timeout=20s \--health-retries=3 \milvusdb/milvus:v2.5.11 \milvus run standalone 1> /dev/null
删除之前的容器,重新启动
sh standalone_embed.sh stop
sh standalone_embed.sh deletesh standalone_embed.sh start
相关文章:
langchain4j中使用milvus向量数据库做RAG增加索引
安装milvus向量数据库 官方网址 https://milvus.io/zh 使用docker安装milvus mkdir -p /data/docker/milvus cd /data/docker/milvus wget https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh#在docker中启动milvus sh standalone_emb…...
MySQL SQL Mode及其说明
以下是MySQL中所有支持的SQL Mode及其说明,综合了多个来源的信息并进行了分类整理: 一、严格模式相关 STRICT_TRANS_TABLES 对事务型存储引擎(如InnoDB)启用严格数据校验。若插入非法值(如类型不符、超出范围等&#…...
Web前端最新导航
前言 本文列出了很多与前端有关的常见网站、博客、工具等,整体来看比较权威。有些东西已经过时了,我就不列出来了。学是一方面,也是最主要的方面;但还有一个作用,比如,“这个前端框架你都不知道啊”、“这个…...

2025年AI工程师认证深度解析:AAIA认证体系全景指南与实战策略
一、IAAAI认证体系演进与价值定位 1.1 国际人工智能认证发展现状 全球人工智能认证市场呈现显著分化态势。据Gartner 2025Q1报告显示,北美市场以IEEE/ACM双认证体系为主导(市占率38%),欧盟区推行AI Act合规认证(强制…...
CentOS 和 RHEL
CentOS 和 RHEL(Red Hat Enterprise Linux)关系非常紧密,简而言之: CentOS 最初是 RHEL 的免费、开源克隆版,几乎与 RHEL 二进制兼容。 CentOS 原是 RHEL 的“免费双胞胎”,但已被放弃,现在推荐…...
flask开启https服务支持
目录 一、背景 二、开启https支持 三、自签名 1、安装openssl 2、验证安装 3、自签名 四、编写代码 五、访问https接口 一、背景 最近在做自动化业务,需要兼容现在主流的框架开发的前端页面,于是到github找到了几个项目,clone下来项目并…...

统计服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
文章目录 一、背景二、说明三、页面四、代码 前端 MonitorServiceProcessPage.vueMonitorServiceProcessTable.vueMonitorServiceProcessTableButton.vueaddMonitorTask.vueproductOperation.vueshowMonitorTask.vueMonitorSystemLog.vueMonitorTask.vueMonitorTaskLog.vueReal…...
【SGL】Scatter-Gather List内存传输技术
文章目录 1. What is SGL?2. sgl内存传输的原理2.1 核心思想2.2 sgl数据结构2.3 摘链和挂链 3. 零拷贝技术3.1 问题背景3.2 零拷贝的核心思想及实现方式 4. sgl在存储行业的应用 1. What is SGL? sgl(Scatter-Gather List)内存传…...

-MAC桢-
MAC桢和IP的关系: 主机A想跨网络和B通信需要IP地址进行路由选择,但一个局域网,比如路由器进行路由选择之前,首先要将数据包发送给路由器B,也就是局域网通信也就是同一个网段的主机进行通信,所以必须通过mac…...

安装:Kali2025+Docker
安装:Kali2025Docker Kali2025安装 直接官网下载WMware版本 https://www.kali.org/get-kali/#kali-virtual-machines 直接打开运行 初始用户密码 kali/kali sudo -i 命令切换到root 更换镜像 切换到其他可用的 Kali Linux 镜像源可能会解决问题,可以使用国内的镜像源&…...

Linux云计算训练营笔记day04[Rocky Linux中的命令:mv、cp、grep(^$)、tar、重定向>和>>]
mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件,没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录,没有改名 mv /opt/gongli tedu 移动目录,改名了 …...

AbMole Olaparib:打破常规,用PARP抑制重塑肿瘤研究
在当今的生物医学研究领域,Olaparib(AZD2281,AbMole,M1664)作为一种重要的PARP(聚腺苷二磷酸核糖聚合酶)抑制剂,受到了广泛关注。Olaparib可干扰 DNA 单链断裂的修复,从而…...
RPC、gRPC和HTTP的区别
RPC 只是一种屏蔽远程过程调用的设计,它与HTTP不是对立的,两者不是一个层面的概念。 RPC底层通信可以使用TCP实现(如Thrift),也可以使用HTTP实现(如gRPC),其本身并无限制。 1. 概念…...

Windows重置网络,刷新缓存
同时按键盘上的【Windows】键和【S】键,弹出搜索框,输入 命令提示符 在“最佳匹配”下的【命令提示符】上右键,点击【以管理员身份运行】 1弹出一个窗口,在光标闪烁的位置,直接输入【netsh winsock reset】࿰…...
Ref是什么
在 React 中,ref 是一种用于访问 DOM 元素或组件实例的机制。它允许你在组件中直接操作 DOM 元素,或者访问子组件的实例。ref 的使用场景非常广泛,包括表单操作、焦点控制、动画等。以下是关于 ref 的详细讲解以及在项目中的常见使用场景。 …...

OpenHarmony平台驱动开发(十),MMC
OpenHarmony平台驱动开发(十) MMC 概述 功能简介 MMC(MultiMedia Card)即多媒体卡,是一种用于固态非易失性存储的小体积大容量的快闪存储卡。 MMC后续泛指一个接口协定(一种卡式)࿰…...

解决IDEA无法运行git的问题
之前git一直没有问题,今天打开就提示我安装git,自然用git去提交新项目也会遇到问题。 我出现问题的原因是:git路径缺失 文件->设置->git 发现git的路径为空,按照实际位置填写即可...

HTTP 响应状态码总结
一、引言 HTTP 响应状态码是超文本传输协议(HTTP)中服务器对客户端(通常是 Web 浏览器)请求的响应指示。这些状态码是三位数字代码,用于告知客户端请求的结果,包括请求是否成功。响应被分为五个类别&#…...
Java求职面试:Spring Boot与微服务的幽默探讨
Java求职者面试:技术与幽默的碰撞 场景概述 在某互联网大厂的面试现场,面试官严肃认真,程序员则是一个搞笑的水货角色。面试者名叫张伟,年龄28岁,硕士学历,拥有5年的Java开发经验。以下是面试的详细过程。…...
lua脚本+Redission实现分布式锁
实现分布式锁最简单的一种方式:基于Redis 不论是本地锁还是分布式锁,核心都在于“互斥”。 在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNX 即 set if not exists (对应 Java 中的 setIfAbsent 方法),如果 key 不存在的…...
JVM之jcmd命令详解
jcmd 是 Oracle JDK(Java Development Kit)自 JDK 7 起引入的一个强大的诊断工具,用于与正在运行的 JVM(Java Virtual Machine)实例进行交互。它允许用户执行各种诊断命令,比如线程堆栈分析、堆转储、GC 信…...
Go语言:json 作用和语法
在 Go 语言中,JSON 字段(也称为 JSON Tag)是附加在结构体字段上的元数据,用于控制该字段在 JSON 编码(序列化)和解码(反序列化) 时的行为。它的语法是: type StructName…...
Hive HA配置高可用
Hive的高可用性(HA)通过消除关键组件的单点故障来实现,确保系统在部分故障时仍能正常运行。其基本原理涉及以下核心组件和策略: 1. Hive Metastore 的高可用 多实例部署:部署多个Metastore服务实例,每个实例连接到共享的后端数据库(如MySQL、PostgreSQ…...
Ubuntu 第11章 网络管理_常用的网络配置命令
为了管理网络,Linux提供了许多非常有用的网络管理命令。利用这些命令,一方面可以有效地管理网络,另一方面出现网络故障时,可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。 11.2.1 ifconfig命令 关于ifconfig命令&…...

【Qt】Qt 构建系统详解:qmake 入门到项目实战
Qt 构建系统详解:qmake 入门到项目实战 本文将系统介绍 Qt 构建工具 qmake 的用法,并通过一个完整的项目结构示例,帮助你掌握 .pro 文件编写、子项目管理、模块依赖等核心技能。 🧭 一、什么是 qmake? qmake 是 Qt 提…...
Python实例题:pygame开发打飞机游戏
目录 Python实例题 题目 pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本 代码解释 初始化部分: 游戏主循环: 退出部分: 运行思路 注意事项 Python实例题 题目 pygame开发打飞机游戏 pygame-aircraft-game使用 Pygame 开发…...

《Zabbix Proxy分布式监控实战:从安装到配置全解析》
注意:实验所需的zabbix服务器的搭建可参考博客 zabbix 的docker安装_docker安装zabbix-CSDN博客 1.1 实验介绍 1.1.1 实验目的 本实验旨在搭建一个基于Zabbix的监控系统,通过安装和配置Zabbix Proxy、MySQL数据库以及Zabbix Agent,实现分…...

华为配置篇-RSTP/MSTP实验
MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP(快速生成树协议) RSTP(Rapid Spanning Tree Protocol)是 STP 的改进版本,基于 IEEE 802.1w 标准,核心目标是解决传统 STP 收敛速度慢的问…...

git如何将本地 dev 分支与远程 dev 分支同步
要让本地 dev 分支与远程 dev 分支完全同步(丢弃本地多余的提交记录),可以按照以下步骤操作: 1. 获取远程最新状态 git fetch origin dev # 拉取远程 dev 分支的最新提交,但不会修改本地代码 IDEA中点击fetc…...
使用Python和OpenCV实现实时人脸检测与识别
前言 在计算机视觉领域,人脸检测与识别是两个非常重要的任务。人脸检测是指在图像中定位人脸的位置,而人脸识别则是进一步识别出人脸的身份。随着深度学习的发展,这些任务的准确性和效率都有了显著提升。OpenCV是一个开源的计算机视觉库&…...