当前位置: 首页 > article >正文

SpringAI更新:废弃tools方法、正式支持DeepSeek!

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;@Autowiredpublic 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!

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

协议不兼容?Profinet转Modbus TCP网关让恒压供水系统通信0障碍

在现代工业自动化领域中&#xff0c;通信协议扮演着至关重要的角色。ModbusTCP和Profinet是两种广泛使用的工业通信协议&#xff0c;它们各自在不同的应用场合中展现出独特的优势。本文将探讨如何通过开疆智能Profinet转Modbus TCP的网关&#xff0c;在恒压供水系统中实现高效的…...

ChatGPT + DeepSeek 联合润色的 Prompt 模板指令合集,用来润色SCI论文太香了!

对于非英语母语的作者来说,写SCI论文的时候经常会碰到语法错误、表达不够专业、结构不清晰以及术语使用不准确等问题。传统的润色方式要么成本高、效率低,修改过程又耗时又费力。虽然AI工具可以帮助我们来润色论文,但单独用ChatGPT或DeepSeek都会存在内容泛泛、专业性不足的…...

全栈项目搭建指南:Nuxt.js + Node.js + MongoDB

全栈项目搭建指南&#xff1a;Nuxt.js Node.js MongoDB 一、项目概述 我们将构建一个完整的全栈应用&#xff0c;包含&#xff1a; 前端&#xff1a;Nuxt.js (SSR渲染)后端&#xff1a;Node.js (Express/Koa框架)数据库&#xff1a;MongoDB后台管理系统&#xff1a;集成在同…...

RAGFlow Arbitrary Account Takeover Vulnerability

文章目录 RAGFlowVulnerability Description[1]Vulnerability Steps[2]Vulnerability Steps[3]Vulnerability Steps RAGFlow RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine developed by Infiniflow, focused on deep document understanding and d…...

Python 之 Flask 入门学习

安装 Flask 在开始使用 Flask 之前&#xff0c;需要先安装它。可以通过 pip 命令来安装 Flask&#xff1a; pip install Flask创建第一个 Flask 应用 创建一个简单的 Flask 应用&#xff0c;只需要几行代码。以下是一个最基本的 Flask 应用示例&#xff1a; from flask imp…...

微服务,服务粒度多少合适

项目服务化好处 复用性&#xff0c;消除代码拷贝专注性&#xff0c;防止复杂性扩散解耦合&#xff0c;消除公共库耦合高质量&#xff0c;SQL稳定性有保障易扩展&#xff0c;消除数据库解耦合高效率&#xff0c;调用方研发效率提升 微服务拆分实现策略 统一服务层一个子业务一…...

【Ragflow】22.RagflowPlus(v0.3.0):用户会话管理/文件类型拓展/诸多优化更新

概述 在历经三周的阶段性开发后&#xff0c;RagflowPlus顺利完成既定计划&#xff0c;正式发布v0.3.0版本。 开源地址&#xff1a;https://github.com/zstar1003/ragflow-plus 新功能 1. 用户会话管理 在后台管理系统中&#xff0c;新增用户会话管理菜单。在此菜单中&…...

使用PocketFlow构建Web Search Agent

前言 本文介绍的是PocketFlow的cookbook中的pocketflow-agent部分。 回顾一下PocketFlow的核心架构&#xff1a; 每一个节点的架构&#xff1a; 具体介绍可以看上一篇文章&#xff1a; “Pocket Flow&#xff0c;一个仅用 100 行代码实现的 LLM 框架” 实现效果 这个Web S…...

安卓基础(Bitmap)

Bitmap 是 Android 开发中一个非常重要的类&#xff0c;用于表示图像数据。它是一个位图对象&#xff0c;存储了图像的像素信息&#xff0c;可以用于显示、处理和保存图像。Bitmap 提供了丰富的 API&#xff0c;用于操作和处理图像数据。 1. Bitmap 的作用 显示图像&#xff1…...

记录:echarts实现tooltip的某个数据常显和恢复

<template><div class"com-wapper"><div class"func-btns"><el-button type"primary" plain click"showPoint(2023)">固定显示2023年数据</el-button><el-button type"success" plain cli…...

八股文--JVM(1)

⭐️⭐️JVM内存模型 程序计数器&#xff1a;可以看作是当前线程所执行的字节码的行号指示器&#xff0c;用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法&#xff0c;计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOf…...

从RPA项目说说RPC和MQ的使用。

去年我负责一个 RPA&#xff08;机器人流程自动化&#xff09;项目&#xff0c;帮某电商公司搭建订单处理系统。项目里有个场景特别有意思&#xff1a;当用户下单后&#xff0c;系统需要同时触发库存扣减、物流调度、积分发放三个模块。一开始我们想都没想&#xff0c;直接用 R…...

【大模型面试每日一题】Day 21:对比Chain-of-Thought(CoT)与Self-Consistency在复杂推理任务中的优劣

【大模型面试每日一题】Day 21&#xff1a;对比Chain-of-Thought&#xff08;CoT&#xff09;与Self-Consistency在复杂推理任务中的优劣 &#x1f4cc; 题目重现 &#x1f31f; 面试官&#xff1a;我们在数学推理和逻辑推理任务中发现&#xff0c;Self-Consistency方法比传统…...

UUG杭州站 | 团结引擎1.5.0 OpenHarmony新Feature介绍

PPT下载地址&#xff1a;https://u3d.sharepoint.cn/:b:/s/UnityChinaResources/EaZmiWfAAdFFmuyd6c-7_3ABhvZoaM69g4Uo2RrSzT3tZQ?e2h7RaL 在2025年4月12日的Unity User Group杭州站中&#xff0c;Unity中国OpenHarmony技术负责人刘伟贤带来演讲《团结引擎1.5.0 OpenHarmony新…...

Vue3——父子组件通信

在Vue开发中&#xff0c;组件通信是核心概念之一。良好的组件通信机制能让我们的应用更加清晰、可维护。 父传子defineProps defineProps是一个编译时宏&#xff0c;仅在内部可用&#xff0c;不需要显式导入。声明的 props 会自动暴露给模板。 还返回一个对象&#xff0c;其中…...

游戏引擎学习第276天:调整身体动画

运行游戏&#xff0c;演示我们遇到的拉伸问题&#xff0c;看起来不太好&#xff0c;并考虑切换到更顶视角的视角 我们开始讨论游戏开发中的一些美学决策&#xff0c;特别是在处理动画方面。虽然我们是游戏程序员&#xff0c;通常不负责设计或艺术部分&#xff0c;但因为这是一…...

从开发者角度看数据库架构进化史:JDBC - 中间件 - TiDB

作者&#xff1a; Lucien-卢西恩 原文来源&#xff1a; https://tidb.net/blog/e7034d1b Java 应用开发技术发展历程 在业务开发早期&#xff0c;用 Java 借助 JDBC 进行数据库操作&#xff0c;虽能实现基本交互&#xff0c;但需手动管理连接、编写大量 SQL 及处理结果集&a…...

Mipsel固件Fuzzing小记

Mipsel固件Fuzzing小记 0x01 准备 1.1 安装必要工具链 首先需要安装 MIPS 交叉编译工具链和相关依赖&#xff1a; sudo apt-get install -y gcc-mipsel-linux-gnu g-mipsel-linux-gnu binwalk qemu-user-static afl这些工具分别用于&#xff1a;交叉编译、固件解包、二进制…...

本土DevOps革命:Gitee如何撬动中国企业的数字化转型新动能

在数字化浪潮席卷全球的背景下&#xff0c;中国企业正面临前所未有的转型压力与机遇。随着《数据安全法》和《个人信息保护法》的全面实施&#xff0c;以及信创产业政策的深入推进&#xff0c;研发工具链的自主可控已成为关乎企业核心竞争力的战略命题。在这一关键赛道上&#…...

关于此站点更改通知.top域名后期将统一更换为snowytime.cn访问,其余top访问进入过渡期

随着互联网技术的不断发展和域名应用的日益普及&#xff0c;为了更好地满足用户需求&#xff0c;提升网站访问体验&#xff0c;我们决定对现有的.top域名进行一次重大调整。自2025年6月1日起&#xff0c;.top域名后期将统一更换为snowytime.cn访问&#xff0c;其余top访问将暂时…...

使用python进行人员轨迹跟踪

一、系统概述 该系统基于计算机视觉技术&#xff0c;实现对视频或摄像头画面中的人员进行检测、跟踪&#xff0c;并生成轨迹数据。支持透视变换校准&#xff08;鸟瞰图显示&#xff09;、多目标跟踪、轨迹存储及视频录制功能&#xff0c;适用于安防监控、行为分析等场景。 二…...

强化学习入门:马尔科夫奖励过程二

文章目录 前言1、动作2、策略总结 前言 最近想开一个关于强化学习专栏&#xff0c;因为DeepSeek-R1很火&#xff0c;但本人对于LLM连门都没入。因此&#xff0c;只是记录一些类似的读书笔记&#xff0c;内容不深&#xff0c;大多数只是一些概念的东西&#xff0c;数学公式也不会…...

JVM 双亲委派机制

一、从 JDK 到 JVM&#xff1a;Java 运行环境的基石 在 Java 开发领域&#xff0c;JDK&#xff08;Java Development Kit&#xff09;是开发者的核心工具包。它不仅包含了编译 Java 代码的工具&#xff08;如 javac&#xff09;&#xff0c;还内置了 JRE&#xff08;Java Run…...

uniapp -- uCharts 仪表盘刻度显示 0.9999999 这样的值问题处理。

文章目录 🍉问题🍉解决方案🍉问题 在仪表盘上,23.8变成了 23.799999999999997 🍉解决方案 formatter格式化问题 1:在 config-ucharts.js 或 config-echarts.js 配置对应的 formatter 方法 formatter: {yAxisDemo1: function (...

BGP团体属性

团体属性&#xff1a; 1、用于限制BGP路由的传递范围 2、类似于IGP协议中的tag值&#xff0c;用于对BGP路由实现标记。 团体属性的分类&#xff1a; 1、公共团体属性&#xff1a; Internet&#xff1a;默认所有路由都有该属性&#xff0c;具有该属性BGP路由发送给所有的BGP邻居…...

Redis——三大策略

过期删除策略 Redis可以对key设置过期时间&#xff0c;因此需要有相应的机制将已过期的键值对删除 设置了过期时间的key会存放在过期字典中&#xff0c;可以用presist命令取消key过期时间 过期字典存储在redisDb结构中&#xff1a; typedef struct redisDb {dict *dict; …...

Windows 操作系统使用 Tcping 命令检查目标主机端口是否开放

检查目标主机端口是否开放的方法已经很多了&#xff0c;网络上也有第三方网页版的检查工具&#xff0c;这篇文章给大家介绍一个实用小工具 Tcping 。 一、下载安装 Tcping 命令 Tcping 非 Windows 自带命令&#xff0c;我们需要下载 Tcping 可执行文件&#xff0c;然后将该文…...

序列化和反序列化:从理论到实践的全方位指南

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…...

PDF Base64格式字符串转换为PDF文件临时文件

需求描述&#xff1a; 在对接电子病历系统与河北CA&#xff0c;进行免密文件签章的时候&#xff0c;两者系统入参不同&#xff0c;前者是pdf文件&#xff0c;base64格式&#xff1b;后者要求File类型的PDF文件。 在业务中间层开发时&#xff0c;则需要接收EMR侧提供的base64格式…...