Spring AI 集成 Milvus 实战:向量数据库从入门到 RAG 应用
一、先搞懂向量数据库是干什么的想象你去图书馆找书。传统数据库的工作方式像这样的对话你问有没有讲机器学习的书图书馆员只会找书名里带机器学习三个字的书。如果一本书叫《统计学习方法》即使内容全是机器学习他也找不到因为名字不一样。向量数据库就不一样了。它把人话转成一串数字叫向量然后比较这些数字的远近。机器学习和统计学习方法意思相近向量就离得近机器学习和红烧肉意思不相干向量就离得远。所以它能按意思搜索而不是按关键词。Milvus 就是目前最主流的开源向量数据库。Zilliz 公司开发2019 年开源Linux Foundation AI 基金会项目。十亿级数据几十毫秒就能找出最相似的内容。二、Spring AI 集成 Milvus 的整体流程Spring AI 对 Milvus 的支持走的是 VectorStore 接口——和 JDBC 一个思路统一接口切换底层实现不用改业务代码。整体链路是这样的1. Embedding 模型把文档转成向量2. Milvus 存这些向量Collection Index3. 用户提问时同样的 Embedding 模型把问题也转成向量4. Spring AI 调用 Milvus 做相似度搜索返回最相关的文档片段5. 把这些片段拼成 Prompt发给大模型得到最终回答三、实战搭一个 RAG 知识库3.1 引入依赖!-- Spring AI Milvus 向量存储 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-milvus-store/artifactId /dependency !-- Embedding 模型用通义千问 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-dashscope/artifactId /dependency3.2 配置 Milvus 连接spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY} chat: options: model: qwen3 vectorstore: milvus: uri: ${MILVUS_URI:http://localhost:19530} username: ${MILVUS_USERNAME:} password: ${MILVUS_PASSWORD:} database-name: default collection-name: knowledge_base index-type: HNSW metric-type: COSINE embedding-dimension: 768几个配置项的含义index-type索引类型。HNSW 精度高、速度快适合在线检索。如果是超大数据量图省内存可以用 IVF_FLAT。metric-type距离计算方式。文本搜索一般用 COSINE余弦相似度因为不受向量长度影响。embedding-dimension你用的 Embedding 模型输出的向量维度。bge-base-zh 是 768text-embedding-3 是 1536要和模型对齐。3.3 文档入库Spring AI 自动注入了 VectorStore Bean直接注入就能用Service public class KnowledgeService { private final VectorStore vectorStore; public KnowledgeService(VectorStore vectorStore) { this.vectorStore vectorStore; } /** * 把文档存进 Milvus * Spring AI 会自动调用 DashScope Embedding 模型把文本转成向量 */ public void addDocument(String content, String source) { Document doc new Document(content, Map.of(source, source, timestamp, Instant.now().toString())); vectorStore.add(List.of(doc)); } /** * 批量入库 */ Transactional public void batchAdd(ListString contents, String source) { ListDocument docs contents.stream() .map(c - new Document(c, Map.of(source, source))) .collect(Collectors.toList()); vectorStore.add(docs); } }3.4 语义搜索 RAG用户提一个问题先在 Milvus 里找到相关文档再送给大模型生成回答Service public class RagService { private final VectorStore vectorStore; private final ChatClient chatClient; public RagService(VectorStore vectorStore, ChatClient.Builder builder) { this.vectorStore vectorStore; this.chatClient builder.build(); } public String ask(String question) { // 1. 在 Milvus 中找到最相关的 3 个文档片段 ListDocument docs vectorStore .similaritySearch(SearchRequest.query(question) .withTopK(3)); // 2. 把文档片段拼成上下文 String context docs.stream() .map(d - 【 d.getMetadata().get(source) 】 d.getContent()) .collect(Collectors.joining(\n\n)); // 3. 发给大模型生成回答 return chatClient.prompt() .user(u - u.text( 基于以下知识回答问题。 如果知识不够直接说不知道。 知识库内容 {context} 问题{question} ) .param(context, context) .param(question, question)) .call() .content(); } }3.5 加一个 ControllerRestController RequestMapping(/knowledge) public class KnowledgeController { private final KnowledgeService knowledgeService; private final RagService ragService; PostMapping(/add) public Result add(RequestBody AddDocDTO dto) { knowledgeService.addDocument(dto.content(), dto.source()); return Result.success(); } PostMapping(/ask) public Result ask(RequestBody AskDTO dto) { String answer ragService.ask(dto.question()); return Result.success(answer); } }四、Milvus 部署与注意事项部署方式开发测试用 Milvus Standalone一个 docker-compose.yml 搞定# docker-compose.yml version: 3.5 services: etcd: image: quay.io/coreos/etcd:v3.5.16 environment: ETCD_AUTO_COMPACTION_MODE: revision ETCD_AUTO_COMPACTION_RETENTION: 1000 minio: image: minio/minio:RELEASE.2024-11-17T00-39-20Z standalone: image: milvusdb/milvus:v2.5.0 ports: - 19530:19530 # gRPC - 9091:9091 # HTTP depends_on: [etcd, minio]几个坑Embedding 维度要对齐配置文件里的 embedding-dimension 必须和实际使用的模型一致否则存进去搜不出来。索引要显式创建Spring AI 创建 Collection 时不会自动建索引需要先调 createIndex() 或等数据量够了再建。也可以在配置里把 index-type 配好Spring AI 会自动处理。内存规划向量数据在内存中检索最快。HNSW 索引的内存大约是数据量的 1.5-2 倍。如果是 10 亿条 768 维向量大约需要 800GB 内存——这时候就用 DiskANN 或者上 GPU。元数据过滤Milvus 支持标量字段过滤相当于 SQL 的 WHERE 条件对常用过滤字段建标量索引能大幅提升混合检索性能。五、进阶自定义 Embedding 模型如果你的场景需要特定的 Embedding 模型比如中文效果更好的 bge-large-zh-v1.5可以实现 EmbeddingModel 接口Configuration public class MilvusConfig { Bean public VectorStore milvusVectorStore(MilvusServiceClient milvusClient, EmbeddingModel embeddingModel) { return new MilvusVectorStore(milvusClient, embeddingModel, MilvusVectorStoreConfig.builder() .withCollectionName(knowledge_base) .withIndexType(IndexType.HNSW) .withMetricType(MetricType.COSINE) .build()); } }这样就能灵活切换不同的 Embedding 模型不受 starter 自动配置的限制。常见面试题与参考答案1. Milvus 为什么比 ES 更适合向量检索参考答案Elasticsearch 的向量检索插件如 dense_vector本质上还是暴力搜索或简单的 HNSW性能和可扩展性有限。Milvus 从底层就是为向量设计的支持多种 ANN 索引IVF、HNSW、DiskANN、支持 GPU 加速、有专门的调度和分片策略。在十亿级数据上Milvus 的检索速度比 ES 快 2-3 个数量级。但 ES 在全文搜索和日志分析场景仍然不可替代两个数据库通常是配合使用。2. Spring AI 的 VectorStore 接口怎么切换不同的向量数据库参考答案Spring AI 的 VectorStore 是顶层抽象接口定义了 add()、similaritySearch()、delete() 等方法。Milvus、Pinecone、Weaviate、Pgvector 等都有各自的实现类。切换时只需换依赖和配置业务代码不需要改动。比如从 Milvus 切到 Pgvector把 spring-ai-milvus-store 换成 spring-ai-pgvector-store修改 yml 中的连接配置代码里的 VectorStore 注入不用动。3. 向量检索的召回率Recall怎么保证参考答案向量检索本质是近似搜索ANN不是精确搜索所以召回率不可能 100%。影响召回率的关键因素索引类型HNSW 召回率高于 IVF、索引参数HNSW 的 efConstruction 和 ef、IVF 的 nprobe、向量质量Embedding 模型的好坏。提召回率的常用方法提高 ef/nprobe 参数但会降低速度、使用集成多索引投票、或者结合 BM25 关键词搜索做混合检索。

相关新闻

投入百亿美元却半途而废:梳理苹果半世纪发展史、全产品线迭代与造车项目完整脉络

投入百亿美元却半途而废:梳理苹果半世纪发展史、全产品线迭代与造车项目完整脉络

苹果(Apple) 发展史 + 产品演变 + 造车项目始末 完全笔记 说明:关键事实已通过网络搜索核实,市值等实时数据标注了核实时间点, 特别提醒——Tim Cook将于2026年9月1日卸任CEO,由现任硬件工程高级副总裁 John Ternus接任,这是核实笔记时最新出现的重大消息,如果你看到这条…

2026/7/14 17:02:32 阅读更多 →
高压隔离系统设计:ISOM8710与TM4C1294NCZAD应用指南

高压隔离系统设计:ISOM8710与TM4C1294NCZAD应用指南

1. 高压安全隔离系统设计背景在工业控制和电力电子领域,高压安全隔离是保障人员和设备安全的关键技术。我曾参与过一个光伏逆变器项目,当时由于隔离设计不当,导致控制板在雷击测试中损坏,这个教训让我深刻认识到高压隔离的重要性。…

2026/7/14 17:00:30 阅读更多 →
sql语法 日期函数

sql语法 日期函数

TO_DATE,TO_CHAR,STR_TO_DATE, DATE_FORMAT操作OracleMySQL字符串 → 日期TO_DATE(2026-07-14, YYYY-MM-DD)STR_TO_DATE(2026-07-14, %Y-%m-%d)日期 → 字符串TO_CHAR(sysdate, YYYY-MM-DD)DATE_FORMAT(NOW(), %Y-%m-%d)格式符风格YYYY-MM-DD HH24:MI:SS%Y-%m-%d %H:%i:%s TO_D…

2026/7/14 17:00:30 阅读更多 →

最新新闻

为什么局部变量不初始化,VS2013 打印出来的刚好是 -858993460

为什么局部变量不初始化,VS2013 打印出来的刚好是 -858993460

不知道你有没有遇到过这种诡异的事情:在 Visual Studio 2013 里写了一段很简单的 C 语言代码,定义了一个局部变量,结果手快没给它赋初值,直接 printf 打印了出来。 按下 F5 运行的那一秒,控制台没有弹出你期待的 0&am…

2026/7/14 17:50:55 阅读更多 →
ethereum.rb源码解析:深入理解Ruby以太坊客户端实现原理

ethereum.rb源码解析:深入理解Ruby以太坊客户端实现原理

ethereum.rb源码解析:深入理解Ruby以太坊客户端实现原理 【免费下载链接】ethereum.rb Ethereum library for the Ruby language 项目地址: https://gitcode.com/gh_mirrors/et/ethereum.rb 想要在Ruby应用中集成以太坊区块链功能吗?ethereum.rb是…

2026/7/14 17:50:55 阅读更多 →
Ubuntu 系统下制作 USB 启动盘:从 dd 命令到图形化工具的完整指南

Ubuntu 系统下制作 USB 启动盘:从 dd 命令到图形化工具的完整指南

1. 为什么需要USB启动盘? 在Linux系统维护和安装过程中,USB启动盘是最常用的工具之一。相比传统的光盘安装方式,USB启动盘具有速度快、可重复使用、便携性强等优势。特别是对于没有光驱的现代笔记本电脑,USB启动盘几乎是唯一的选择…

2026/7/14 17:48:54 阅读更多 →
Unity场景迁移至Three.js:UnityToThreeExporter问题解决与glTF替代方案

Unity场景迁移至Three.js:UnityToThreeExporter问题解决与glTF替代方案

1. 项目概述与核心价值如果你正在尝试将Unity中精心打磨的3D场景或模型,无缝地迁移到基于WebGL的three.js项目中,那么你很可能已经听说过或者正在使用UnityToThreeExporter这个工具。作为一个在游戏开发和Web3D领域摸爬滚打多年的开发者,我深…

2026/7/14 17:46:54 阅读更多 →
TS2007FC与PIC18LF45K22的音频系统设计与优化

TS2007FC与PIC18LF45K22的音频系统设计与优化

1. 音频放大器系统设计概述在嵌入式音频系统开发中,TS2007FC Class D音频放大器与PIC18LF45K22微控制器的组合堪称黄金搭档。这套方案特别适合需要高保真音频输出的便携式设备、智能家居终端和工业语音提示系统。我曾在一个智能门铃项目中采用这个组合,实…

2026/7/14 17:44:53 阅读更多 →
ComfyUI工作流:Z-Image-Turbo+ControlNet+Krea2实现可控高清图像生成

ComfyUI工作流:Z-Image-Turbo+ControlNet+Krea2实现可控高清图像生成

在 AI 图像生成领域,可控性和高清修复一直是实际项目中的核心需求。单纯依赖基础模型生成图片,往往难以精确控制构图、细节和风格;而直接使用超分工具放大,又容易丢失原始画面的结构和特征。ComfyUI 作为节点式工作流工具&#xf…

2026/7/14 17:42:52 阅读更多 →

日新闻

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:01:13 阅读更多 →
Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

Perplexity vs ChatGPT vs Claude:实测127组复杂查询任务,谁才是真正可靠的“事实型AI助手”?

更多请点击: https://codechina.net 第一章:Perplexity 怎么用 Perplexity 是衡量语言模型预测能力的核心指标,数值越低表示模型对文本序列的不确定性越小、预测越精准。它本质上是交叉熵损失的指数形式,计算公式为:…

2026/7/14 0:01:13 阅读更多 →
全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

全球首发!五一视界定制物理AI卫星ECS-1剑指万亿赛道

五一视界发布公告,近日,公司与环天智慧科技股份有限公司(“环天智慧”)正式达成空天领域战略合作。环天智慧是国内领先、聚焦天基对地观测遥感卫星总体研制与在轨运营的商业航天企业,同时也是西南地区规模最大、具备全自主可控遥感卫星星座建…

2026/7/14 0:03:13 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/14 14:00:13 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