Spring AI 系列(三):RAG 开发必知——两种 Advisor 到底怎么选?附完整代码实现
Spring AI 系列三RAG 开发必知——两种 Advisor 到底怎么选附完整代码实现Spring AI 提供了对常见 RAG 流程的开箱支持通过 Advisor API 实现向量数据库存储着AI模型所不知道的数据当用户提问时Advisor 会向向量数据库查询与用户问题相关的文档将检索结果附加到用户文本中然后通过 AI 大模型推理生成最终回答。在 RAG 流程中有两种 AdvisorQuestionAnswerAdvisor 和 RetrievalAugmentationAdvisor。QuestionAnswerAdvisor当用户提出问题时QuestionAnswerAdvisor 会帮助系统从已有的知识库或数据库中检索答案并将其返回给用户其核心目的是将用户的问题与知识库中的答案进行匹配提供答案。QuestionAnswerAdvisor 侧重问答处理通过理解和分析用户的问题找到最合适的答案。RetrievalAugmentationAdvisor当需要从大型数据库或知识库中检索信息时RetrievalAugmentationAdvisor 会在检索请求前后插入增强逻辑。例如在查询过程中RetrievalAugmentationAdvisor 可以自动加入额外的上下文信息如用户的历史查询、偏好、领域知识等以提高检索结果的相关性和准确性。RetrievalAugmentationAdvisor 侧重信息检索通过增强检索条件和上下文信息来优化查询过程。备注Advisor顾问是 Spring AI 中用于增强方法执行逻辑的组件类似于一个拦截器通过 Advisor可以在方法执行前后插入自定义逻辑从而提升代码的可扩展性与灵活性常用于任务增强、数据预处理等场景。使用以上两种Advisor时需要在项目maven pom.xml导入如下依赖!-- QuestionAnswerAdvisor 依赖包--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-advisors-vector-store/artifactId/dependency!-- RetrievalAugmentationAdvisor 依赖包--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-rag/artifactId/dependency下面通过SpringBoot程序演示两种Advisor的使用方式该案例中我们将固定的文档片段存入到Milvus向量库然后通过chatClient 输入问题分别使用两种Advisor进行检索向量库进行回答。1. 创建SpringBoot项目SpringBoot项目命名为SpringAIRAGWithAdvisor设置使用的JDK为17版本。2. 在项目中加入如下Maven依赖?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.5.3/versionrelativePath/!-- lookup parent from repository --/parentgroupIdcom.example/groupIdartifactIdSpringAIRAGWithAdvisor/artifactIdversion0.0.1-SNAPSHOT/versionnameSpringAIRAGWithAdvisor/namedescriptionSpringAIRAGWithAdvisor/descriptionpropertiesjava.version17/java.version/properties!-- 导入 Spring AI BOM用于统一管理 Spring AI 依赖的版本 引用每个 Spring AI 模块时不用再写 version只要依赖什么模块 Mavens 自动使用 BOM 推荐的版本 --dependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion1.0.0-SNAPSHOT/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Deepseek AI 依赖 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-deepseek/artifactId/dependency!-- 智普AI 依赖 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-zhipuai/artifactId/dependency!-- QuestionAnswerAdvisor 依赖包--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-advisors-vector-store/artifactId/dependency!-- RetrievalAugmentationAdviso 依赖包--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-rag/artifactId/dependency!-- Milvus VectorStore 依赖包--dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-vector-store-milvus/artifactId/dependency/dependencies!-- 声明仓库 用于获取 Spring AI 以及相关预发布版本--repositoriesrepositoryidspring-snapshots/idnameSpring Snapshots/nameurlhttps://repo.spring.io/snapshot/urlreleasesenabledfalse/enabled/releases/repositoryrepositorynameCentral Portal Snapshots/nameidcentral-portal-snapshots/idurlhttps://central.sonatype.com/repository/maven-snapshots//urlreleasesenabledfalse/enabled/releasessnapshotsenabledtrue/enabled/snapshots/repository/repositories/project注意在该 pom.xml 中引入了spring-ai-starter-model-zhipuai依赖包用于文档片段转换成向量存入向量库在该 pom.xml 中引入了spring-ai-starter-model-deepseek依赖包用于 chatClient 聊天。在该 pom.xml 中引入了spring-ai-advisors-vector-store和spring-ai-rag依赖包两个依赖包分别为 QuestionAnswerAdvisor 和 RetrievalAugmentationAdvisor 依赖。在该 pom.xml 中引入了spring-ai-starter-vector-store-milvus依赖包该依赖为 Milvus VectorStore 依赖包。3. 配置resources/application.propertiesspring.application.nameSpringAIRAGWithAdvisor server.port8080 ## 使用 智普AI Embedding 模型需要在pom.xml中引入对应依赖 spring.ai.zhipuai.api-keyd...4 spring.ai.zhipuai.base-urlhttps://open.bigmodel.cn/api/paas spring.ai.zhipuai.embedding.options.modelembedding-2 ## 配置 Chat Model:Deepseek的基础URL、密钥和使用模型 spring.ai.deepseek.base-urlhttps://api.deepseek.com spring.ai.deepseek.api-keysk-8...1 spring.ai.deepseek.chat.options.modeldeepseek-chat ## Milvus 配置 spring.ai.vectorstore.milvus.client.hostnode2 spring.ai.vectorstore.milvus.client.port19530 # 默认用户名和密码为 root 和 Milvus spring.ai.vectorstore.milvus.client.tokenroot:Milvus # 要使用的 Milvus 数据库的名称 spring.ai.vectorstore.milvus.database-namedefault # 用于存储 vector 的 Milvus 集合名称 spring.ai.vectorstore.milvus.collection-namevector_store #是否自动初始化 schema如vector_store如果没有会自动创建 spring.ai.vectorstore.milvus.initialize-schematrue # Milvus 集合中要存储的 vector 的维度默认为1536要与所使用的 embedding 模型的维度匹配如DeepSeek、ZhiPuAI 或其他都是1024维 spring.ai.vectorstore.milvus.embedding-dimension10244. 构建两个Rag Advisor和Chat Client在项目中创建config/AIConfig.java 该类标记为Configuration类。类中注入QuestionAnswerAdvisor、RetrievalAugmentationAdvisor以及ChatClient并且每次运行SpringBoot项目时向Milvus中插入指定文档向量数据如果已存在则不重复插入。packagecom.example.springairagwithadvisor.config;importio.milvus.client.MilvusServiceClient;importio.milvus.grpc.GetCollectionStatisticsResponse;importio.milvus.param.R;importio.milvus.param.collection.FlushParam;importio.milvus.param.collection.GetCollectionStatisticsParam;importio.milvus.response.GetCollStatResponseWrapper;importjakarta.annotation.PostConstruct;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;importorg.springframework.ai.deepseek.DeepSeekChatModel;importorg.springframework.ai.document.Document;importorg.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;importorg.springframework.ai.rag.generation.augmentation.ContextualQueryAugmenter;importorg.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;importorg.springframework.ai.vectorstore.SearchRequest;importorg.springframework.ai.vectorstore.VectorStore;importorg.springframework.ai.vectorstore.milvus.MilvusVectorStore;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjava.util.List;ConfigurationpublicclassAIConfig{// 注入 MilvusVectorStore 实例AutowiredprivateMilvusVectorStorevectorStore;// 从配置文件中读取 Milvus 集合名称Value(${spring.ai.vectorstore.milvus.collection-name})privateStringcollectionName;//配置 QuestionAnswerAdvisor用于问答任务BeanpublicQuestionAnswerAdvisorquestionAnswerAdvisor(){returnQuestionAnswerAdvisor.builder(vectorStore)// 配置向量搜索的参数这里设置了相似度阈值为 0.5返回前 6 个结果.searchRequest(SearchRequest.builder().similarityThreshold(0.5d).topK(6).build()).build();}//配置 RetrievalAugmentationAdvisor用于增强检索任务BeanpublicRetrievalAugmentationAdvisorretrievalAugmentationAdvisor(){//VectorStoreDocumentRetriever 负责在向量数据库中根据查询获取最相关的文档//支持根据相似度阈值、top-K返回前K个最相关文档和过滤表达式等方式进行精确检索VectorStoreDocumentRetrieverretrieverVectorStoreDocumentRetriever.builder().vectorStore(vectorStore)// 设置向量存储对象.similarityThreshold(0.5)//设置相似度阈值.topK(6)//设置返回前K个最相关文档.build();//ContextualQueryAugmenter 用于增强查询根据上下文信息生成更具体的查询//支持基于上下文的查询增强例如根据用户输入的上下文信息生成更具体的查询提高检索的准确性和效率ContextualQueryAugmentercqaContextualQueryAugmenter.builder().allowEmptyContext(true)//允许空上下文.build();//返回 RetrievalAugmentationAdvisor 对象用于增强检索任务returnRetrievalAugmentationAdvisor.builder().documentRetriever(retriever)// 设置文档检索器.queryAugmenter(cqa)// 设置查询增强器.build();}//配置 ChatClient初始化聊天客户端BeanpublicChatClientchatClient(DeepSeekChatModelchatModel){returnChatClient.builder(chatModel).defaultSystem(你是一个助手回答用户问题是不要提及回复是从上下文信息中获取的不要回答你不知道的问题如果你不知道答案就回答抱歉我不清楚这个问题。).build();}/** * PostConstruct 注解的方法会在 Spring 容器完成依赖注入后自动调用一次常用于执行初始化逻辑。 */PostConstructpublicvoidinitVectorData(){System.out.println(初始化向量数据写入到 Milvus 数据库中...);// 获取 Milvus 客户端实例MilvusServiceClientclient(MilvusServiceClient)vectorStore.getNativeClient().get();// 获取集合统计信息查询集合的记录数量RGetCollectionStatisticsResponserespclient.getCollectionStatistics(GetCollectionStatisticsParam.newBuilder().withCollectionName(collectionName).build());// 获取实体数量即数据行数longrowCountnewGetCollStatResponseWrapper(resp.getData()).getRowCount();System.out.println(Milvus vector_store 中数据数量rowCount);//如果集合没有数据就写入if(rowCount0){System.out.println(Milvus vector_store 中没有数据写入...);ListDocumentdocsList.of(newDocument(Spring AI 是一个开源 AI 集成项目),newDocument(Milvus 是一款高性能向量数据库),newDocument(DeepSeek 是一个开源大语言模型));//vectorStore.add(docs) 调用时Spring AI 的 MilvusVectorStore 会使用注入的 EmbeddingModel 将每个 Document 中的文本内容转换成向量并写入vectorStore.add(docs);// 获取 Milvus 客户端并手动调用 flush刷新索引确保数据被持久化到 Milvus 数据库中System.out.println(Milvus vector_store 刷新索引...);client.flush(FlushParam.newBuilder().withCollectionNames(List.of(collectionName))// 设置刷新操作的集合名称.build());}}}5. 创建RagController.javapackagecom.example.springairagwithadvisor.controller;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;importorg.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.List;RestControllerRequestMapping(/ai)publicclassRagController{AutowiredprivateChatClientchatClient;AutowiredprivateQuestionAnswerAdvisorqaAdvisor;AutowiredprivateRetrievalAugmentationAdvisorragAdvisor;GetMapping(/chat1)publicStringask1(RequestParamStringmessage){returnchatClient.prompt().user(message)//设置使用 QuestionAnswerAdvisor.advisors(List.of(qaAdvisor)).call().content();}GetMapping(/chat2)publicStringask2(RequestParamStringmessage){returnchatClient.prompt().user(message)//设置使用 RetrievalAugmentationAdvisor.advisors(List.of(ragAdvisor)).call().content();}}6. 启动Milvus在linux node2 节点启动Milvus#进入 milvus目录cd/software/milvus#启动 Milvusdockercompose up-d7. 启动项目并测试启动SpringAiRAGWithAdvisor项目运行主应用类SpringAiragWithAdvisorApplication.java启动该项目。在浏览器中输入如下内容进行测试# http://localhost:8080/ai/chat1?messageMilvus是什么 Milvus是一款高性能向量数据库。 # http://localhost:8080/ai/chat1?message今天天气如何 抱歉我不清楚这个问题。 # http://localhost:8080/ai/chat2?messageSpring AI是什么 Spring AI 是一个开源 AI 集成项目。 # http://localhost:8080/ai/chat2?message今天天气如何 抱歉我不清楚这个问题。

相关新闻

智源Robo:AI智能体如何重塑科研工作流与提升效率

智源Robo:AI智能体如何重塑科研工作流与提升效率

1. 项目概述:当“科研日常”遇上“AI新顶流”最近在科研圈和开发者社区里,一个新名字被频繁提起——智源Robo。它被冠以“新顶流”的称号,口号是“承包你的科研日常”。这听起来像是一个营销噱头,但作为一名长期与代码、数据和论文…

2026/8/2 6:12:50阅读更多 →
【IEEE出版】第八届能源、电力与电网国际学术会议(ICEPG 2026)

【IEEE出版】第八届能源、电力与电网国际学术会议(ICEPG 2026)

第八届能源、电力与电网国际学术会议(ICEPG 2026)将于2026年9月18日至20日在中国广州召开。本次会议旨在汇聚全球学术界、产业界及科研机构的领军专家,共同探讨全球能源转型加速背景下,可再生能源、智能电网系统及电力系统安全稳定…

2026/8/2 6:12:50阅读更多 →
FlagOS实现DeepSeek-V4八款芯片Day0适配:异构AI计算底层技术解析

FlagOS实现DeepSeek-V4八款芯片Day0适配:异构AI计算底层技术解析

1. 项目概述:一次“与时间赛跑”的底层适配攻坚最近在操作系统和AI芯片的圈子里,FlagOS完成DeepSeek-V4在八款不同架构芯片上的Day0适配,绝对算得上是一个标志性事件。简单来说,这就像一场“与时间赛跑”的竞赛:芯片厂…

2026/8/2 6:12:50阅读更多 →
深入解析SIMD指令集:从SSE到AVX的性能优化实战指南

深入解析SIMD指令集:从SSE到AVX的性能优化实战指南

1. 项目概述:为什么我们需要重新审视SIMD指令集?如果你在优化一段图像处理、科学计算或者游戏物理引擎的代码,发现循环里的计算慢得让人难以忍受,那么“SIMD指令集”这个词,大概率会出现在你的搜索列表里。它听起来像是…

2026/8/2 7:23:12阅读更多 →
【Bug已解决】fsdp2 + lora |TypeError: fully_shard() got an unexpected keyword argument ‘ignored_params‘ 解

【Bug已解决】fsdp2 + lora |TypeError: fully_shard() got an unexpected keyword argument ‘ignored_params‘ 解

【Bug已解决】fsdp2 lora |TypeError: fully_shard() got an unexpected keyword argument ignored_params 解决方案 一、现象长什么样 在用 FSDP2 做 LoRA 训练时,想让基座参数被全分片、而 LoRA 的 lora_A / lora_B 参数不被分片(保持每卡…

2026/8/2 7:23:12阅读更多 →
5秒解锁百度网盘资源:智能提取码查询工具完全指南

5秒解锁百度网盘资源:智能提取码查询工具完全指南

5秒解锁百度网盘资源:智能提取码查询工具完全指南 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾为百度网盘加密资源而苦恼?面对心…

2026/8/2 7:23:12阅读更多 →
ESP32物联网开发:ESP-MQTT客户端配置、优化与实战问题解决

ESP32物联网开发:ESP-MQTT客户端配置、优化与实战问题解决

1. 项目概述:为什么ESP32的MQTT客户端是物联网开发的“必修课” 如果你正在用ESP32做物联网项目,无论是智能家居传感器、工业数据采集器还是远程控制设备,那么MQTT协议几乎是你绕不开的一环。而ESP-IDF框架内置的ESP-MQTT组件,就是…

2026/8/2 7:23:12阅读更多 →
Zookeeper在Ubuntu上安装-搭建集群-详细步骤

Zookeeper在Ubuntu上安装-搭建集群-详细步骤

在Ubuntu 20.04.6 LTS上安装zookeeper3.9.5版本一、下载https://archive.apache.org/dist/zookeeper/zookeeper-3.9.5/apache-zookeeper-3.9.5-bin.tar.gz二、解压mkdir /usr/local/zookeepertar -zxvf /opt/software/apache-zookeeper-3.9.5-bin.tar.gz -C /usr/local/zookeep…

2026/8/2 7:23:12阅读更多 →
扬州中央空调维修-欧米到家金牌师傅全城区30分钟火速上门覆盖广陵/邗江/江都/仪征等全域各区 专治不制冷/漏水/异响/跳闸

扬州中央空调维修-欧米到家金牌师傅全城区30分钟火速上门覆盖广陵/邗江/江都/仪征等全域各区 专治不制冷/漏水/异响/跳闸

在扬州,中央空调突发故障是家庭、商铺与写字楼的高频烦心事——中央空调不制冷、内机漏水、外机异响跳闸、开机没反应等问题,往往在盛夏高温时集中爆发。很多用户会搜索“扬州中央空调维修”“扬州附近中央空调上门师傅”“扬州中央空调漏水维修电话”寻…

2026/8/2 7:21:11阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:10阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/2 0:00:12阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/2 0:00:13阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →