Spring AI与DeepSeek实战四:系统API调用
一、概述
在 AI
应用开发中,工具调用 Tool Calling
是增强大模型能力的核心技术。通过让模型与外部 API
或工具交互,可实现 实时信息检索 (如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能。
Spring AI
作为企业级 AI
开发框架,在 1.0.0.M6
版本中进行了重要升级:废弃 Function Calling
引入 Tool Calling
以更贴合行业术语;本文结合 Spring AI
与大模型,演示如何通过 Tool Calling
实现系统 API
调用,同时处理多轮对话中的会话记忆。
关于 Spring AI 与 DeepSeek 的集成,以及 API-KEY 的申请等内容,可参考文章《Spring AI与DeepSeek实战一:快速打造智能对话应用》
二、函数调用原理
大模型仅负责 决定是否调用工具 和 提供参数,实际执行逻辑由客户端(Spring 应用)实现,确保工具调用的可控性与安全性。
2.1. 工具元数据注入
在发起Chat Request时,将工具描述(name/description)、参数结构(input schema)等元数据封装至请求体,建立大模型的工具调用能力基线。
2.2. 模型决策响应
大模型根据上下文推理生成工具调用指令(tool_calls字段),返回包含选定工具名称及结构化参数的中间响应。
2.3. 服务端路由执行
Spring AI模块解析工具调用指令,通过服务发现机制定位目标工具实例,注入参数并触发同步/异步执行。
2.4. 执行结果标准化
工具返回原始执行结果后,系统进行数据类型校验、异常捕获和JSON序列化处理,生成模型可解析的标准化数据结构。
2.5. 上下文增强推理
将标准化结果作为新增上下文(tool_outputs)回传大模型,触发基于增强上下文的二次推理流程。
2.6. 终端响应生成
模型综合初始请求与工具执行结果,生成最终自然语言响应,完成工具增强的对话闭环。
三、核心代码
3.1. 定义工具
创建类 TestTools
并用 @Tool
注解定义 tool 的描述
public static class TestTools { @Tool(description = "获取今天日期") String getCurrentDateTime() { System.out.println("======getCurrentDateTime"); return LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); } @Tool(description = "获取当前温度") String getCurrentTemperature(MyToolReques toolReques) { System.out.println("======getCurrentTemperature: " + toolReques.localName + "__" + toolReques.date); return toolReques.date + toolReques.localName + "温度为20摄氏度"; } public record MyToolReques(String localName, String date) {} }
这里定义了两个方法,并通过注解的 description 参数告诉大模型方法的用途。
record 类型是 Java17 的新特性,可用于替代传统的 POJO 类。
3.2. 创建对话接口
private ChatMemory chatMemory = new InMemoryChatMemory(); private MessageChatMemoryAdvisor messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory); @GetMapping(value = "/chat") public String chat(@RequestParam String input, String sessionId, HttpServletResponse response) { response.setCharacterEncoding("UTF-8"); return chatClient.prompt().user(input) .tools(new TestTools()) .advisors(messageChatMemoryAdvisor) .advisors(spec -> spec .param(MessageChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId)) .call() .content(); }
- tools 给大模型注册可以调用的方法。
- MessageChatMemoryAdvisor 实现聊天记忆,
InMemoryChatMemory
为SpringAI
自带的实现(基于内存)。 - 可以使用 CHAT_MEMORY_CONVERSATION_ID_KEY 参数指定对话ID,不同的会话ID用于隔离记忆。
3.3. 测试
通过后台打印信息可以看到大模型会自动识别,先调用 getCurrentDate
方法获取今天日期,再调用 getCurrentTemperature
方法获取天气。
======getCurrentDate
======getCurrentTemperature: 广州__2025年04月13日
加一个聊天框,测试多轮对话效果:
第二次会话直接输入 广州 大模型就知道我要问什么了,说明聊天记忆功能已生效。
四、总结
本文以问天气为场景,通过 Tool Calling
实现系统 API
调用,同时实现多轮对话中的会话记忆。需要注意的是 InMemoryChatMemory
只能作为测试使用,在企业应用中需要使用其他实现方式,把聊天记录存储在 Redis
或者 数据库
中,并且需要考虑消息的保存时间、容量、如何清除等问题。
五、完整代码
- Gitee地址:
https://gitee.com/zlt2000/zlt-spring-ai-app
- Github地址:
https://github.com/zlt2000/zlt-spring-ai-app
扫码关注有惊喜!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
AI 有病,得治!
凝视深渊过久,深渊将回以凝视。——尼采 2022 年,全球最大的轻博客网站 Tumblr 上发生了一件挺有意思的事情。 大量的 Tumblr 用户对马丁·斯科塞斯(就是拍《华尔街之狼》的那位)1973 年执导的电影 Goncharov 大加赞赏,称赞这部鲜为人知的电影是有史以来最大的黑手党电影——“ Goncharov 远胜于它的时代,却从未赢得它应有的赞赏。” 随着一张电影海报被翻出,热度一下子冲上网站前五 ,很多人都在 Tumblr 刷屏“求云盘” “带价拿资源”。但其实,马丁·斯科塞斯根本就没有拍过这部电影,人类历史上也没有一部名为 Goncharov 的电影!这意味着,一张挂名“ Martin Scorsese ”的电影海报,几句互联网背后的虚构影评,最终演变成了一场群体欺骗,直至现在还有人坚信这部电影的存在。 心理学将这样的现象称之为“媒体等同”(media equation),人类天生会倾向一些群体性认同事件,换言之,当群体对同一件事情表现出肯定时,个体对事件往往会丢失判断。你或许会说,怎么可能,难道我就没有独立思考吗?来看下面这张图片👇 表面上,这是一个被压废墟的孩子,...
- 下一篇
Bun v1.2.9 发布:内置 Redis 客户端 Bun.redis
Bun v1.2.9 已发布,此版本修复了 48 个 bug,其他变化包括: Bun 现在内置了 Redis 客户端Bun.redis Bun.S3Client中的ListObjectsV2支持 更多的libuv符号 require.extensions兼容性 公告写道,Bun 现在内置了一个速度非常快的 Redis/Valkey 客户端——采用 Zig 从头开始编写。 import { redis, RedisClient } from "bun"; // Reads $REDIS_URL from environment await redis.set("foo", "bar"); const value = await redis.get("foo"); console.log(value); // "bar" await redis.ttl("foo"); // 10 seconds // or use redis.set("foo", "bar", "EX", 10) const custom = new RedisClient("redis:/...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Linux系统CentOS6、CentOS7手动修改IP地址