尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

三、使用Spring AI实现工具调用(Tool Calling)

三、使用Spring AI实现工具调用(Tool Calling)
📅 发布时间:2026/6/20 18:27:53

三、使用Spring AI实现工具调用(Tool Calling)

==================================================================================

==================================================================================

参考资料:

==================================================================================

Spring AI 框架在升级,Function Calling 废弃,被 Tool Calling 取代本文对 Spr - 掘金 (juejin.cn)

Spring AI 工具调用(Tool Calling)实战_java ai 提示词里分析结果后调用tool接口获取具体的值 这个原理是什么-CSDN博客

004-Spring AI 实现 Java Function Callback 功能完整案例-CSDN博客

Migrating from FunctionCallback to ToolCallback API :: Spring AI Reference

==================================================================================

在大模型应用开发中,一个核心挑战是如何让语言模型“走出”自身的知识边界,与外部系统进行交互。这就是 工具调用(Tool Calling) 的意义所在。

工具调用 是指语言模型根据用户输入判断是否需要调用某个外部 API 或执行某项操作,并生成结构化的调用请求(包含工具名和参数),由客户端应用程序负责执行该调用并将结果返回给模型,最终由模型整合信息并生成自然语言响应。

它主要应用于两大场景:

信息检索:从数据库、网络服务、文件系统等外部来源获取实时或私有数据,扩展模型的知识能力。
采取行动:触发系统内的具体操作,如发送邮件、设置提醒、创建任务等,实现自动化流程。

1、使用 @Tool 注解定义工具

Spring AI 支持通过注解的方式将普通 Java 方法转化为可被模型识别的“工具”。

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.context.i18n.LocaleContextHolder;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class LocalDateTimeTool {// 定义一个工具,和普通方法没有什么区别,仅多了一个 @Tool 注解// 注意,description 是工具的描述信息,要编写准确清晰,便于AI准确发现@Tool(description = "获取用户所在时区的当前日期和时间")public String getCurrentDateTime() {System.out.println("->> getCurrentDateTime() 获取用户所在时区的当前日期和时间");return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}@Tool(description = "根据 ISO-8601 格式设置用户在指定时间的闹钟")LocalDateTime setAlarm(String time) {System.out.println("->> setAlarm() 根据 ISO-8601 格式设置用户在指定时间的闹钟, time=" + time);LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);System.out.println("->> 闹钟设置为 " + alarmTime);return alarmTime;}
}

模型会自动提取时间并格式化为 ISO-8601 字符串传入 setAlarm() 方法。

@RestController
public class ToolsController {@Autowiredprivate ChatModel chatModel;@GetMapping("/tools/setAlarm")public String setAlarm(String userInput) {return ChatClient.create(chatModel).prompt()// 设置可用的工具给大模型,让大模型知道有哪些工具可以使用.tools(new LocalDateTimeTool()) // 注册整个类中的 @Tool 方法.user(userInput).call().content();}
}

c9c3e5ea-94c6-459a-85d3-a9babaf739f5

2、使用函数式编程定义工具

示例:天气查询服务

public class WeatherService implements Function<WeatherService.WeatherRequest, WeatherService.WeatherResponse> {public record WeatherRequest(String location, Unit unit) {}public record WeatherResponse(double temp, Unit unit) {}public enum Unit { C, F }@Overridepublic WeatherResponse apply(WeatherRequest request) {System.out.println("获取{" + request.location + "}的天气");double temperature = Math.random() * 50; // 模拟随机温度return new WeatherResponse(temperature, Unit.C);}
}

2.1、手动构建 FunctionToolCallback

适用于灵活注册、动态管理工具场景。

@RestController
public class ToolsController {@Autowiredprivate ChatModel chatModel;@GetMapping("/functions/getWeather")public String getWeather(String userInput) {FunctionToolCallback<WeatherService.WeatherRequest, WeatherService.WeatherResponse> callback =FunctionToolCallback.builder("currentWeather", new WeatherService()).description("Get the weather in location").inputType(WeatherService.WeatherRequest.class).build();return ChatClient.create(chatModel).prompt().toolCallbacks(callback).user(userInput).call().content();}}

92054e4e-f86a-46a8-a956-765ab2c8a838

2.2、通过 @Bean 注册工具

利用 Spring IoC 容器统一管理工具实例,更符合我们的开发习惯。

@Configuration(proxyBeanMethods = false)
public class WeatherTools {public static final String CURRENT_WEATHER_TOOL = "currentWeather";@Bean(CURRENT_WEATHER_TOOL)@Description("Get the weather in location")public Function<WeatherService.WeatherRequest, WeatherService.WeatherResponse> currentWeather() {return new WeatherService();}
}
@RestController
public class ToolsController {@Autowiredprivate ChatModel chatModel;@GetMapping("/beans/getWeather")public String getWeatherBySpring(String userInput) {return ChatClient.create(chatModel).prompt().toolNames(WeatherTools.CURRENT_WEATHER_TOOL) // 仅传入 Bean 名称.user(userInput).call().content();}
}

d11588b3-3cf3-4656-9a1a-e9b76762a49f

3、最佳实践建议

  • 优先使用 @Bean + Function 模式:便于依赖注入、单元测试和统一管理;
  • 务必填写 description:高质量的描述能显著提升模型选择工具的准确性;
  • 合理命名工具和参数:语义清晰有助于模型理解和推理;
  • 避免副作用过重的操作:工具应尽量保持幂等性和安全性;
  • 记录日志便于调试:观察模型是否准确识别了工具调用时机;
  • 考虑错误处理机制:工具执行失败时应有兜底策略。

本文来自博客园,作者:老羅,转载请注明原文链接:https://www.cnblogs.com/laoluo2025/p/19255681

相关新闻

  • 2025年11月国内抛丸机厂家推荐:用户评价整合及选择策略分析
  • 高效安全的文件同步软件哪个好用,让企业数据管理更轻松
  • 2025年11月留学生海外找工作机构推荐:高性价比求职服务解决方案清单

最新新闻

  • 2026 上海黄金市场行情复盘 + 靠谱回收平台盘点 - 奢侈品交易观察员
  • 2026菏泽黄金回收实测指南:六家门店上门评测 - 余生黄金回收
  • 2026 年 6 月帝舵官方售后门店资质实地查验报告 覆盖全国 60 + 正规服务点 - 亨得利腕表服务中心
  • 上海高铁铁路+机场航道居家隔音怎么做?|静华轩隔音窗|隔绝高铁/轨道低频共振、机场低空轰鸣、沿线窗体震动噪音,居家专属隔声定制 - 维小达科技
  • 2026 年 6 月帝舵官方维修网点升级优化通知 新版咨询热线同步对外开放 - 亨得利腕表服务中心
  • 手机号查询QQ号的终极指南:3分钟找回你的QQ账号

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号