【Spring AI】 2.0升级指南二
第三章JDBC Chat Memory——sequence_id3.1sequence_id问题背景在 1.x 中JDBC 聊天记忆的消息顺序依赖于timestamp列。但不同数据库的时间戳精度不同MySQL / MariaDB默认精度为秒级同一秒内保存的多条消息顺序不确定PostgreSQL精度较高但在极端情况下仍可能存在竞态条件解决方案新增sequence_id列整数类型通过递增数字精确控制消息顺序在所有数据库上行为一致。3.2 变更一览升级迁移2.0.0 表结构idconversation_idsequence_id✅ 精确排序timestamp保留作为创建时间content1.x 表结构idconversation_idtimestamp⚠️ 精度问题content3.3 PostgreSQL 迁移 SQL-- 1. 添加新列ALTERTABLESPRING_AI_CHAT_MEMORYADDCOLUMNsequence_idBIGINT;-- 2. 按现有顺序回填数据WITHorderedAS(SELECTctid,ROW_NUMBER()OVER(PARTITIONBYconversation_idORDERBYtimestamp)-1ASseqFROMSPRING_AI_CHAT_MEMORY)UPDATESPRING_AI_CHAT_MEMORY tSETsequence_ido.seqFROMordered oWHEREt.ctido.ctid;-- 3. 设置非空约束ALTERTABLESPRING_AI_CHAT_MEMORYALTERCOLUMNsequence_idSETNOTNULL;-- 4. 创建索引CREATEINDEXSPRING_AI_CHAT_MEMORY_CONVERSATION_ID_SEQUENCE_ID_IDXONSPRING_AI_CHAT_MEMORY(conversation_id,sequence_id);提示不同数据库请调整标识符引用方式和行标识表达式如 PostgreSQL 的ctid。如果聊天记忆只作为短期对话缓存也可以直接删表后用新 schema 重建。第四章Options 不可变性与配置扁平化4.1 Options 类严格不可变设计理念不可变对象更安全、更易于推理尤其是在并发场景下。主要变更ChatOptions、EmbeddingOptions等 Options 类中的所有集合字段如toolCallbacks、stopSequences现在存储为不可修改集合移除了copy()和fromOptions()方法修改 Getter 返回的集合会抛出UnsupportedOperationException迁移方式——使用mutate()// 之前OllamaChatOptionsoptionsoriginalOptions.copy();options.setFoo(...);// 之后OllamaChatOptionsoptionsoriginalOptions.mutate().foo(...).build();4.2 默认值移至 Options 构造函数设计变化默认值不再分散在 Model 实现和 Properties 配置类中而是统一在 Options 构造函数中定义。单一数据源更易维护。迁移方式// 之前ChatOptionsoptionschatModel.getDefaultOptions();// 之后ChatOptionsoptionschatModel.getOptions();4.3 配置属性扁平化移除.options层级所有模型Embedding、Image、Audio、Moderation、OCR 等的配置属性不再使用.options前缀。# 之前 spring.ai.openai.embedding.options.modeltext-embedding-3-small # 之后 spring.ai.openai.embedding.modeltext-embedding-3-smallJava 代码中// 之前Stringmodelproperties.getOptions().getModel();OpenAiEmbeddingOptionsoptionsproperties.getOptions().toOptions();// 之后Stringmodelproperties.getModel();OpenAiEmbeddingOptionsoptionsproperties.toOptions();4.4N()重命名为n()// 之前OpenAiChatOptions.builder().N(1).build();// 之后OpenAiChatOptions.builder().n(1).build();第五章JSON 工具类重构5.1 统一为 JsonHelper在 1.x 中JSON 序列化/反序列化功能分散在多个类中JsonParserModelOptionsUtils部分方法McpJsonParser这种分散导致功能重复维护困难配置不一致5.2 新的统一入口JsonHelper// 默认——使用共享的 JsonMapperJsonHelperjsonHelpernewJsonHelper();// 自定义——注入自己的 JsonMapperJsonMappermyMapperJsonMapper.builder().addModule(newJavaTimeModule()).build();JsonHelpercustomHelpernewJsonHelper(myMapper);5.3 迁移速查表旧方法新方法JsonParser.getJsonMapper()JacksonUtils.getDefaultJsonMapper()JsonParser.fromJson(json, MyType.class)jsonHelper.fromJson(json, MyType.class)JsonParser.toJson(object)jsonHelper.toJson(object)ModelOptionsUtils.jsonToMap(json)jsonHelper.fromJsonToMap(json)ModelOptionsUtils.toJsonString(object)jsonHelper.toJson(object)ModelOptionsUtils.JSON_MAPPERJacksonUtils.getDefaultJsonMapper()McpJsonParser.toMap(object)jsonHelper.convertToMap(object)第六章ChatClient 工具调用行为变更6.1 ToolCallingAdvisor 自动注册新行为ChatClient现在始终自动在顾问链中注册一个ToolCallingAdvisor除非显式禁用。是否ChatClient.prompt是否有工具?自动注册 ToolCallingAdvisor跳过执行顾问链调用模型影响如果您的代码中已经显式添加了ToolCallingAdvisor现在会重复注册两次。迁移方式// 之前——显式注册chatClient.prompt(Whats the weather?).tools(weatherTool).advisors(ToolCallingAdvisor.builder().build()).call().content();// 之后——自动注册无需显式添加chatClient.prompt(Whats the weather?).tools(weatherTool).call().content();// 如需完全手动控制禁用自动注册chatClient.prompt(Whats the weather?).tools(weatherTool).advisors(AdvisorParams.toolCallingAdvisorAutoRegister(false),ToolCallingAdvisor.builder().build()).call().content();6.2 新增标记接口ToolAdvisor 和 MemoryAdvisorDefaultChatClient通过这两个标记接口来智能决策标记接口用途ToolAdvisor表示该 Advisor 负责工具调用生命周期。链中存在此接口实现时跳过自动注册MemoryAdvisor表示该 Advisor 管理记忆。存在时ToolCallingAdvisor自动关闭内部历史管理// 自定义 Advisor 如果拥有工具调用生命周期应实现 ToolAdvisorpublicclassMyCustomToolAdvisorimplementsAdvisor,ToolAdvisor{// ...}6.3 ToolSpec API 移除tools(ConsumerToolSpec)API 已移除上下文信息通过独立的toolContext()方法设置// 之前chatClient.prompt().tools(t-t.callbacks(myCallback).context(tenantId,acme)).call().content();// 之后chatClient.prompt().tools(myCallback).toolContext(Map.of(tenantId,acme)).call().content();6.4 Spring Bean 工具解析器移除背景1.x 支持将普通的Function、Supplier、ConsumerBean 通过toolNames()引用框架在运行时解析。这种方式缺乏类型安全且与 Spring 的 Bean 管理方式不够协调。迁移方式——直接声明ToolCallbackBean// 之前——普通的 Function BeanBeanDescription(Get the weather in location)FunctionWeatherRequest,WeatherResponsecurrentWeather(){returnweatherService::getWeather;}// 之后——显式的 ToolCallback BeanBeanToolCallbackcurrentWeather(){returnFunctionToolCallback.builder(currentWeather,weatherService::getWeather).description(Get the weather in location).inputType(WeatherRequest.class).build();}

