在大模型应用开发中,一个核心挑战是如何让语言模型'走出'自身的知识边界,与外部系统进行交互。这就是 工具调用(Tool Calling) 的意义所在。
工具调用 是指语言模型根据用户输入判断是否需要调用某个外部 API 或执行某项操作,并生成结构化的调用请求(包含工具名和参数),由客户端应用程序负责执行该调用并将结果返回给模型,最终由模型整合信息并生成自然语言响应。
它主要应用于两大场景:
- 信息检索:从数据库、网络服务、文件系统等外部来源获取实时或私有数据,扩展模型的知识能力。
- 采取行动:触发系统内的具体操作,如发送邮件、设置提醒、创建任务等,实现自动化流程。
本文将结合完整的代码示例,带你深入掌握 Spring AI 中实现工具调用的两种方式 —— 方法作为工具 和 函数作为工具,并通过一个天气查询系统的实战案例,全面解析其工作原理与最佳实践。
虽然我们常说'模型调用了工具',但实际上,模型本身并不执行任何外部逻辑。真正的执行责任在于客户端应用程序。整个过程是一个循环的协作流程:
- 应用程序构建
ChatRequest,并将可用的 工具定义(Tool Definition) 注入其中; - 请求被发送至大模型;
- 模型分析用户意图,若需调用工具,则返回一个结构化指令(含工具名称和参数);
- 客户端接收到响应后,解析出工具调用请求;
- 工具调度器根据工具名称查找对应的工具实现并执行;
- 执行结果被封装并再次发送回模型;
- 模型结合工具返回的结果生成最终的人类可读回复;
- 若模型仍需调用其他工具,则重复上述流程,直到完成所有步骤。
这个过程可能涉及多次往返通信(multi-turn),确保复杂任务的顺利完成。
方法一:使用 @Tool 注解定义工具
Spring AI 支持通过注解的方式将普通 Java 方法转化为可被模型识别的'工具'。
示例:时间与闹钟工具
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.context.i18n.LocaleContextHolder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeTool {
@Tool(description = "Get the current date and time in the user's timezone")
public String getCurrentDateTime() {
System.out.println("Get the current date!");
return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
}
@Tool(description = "Set a user alarm for the given time, provided in ISO-8601 format")
public {
LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);
System.out.println( + alarmTime);
}
}

