AI 技术发展很快,同样 AI 配套的相关技术发展也很快。这不今天刚打开 Spring AI 的官网就发现它又又又又更新了,而这次更新距离上次更新 M7 版本才不过半个月的时间,那这次 Spring AI 给我们带来了哪些惊喜呢?一起来看。

重点升级点

我们先来判断 Spring AI M8 的重点升级点:

  1. 废除了 tools 方法,取而代之的是 toolCallbacks 方法,写法对比如下:

    1. 早期版本:
// Old code in M7 - no longer works correctly in M8
chatClient.prompt("What day is tomorrow?")
.tools(toolCallback)
.call()
.content();
2. 最新版本:
// Updated code for M8
chatClient.prompt("What day is tomorrow?")
.toolCallbacks(toolCallback)
.call()
.content();
  1. 聊天记忆增强功能

    • 改进的 ChatMemory API,实现更灵活的对话历史管理。
    • 新 ChatMemoryRepository 允许不同的存储策略。
    • 添加 MessageWindowChatMemory 用于维护历史消息。
    • 改进属性命名以确保跨实现的一致性。
    • 支持各种存储后端:
      • InMemoryChatMemoryRepository(默认)。
      • JdbcChatMemoryRepository 对于关系数据库持久化支持。
  2. 增强的 MCP 工具回调配置
    • 在 MCP 客户端属性中添加了工具回调配置。
    • 支持 MCP 服务器中的完成规范。
    • 为 MCP 服务器添加了指令支持。
    • 向 WebFlux 和 WebMvc 传输提供程序添加了 SSE 端点参数。
  3. 提示工程文档增强
    • 添加提示工程模式文档。
    • 为开发人员提供有效提示设计的最佳实践。
    • 包括各种用例的示例和模式。
  4. 向量数据库存储功能增强
  • Cosmos DB Entra ID 支持和修复:

    • 为 Cosmos DB 添加了 Azure Entra ID(以前称为 Azure AD)身份验证;
    • 改进 Azure 部署的安全性和身份验证选项。
  • Cassandra 向量存储改进:
    • 修复了 Cassandra 聊天内存中的消息顺序。
    • 添加了更好的错误消息并修复了各种问题。

官方更新日志:https://spring.io/blog/2025/04/30/spring-ai-1-0-0-m8-released

DeepSeek SDK 正式发布

除了以上内容之外,官方的更新日志中没提到的,还有对于 DeepSeek SDK 的正式发布,之前版本中虽然有关于 DeepSeek 的支持,但并不是真正的支持,只是让 DeepSeek 使用 OpenAI 协议实现对 DeepSeek 的调用,而不是真正的 DeepSeek SDK 支持。

那么 OpenAI 协议和真正的 SDK 支持的区别是啥呢?

简单来说,举个简单的例子你就明白了,就是 OpenAI 相当于你上班,因为你自己没车,所以你只能蹭同事的车;而有了 SDK 的支持之后,相当于你有自己的车了,不需要在蹭别人的车了。

也就意味着,DeepSeek 可以和 OpenAI 或其他使用 OpenAI 协议的大模型并存了,之前是二选一,你(DeepSeek)使用了 OpenAI 协议,那么其他人就没办法使用 OpenAI 协议了,现在你有自己的 SDK 了,就可以和其他兼容 OpenAI 或 OpenAI 一起使用了。

DeepSeek 使用变化

DeepSeek SDK 的具体使用如下。

  1. 准备工作:在 DeepSeek 申请 APIKey。
  2. 添加依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-deepseek-spring-boot-starter</artifactId>
</dependency>
  1. 设置配置信息
spring.ai.deepseek.api-key=YOUR_API_KEY
spring.ai.deepseek.chat.options.model=deepseek-chat
spring.ai.deepseek.chat.options.temperature=0.8
  1. 编写调用代码
@RestController
public class ChatController { private final DeepSeekChatModel chatModel; @Autowired
public ChatController(DeepSeekChatModel chatModel) {
this.chatModel = chatModel;
} // 普通输出
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", chatModel.call(message));
} // 流式输出
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
var prompt = new Prompt(new UserMessage(message));
return chatModel.stream(prompt);
}
}

小结

AI 发展速度很快,对各行各业的影响也很大,充分了解和掌握 AI 知识,对日常工作提效或以后跳槽都有很大的帮助,让我们一起行动起来,拥抱这场 AI 盛宴吧。

本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、LangChain4j、Dify、Agent、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。

SpringAI更新:废弃tools方法、正式支持DeepSeek!的更多相关文章

  1. ThinkPHP 更新数据 save方法

    ThinkPHP save() 方法 ThinkPHP 中使用 save() 方法来更新数据库,并且也支持连贯操作的使用. 例子: public function update(){ header(& ...

  2. C# DataTable的Select()方法不支持 != 判断

    异常描述: 用户代码未处理 System.Data.SyntaxErrorException HResult=-2146232032 Message=无法解释位置 23 的标记“!”. Source= ...

  3. [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)

    [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥) nohacks 发表于 2016-5-29 17:12:51 https:// ...

  4. mysql如果数据不存在,则插入新数据,否则更新的实现方法

    mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table('cat_lang')} ( ...

  5. 第三方平台正式支持接入微信公众平台JS-SDK

    之前微信公众平台面向开发者开放微信内网页开发工具包,现在第三方平台也能正式支持接入微信公众平台JS-SDK了,第三方平台可以在获得公众号的授权后,通过JS-SDK帮助公众号开发和实现网页业务. 公众号 ...

  6. Datagrid扩展方法InitEditGrid{支持单元格编辑}

    //-----------------------------------------------------------------/******************************** ...

  7. WPF多线程UI更新——两种方法

    WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  8. [搜片神器]winform程序自己如何更新自己的方法代码

    DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr 国外测试 ...

  9. edis更新的正确方法

    Redis更新的正确方法 https://www.cnblogs.com/westboy/p/8696607.html redis做缓存,怎么更新里面的数据 https://blog.csdn.net ...

  10. 演示Thread.sleep(100)和Thread.currentThread().isInterrupted()+@Deprecated:将方法标注为废弃的方法

    package charpter08; public class TestInterrupt01 { public static void main(String[] args) { Processo ...

随机推荐

  1. [luogu1248] 加工生产调度 题解

    考虑 \(i\) 排在 \(j\) 前的条件是 \(a_i+\max(a_j,b_i)+b_j\le a_j+\max(a_i,b_j)+b_i\),然后发现这一坨东西是皇后游戏中的倒数第三个式子,直 ...

  2. 发那科机器人R2000iC控制柜常见故障类型

    发那科机器人维修R2000iC控制柜常见故障类型 电源故障: 发那科机器人R2000iC控制柜不能正常供电,可能是由于电源线路损坏.保险丝烧断.电源模块故障或电压不稳定等原因造成. 通信故障: 控制柜 ...

  3. 【BUUCTF】Ping Ping Ping

    [BUUCTF]Ping Ping Ping (命令执行绕过总结) 题目来源 收录于:BUUCTF GXYCTF2019 题目描述 提示较为明确,get方法传参127.0.0.1后结果如下 比较容易想 ...

  4. deepseek:封装一个axios

    封装一个包含上传和下载文件功能的 axios 实例,可以提高代码的复用性和可维护性.以下是一个完整的封装示例,支持文件上传.下载.以及常规的 GET/POST 请求. 封装代码 import axio ...

  5. pycharm debug调试【Mute Breakpoints】【Run to Curson】按钮

    1.Debug 调试时,红色妞变为灰色怎么办 Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序.再次点击,断点变为红色,有效.如果只想使某 ...

  6. css3 渐变边框如何实现圆角效果

    常规的 border-image 属性如果直接使用 border-radius 会无效,关于如何实现渐变边框圆角,网上流传着大概这么几种办法: 渐变背景方式(仅适用于纯底色背景) 借助 after 伪 ...

  7. API开放平台网关需要做什么?

    首发于公众号:BiggerBoy 欢迎关注,查看更多技术文章 怎么搭建API开放平台网关? API的全称是应用编程接口(Application Programming Interface),这并不是一 ...

  8. RabbitMQ集群部署(一)——单机模式部署

    本文分享自天翼云开发者社区<RabbitMQ集群部署(一)--单机模式部署>,作者:芋泥麻薯 RabbitMQ是一种开源消息队列系统,是AMQP的标准实现,用erlang语言开发.Rabb ...

  9. MySQL函数-根据子节点查询所有父节点名称

    背景 公司的一个业务系统中有区域表,整个区域是一个树结构,为了方便根据某一父节点查询所有叶子节点,提供了一个额外的字段path,按照分隔符存储了从根节点到当前节点的总路径. 表结构如下: create ...

  10. Docker部署RocketMQ(JDK11)

    说起微服务,不谈容器,不谈云,那还谈个啥?容器中又以Docker最为流行,那么我们今天就来实践下容器化微服务,然后顺带解决下各种疑难杂症. 环境: Idea2019.03/Gradle6.0.1/JD ...