相关新闻

ESP8266微信公众号Airkiss配网实战指南

ESP8266微信公众号Airkiss配网实战指南

1. ESP8266与微信公众号Airkiss配网的核心价值在物联网设备开发中,Wi-Fi配网一直是开发者面临的第一个技术门槛。传统的手动输入SSID和密码的方式不仅用户体验差,还存在密码泄露风险。乐鑫科技推出的Airkiss协议通过与微信公众号结合,实现了&…

2026/7/19 14:39:03阅读更多 →
围棋AI智能教练KaTrain:5分钟免费开启专业级围棋训练之旅

围棋AI智能教练KaTrain:5分钟免费开启专业级围棋训练之旅

围棋AI智能教练KaTrain:5分钟免费开启专业级围棋训练之旅 【免费下载链接】katrain Improve your Baduk skills by training with KataGo! 项目地址: https://gitcode.com/gh_mirrors/ka/katrain 还在为找不到合适的围棋对手而烦恼?还在为复盘分析…

2026/7/19 14:39:03阅读更多 →
【VR】结合音频特征的VR: Audio-based Near-Duplicate Video Retrieval with Audio Similarity Learning

【VR】结合音频特征的VR: Audio-based Near-Duplicate Video Retrieval with Audio Similarity Learning

note AuSiL: 视频A → X个2秒音频 embedding;视频B → Y个2秒音频 embedding → 得到 XY 相似度矩阵→ CNN识别矩阵中的连续斜线、偏移、伸缩等时序模式→ Chamfer聚合成最终分数 这个相似度矩阵 CNN才是论文真正的核心(CNN 看相似度矩阵&am…

2026/7/19 14:39:03阅读更多 →
VOL.Framework:企业级低代码平台的技术架构演进与自动化开发实践

VOL.Framework:企业级低代码平台的技术架构演进与自动化开发实践

VOL.Framework:企业级低代码平台的技术架构演进与自动化开发实践 【免费下载链接】Vue.NetCore (已支持sqlsugar).NetCore、.Net6、Vue2、Vue3、Vite、TypeScript、Element plusuniapp前后端分离,全自动生成代码;支持移动端(ios/android/h5/微…

2026/7/19 22:28:51阅读更多 →
[通信与计算]离散时间信号处理:理论、算法与工程实践

[通信与计算]离散时间信号处理:理论、算法与工程实践

离散时间信号处理:理论、算法与工程实践本文面向数字通信、音频、控制和嵌入式DSP领域的学生与工程师,从序列、线性系统、变换和滤波设计出发系统讨论离散时间信号处理。内容包括离散时间信号与序列、卷积与相关、DTFT/DFT/FFT、FIR与IIR滤波器、加窗与谱…

2026/7/19 22:28:51阅读更多 →
解决方案:Cursor Free VIP工具帮你绕过AI编程助手试用限制

解决方案:Cursor Free VIP工具帮你绕过AI编程助手试用限制

解决方案:Cursor Free VIP工具帮你绕过AI编程助手试用限制 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your…

2026/7/19 22:28:51阅读更多 →
电池寿命预测的技术范式转移:BatteryML如何重新定义电池机器学习基础设施

电池寿命预测的技术范式转移:BatteryML如何重新定义电池机器学习基础设施

电池寿命预测的技术范式转移:BatteryML如何重新定义电池机器学习基础设施 【免费下载链接】BatteryML 项目地址: https://gitcode.com/gh_mirrors/ba/BatteryML 在电池技术成为能源转型核心的今天,电池寿命预测已从实验室研究演变为工业级需求。…

2026/7/19 22:28:51阅读更多 →
Kimi K2.5 横评:开源闭源 Swarm

Kimi K2.5 横评:开源闭源 Swarm

Kimi K2.5 横评:开源闭源 Swarm 适用读者:想在自己应用里跑 Kimi / Qwen / GLM / DeepSeek 这些国产大模型 Agent Swarm 的开发者 阅读时长:约 12 分钟 测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档) 一、为什么 2026 年 Q3 突然都在聊 Agent Swarm 2026 年 1 月…

2026/7/19 22:28:51阅读更多 →
IcedCoffeeScript高级技巧:Rendezvous与Pipeliner实现高效并发控制终极指南

IcedCoffeeScript高级技巧:Rendezvous与Pipeliner实现高效并发控制终极指南

IcedCoffeeScript高级技巧:Rendezvous与Pipeliner实现高效并发控制终极指南 【免费下载链接】coffee-script IcedCoffeeScript 项目地址: https://gitcode.com/gh_mirrors/cof/coffee-script IcedCoffeeScript是CoffeeScript的超集,它通过引入awa…

2026/7/19 22:26:51阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →