news 2026/7/6 10:43:16

Spring AI 的 RAG 检索结果到底插在了哪里?聊聊 Advisor 链顺序这个隐形坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring AI 的 RAG 检索结果到底插在了哪里?聊聊 Advisor 链顺序这个隐形坑

最近帮一个做企业知识库问答的同事看代码,他遇到一个挺典型的问题:RAG 检索明明命中了正确的文档,相似度也不低,可模型回答的时候完全没用上这些内容,答得跟没接知识库一样。排查了半天,最后发现问题出在 Advisor 的注册顺序上——这是 Spring AI 里一个很容易被忽视,但一旦出问题就很难定位的细节。

先看一下这个真实场景

代码大概是这样写的:

var chatClient = ChatClient.builder(chatModel) .defaultAdvisors( new SimpleLoggerAdvisor(), MessageChatMemoryAdvisor.builder(chatMemory).build(), RetrievalAugmentationAdvisor.builder() .documentRetriever(documentRetriever) .build() ) .build();

三个 Advisor 都注册了,日志能打出来,记忆功能也正常,唯独检索到的文档内容感觉"没生效"。如果你只看代码本身,很难一眼看出问题——三个 Advisor 单独测都没问题,组合起来就是不对。

Advisor 链到底是怎么跑的

Spring AI 官方文档里把这套机制说得很清楚:每个 Advisor 的执行顺序由getOrder()方法决定,数值越小,优先级越高,越先执行。但这里有个反直觉的地方——Advisor 链的工作方式是一个栈结构,最先处理请求的 Advisor,反而是最后处理响应的

换句话说,如果你把 RAG 检索的 Advisor 放在链的最后(order 值最大),它确实会在请求阶段最后被处理——但这恰好是对的位置,因为它需要在"请求即将发往模型之前"把检索到的文档塞进去。如果你把它放在最前面,检索结果反而会被后面的 Advisor(比如负责拼装记忆上下文的 Advisor)覆盖或者忽略掉,因为后面的 Advisor 拿到的请求里,根本没意识到前面已经做了什么修改。

这就是为什么"三个 Advisor 单独测都没问题,放在一起就错"——单独测试时根本不存在顺序冲突的场景。

Spring AI 1.1.x 里默认顺序是怎么设计的

如果你用的是较新版本的 Spring AI,框架已经帮一部分核心 Advisor 规划好了默认顺序,理解这个设计能帮你少踩很多坑。

工具调用相关的ToolCallingAdvisor默认 order 是HIGHEST_PRECEDENCE + 300,确保它在请求阶段尽可能早执行,方便拦截后续工具调用的请求和响应。而内存类 Advisor(MessageChatMemoryAdvisor等)的默认顺序常量DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER在近期版本里被调整为HIGHEST_PRECEDENCE + 200,也就是说记忆相关的处理被放在了工具调用之外,这是官方为了避免内存仓库存储不支持的工具调用消息类型而专门做的调整。

这个细节说明一件事:Advisor 的顺序不是随手填几个数字就行的,它直接决定了"谁先看到原始请求,谁先看到最终响应",进而决定了 RAG 检索内容、对话历史、工具调用结果这几类数据到底以什么先后关系拼进最终的 Prompt。

怎么排查和修正

遇到类似问题,建议按这个思路走:

第一步,先确认 RAG 检索本身有没有问题。用ChatClientResponse拿到执行上下文,检查RetrievalAugmentationAdvisor暴露的DOCUMENT_CONTEXT常量对应的内容,确认文档确实被检索出来了,而不是检索阶段就没命中。

ChatClientResponse response = chatClient.prompt() .user(question) .call() .chatClientResponse(); // 检查检索到的文档是否存在于上下文中 Object retrievedDocs = response.context().get(RetrievalAugmentationAdvisor.DOCUMENT_CONTEXT);

第二步,显式给每个 Advisor 指定 order,而不是依赖注册顺序的隐式排序。多个 Advisor 顺序相同时,执行顺序是不保证的,这一点官方文档专门强调过。

RetrievalAugmentationAdvisor ragAdvisor = RetrievalAugmentationAdvisor.builder() .documentRetriever(documentRetriever) .order(0) // 显式指定,确保检索增强发生在合适的位置 .build(); MessageChatMemoryAdvisor memoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory) .advisorOrder(100) // 大于 RAG advisor,确保记忆拼装在检索之后处理 .build(); var chatClient = ChatClient.builder(chatModel) .defaultAdvisors(new SimpleLoggerAdvisor(), ragAdvisor, memoryAdvisor) .build();

第三步,把SimpleLoggerAdvisor的 order 设置得足够大(接近LOWEST_PRECEDENCE),让它在链的末尾打印日志,这样你看到的日志内容才是真正发给模型之前的最终请求,而不是某个中间状态。

这件事背后的工程化判断

很多人接入 Spring AI 的第一印象是"Advisor 机制很优雅,链式拼装很方便",这个判断没错。但优雅的代价是隐藏了执行细节,多个 Advisor 组合时的数据流向不会主动报错,只会在结果上表现为"不对但不知道哪不对"。

这其实和 Spring MVC 里拦截器链、Filter 链的坑是同一类问题——单个组件测试通过,不代表组合后行为正确。区别在于,AI 应用里这种顺序错误不会抛异常,模型只是"安静地"给出一个看起来正常但信息不准确的回答,排查成本反而更高。

如果你的项目里同时用到了 RAG、记忆、工具调用这几类 Advisor,建议在写代码的时候就把每个 Advisor 的 order 显式写出来,而不要依赖默认值或者注册顺序——具体 API 和默认 order 常量可能会随版本变化,实际项目中应以官方文档为准,但"显式声明顺序、不依赖隐式行为"这个原则不会变。

我把这次排查过程整理成笔记,主要是想提醒一句:Advisor 链看起来是个简单的列表,实际跑起来是一个有方向性的栈,理解这个方向比记住几个 API 名字更重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 23:35:53

从零构建基于Three.js与OpenDRIVE的自动驾驶3D仿真引擎

1. 为什么选择Three.js与OpenDRIVE构建自动驾驶仿真引擎 自动驾驶技术的快速发展对仿真测试提出了更高要求。传统方案如CARLA、LGSVL虽然功能强大,但存在部署复杂、硬件要求高等问题。而基于WebGL的Three.js结合OpenDRIVE标准,能快速构建轻量级、跨平台的…

作者头像 李华
网站建设 2026/7/3 8:03:55

手把手教你离线部署GPT4All:零网络依赖的本地AI助手实战

1. 为什么你需要一个离线AI助手? 想象一下这样的场景:你在飞机上急需查询某个专业概念,但机舱WiFi贵得离谱;或者你在偏远山区做田野调查,手机信号时有时无;又或者你处理敏感数据时,根本不想让任…

作者头像 李华
网站建设 2026/7/3 15:15:58

GIPR靶点深度解析:从肠促胰素受体到多靶点代谢治疗的关键调节器

关键词:GIPR、葡萄糖依赖性促胰岛素多肽受体、肠促胰素、cAMP信号、肥胖、2型糖尿病、替尔泊肽引言葡萄糖依赖性促胰岛素多肽受体(GIPR)是B1类G蛋白偶联受体家族的重要成员,与GLP-1R和GCGR共同构成调控血糖稳态和能量代谢的核心受…

作者头像 李华
网站建设 2026/7/4 4:33:51

计算机毕业设计之大学生防诈科普平台的设计与实现

随着互联网的快速发展,信息技术使各行业日益繁荣。本文探讨了基于JSP的大学生防诈科普平台的设计与实现。该网站旨在为用户提供了一个更便捷、高效的平台,通过简洁明了的界面设计和流畅的用户体验,吸引更多用户。文章首先分析了市场需求和技术…

作者头像 李华
网站建设 2026/7/3 4:34:10

Android Studio中文语言包:打造母语级开发体验的完整指南

Android Studio中文语言包:打造母语级开发体验的完整指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Andro…

作者头像 李华
网站建设 2026/7/3 5:03:53

Windows系统文件api-ms-win-core-path-l1-1-0.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华