【Spring AI】 2.0升级指南一

发布时间:2026/9/11 20:12:14

【Spring AI】 2.0升级指南一 第一章Advisors顾问层重构Advisor 是 Spring AI 中用于在 ChatClient 调用前后插入横切逻辑的组件类似 AOP 中的拦截器。2.0.0 版本对 Advisor 的组织结构和行为进行了重要调整。1.1 模块更名与搬迁变更点原模块/类新模块/类原因spring-ai-advisors-vector-storespring-ai-vector-store-advisor统一命名规范ToolSearchToolCallingAdvisor位于spring-ai-tool-search-tool独立模块spring-ai-tool-search-advisor包路径变更为org.springframework.ai.chat.client.advisor.toolsearch职责分离更清晰的模块边界迁移操作!-- 更新依赖 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-tool-search-advisor/artifactId/dependency// 更新导入语句// 之前importorg.springframework.ai.tool.toolsearch.advisor.ToolSearchToolCallingAdvisor;// 之后importorg.springframework.ai.chat.client.advisor.toolsearch.ToolSearchToolCallingAdvisor;1.2 ToolSearchToolCallingAdvisor 自动配置登场2.0.0 为ToolSearchToolCallingAdvisor提供了全新的 Spring Boot 自动配置和 Starter使其能够自动替换默认的ToolCallingAdvisor实现按需筛选工具定义。工作原理是否用户提问ChatClient是否启用ToolSearchAdvisor?工具索引搜索仅将最相关的工具定义发送给LLM大语言模型发送所有工具定义开启方式# 启用 ToolSearchToolCallingAdvisor spring.ai.chat.client.tool-search-advisor.enabledtrue # 选择索引类型regex默认无需额外依赖、lucene、vector spring.ai.chat.client.tool-search-advisor.tool-index-typeregex索引类型说明类型依赖要求适用场景regex无基于关键词正则匹配轻量快速luceneorg.apache.lucene:lucene-core需要更强大的文本检索能力vectorVectorStoreBean spring-ai-vector-store语义相似度搜索最智能1.3 关键变更Advisor 执行顺序调整背景在一个典型的 AI 对话中ToolCallingAdvisor工具调用顾问和ChatMemoryAdvisor记忆顾问需要协同工作。如果顺序不当可能导致工具调用过程中的中间消息被错误地存入长期记忆。变更内容Advisor.DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER从HIGHEST_PRECEDENCE 1000调整为HIGHEST_PRECEDENCE 200ToolCallingAdvisor的默认顺序为HIGHEST_PRECEDENCE 300执行顺序示意执行优先级ChatMemoryAdvisor优先级: -2147483348ToolCallingAdvisor优先级: -2147483248ChatMemoryAdvisor优先级: -2147483148注数值越小越先执行HIGHEST_PRECEDENCE -2147483648设计意图ToolCallingAdvisor现在默认在内部管理工具调用迭代期间的对话历史而ChatMemoryAdvisor只存储最终的用户/助手对话记录不会将工具调用消息写入ChatMemoryRepository。这是因为大多数存储实现不支持这些特殊消息类型。如果需要记忆工具调用过程例如使用InMemoryChatMemoryRepositoryvartoolCallingAdvisorToolCallingAdvisor.builder().disableInternalConversationHistory()// 关闭内部历史管理.build();varchatMemoryAdvisorMessageChatMemoryAdvisor.builder(chatMemory).advisorOrder(Ordered.HIGHEST_PRECEDENCE400)// 明确指定顺序.build();第二章工具调用Tool Calling机制革新工具调用是让 LLM 能够调用外部函数/API 的核心能力。2.0.0 对此机制进行了深度重构。2.1 移除internalToolExecutionEnabled——为何不再需要手动控制旧模式的问题在 1.x 中您可以通过internalToolExecutionEnabled(false)来退出框架的自动工具执行转而自己控制循环。但这种设计造成了困惑——框架既提供了自动执行又允许部分手动控制职责边界模糊。新设计哲学工具执行的自动/手动控制不再由ChatOptions中的标志位决定而是由是否使用ToolCallingAdvisor来区分手动模式 - 高级用户有工具调用无工具调用ChatModel.call检查 hasToolCallsToolCallingManager手动执行再次调用 ChatModel返回最终结果自动模式 - 推荐ChatClientToolCallingAdvisor自动注册工具自动执行循环由框架管理迁移方式// 之前——在选项中控制ChatOptionsoptionsToolCallingChatOptions.builder().toolCallbacks(ToolCallbacks.from(newMyTools())).internalToolExecutionEnabled(false)// ← 删除这一行.build();// 之后——通过 Advisor 控制// 自动模式什么都不用做ToolCallingAdvisor 自动生效// 手动模式不加 ToolCallingAdvisor自行驱动循环2.2 新增ToolExecutionEligibilityChecker——更灵活的执行条件判断用途决定在何种条件下继续执行工具调用循环。旧的ToolExecutionEligibilityPredicate结合了选项标志位检查和响应检查职责混杂。新的ToolExecutionEligibilityChecker是一个纯粹的函数式接口专注于判断响应是否应该触发下一轮工具调用。自定义检查器示例针对特定 Provider 的 finishReasonToolCallingAdvisoradvisorToolCallingAdvisor.builder().toolExecutionEligibilityChecker(response-response!nullresponse.hasToolCalls()!stop.equals(response.getResult().getMetadata().getFinishReason())).build();Spring Boot 用户可以直接声明一个 Bean自动配置会拾取它BeanToolExecutionEligibilityCheckermyChecker(){returnresponse-response!nullresponse.hasToolCalls();}2.3 新增全局开关spring.ai.chat.client.tool-calling.enabled# 全局禁用自动工具执行工具定义仍会发送给 AI但不会自动执行 spring.ai.chat.client.tool-calling.enabledfalse这与在每个调用上使用AdvisorParams.toolCallingAdvisorAutoRegister(false)效果相同但作用范围是全局的。2.4 移除streamToolCallResponses——修复设计缺陷问题根源当streamToolCallResponsestrue时工具调用请求的中间块会被流式下传但对应的ToolResponseMessage发回给 LLM 的响应却不会被流式下传。如果下游有记忆 Advisor 记录这些块就会收到有请求无响应的不完整历史导致对话记录损坏。修复方式直接移除该选项。如需观测工具调用的每一次迭代请手动控制循环// 禁用自动注册手动驱动循环ChatClientResponseresponsechatClient.prompt().user(question).options(chatOptions).advisors(AdvisorParams.toolCallingAdvisorAutoRegister(false)).call().chatClientResponse();while(response.chatResponse()!nullresponse.chatResponse().hasToolCalls()){// 在这里可以检查或转发工具调用块ToolExecutionResultresulttoolCallingManager.executeToolCalls(prompt,response.chatResponse());// ... 继续循环}
延伸阅读

更多相关文章

2026/9/10 13:16:44

LangChain 接入踩坑记:小团队别卷 Agent,先搞定权限隔离

《我把LangChain接进项目后,先推翻了几个想当然》看起来是个大话题,但真落到项目里,常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值…

2026/9/10 23:07:02

Optimize-Offline镜像压缩:LZMS固态压缩技术详解与性能优化

Optimize-Offline镜像压缩:LZMS固态压缩技术详解与性能优化 【免费下载链接】Optimize-Offline Optimize-Offline is a Windows 10 offline image optimization framework. 项目地址: https://gitcode.com/gh_mirrors/op/Optimize-Offline Optimize-Offline是…

2026/9/11 20:08:29

单片机存储结构详解:主存、地址空间与Flash/SRAM实战分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 20:08:29

拉流失败完整流程:工业园区项目从0到1怎么做

在工业园区智能化升级过程中,园区周界、厂房、仓库、出入口及消防通道等区域广泛部署了视频监控。以“安全带识别任务”为例,往往因为网络隔离、防火墙拦截、NVR多级转发或视频编码不匹配等原因,导致平台频繁出现视频流接入失败。本文将结合工…

2026/9/11 20:08:29

ESC(EtherCAT Slave Controller)从入门到精通(一):初识从站核心

本文面向零基础的嵌入式软件工程师和工业自动化初学者,带你从最基础的概念开始,一步步理解ESC是什么、为什么需要它、以及它是如何工作的。 一、什么是ESC? 1.1 全称与定义 ESC 的全称是 EtherCAT Slave Controller,中文译为 E…

2026/9/11 20:08:29

VS Code highlight-words配置与实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 20:08:29

服务器运维:mysql 安装笔记

# 1. 安装 MySQL Server dnf install -y mysql-server# 2. 启动服务并设置开机自启 systemctl enable --now mysqld# 3. 验证版本与服务状态 mysql --version systemctl status mysqld# 4. 本地免密登录验证 mysql -u root -e "SELECT VERSION();"# 5.(推…

2026/9/11 20:03:28

学术论文AI检测工具评测与降AI率实战指南

1. 项目背景与核心痛点2026年的学术圈正面临一场前所未有的信任危机。去年Nature期刊发布的统计数据显示,全球范围内被标记为"AI生成嫌疑"的论文数量同比激增217%,超过43%的投稿在初审阶段就因AI率超标被直接拒稿。我实验室上个月就有两篇耗时…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码