Spring AI工具调用实战
上一节我们搞明白了工具调用是怎么回事。现在的问题是:在Spring AI里,具体怎么把自己的方法变成大模型能调用的工具?
Spring AI给我们提供了两种路子:
- 注解方式:用
@Tool把普通方法变成工具 - 函数式方式:定义一个
Function类型的Bean
两种方式本质上做的是同一件事——告诉Spring AI"这个方法可以被模型调用",只是写法不同。选哪个主要看你的代码组织偏好。
如何选择接入方式
- 新写的工具类 → 用
@Tool注解,更直观 - 复用已有的 Service,不想改动原有代码 → 用
FunctionBean
如果先从整体上看,Spring AI会把这两条接入路径最终收敛到同一条工具调用闭环里:
方式一:用@Tool注解定义工具
先来看最直观的方式。假设我们要实现一个"查询城市当前时间"的功能:
@Component
public class CityTimeTools {
@Tool(description = "查询指定城市的当前本地时间")
public String queryCityTime(
@ToolParam(description = "城市名称,如北京、东京、纽约") String cityName) {
// 模拟根据城市获取时区
Map<String, String> cityTimezones = Map.of(
"北京", "Asia/Shanghai",
"东京", "Asia/Tokyo",
"纽约", "America/New_York",
"伦敦", "Europe/London"
);
String timezone = cityTimezones.getOrDefault(cityName, "Asia/Shanghai");
ZoneId zoneId = ZoneId.of(timezone);
ZonedDateTime now = ZonedDateTime.now(zoneId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return cityName + "当前时间:" + now.format(formatter);
}
}
这段代码有几个关键点:
@Tool注解标记这是一个可被调用的工具,description告诉模型这个工具是干嘛的@ToolParam描述参数的用途,帮助模型理解应该传什么值- 方法本身就是普通的Java代码,返回值会被发送回模型
有了工具类,使用的时候这样写:
@RestController
@RequestMapping("/time")
public class TimeQueryController {
private final ChatClient chatClient;
private final CityTimeTools cityTimeTools;
public TimeQueryController(ChatClient chatClient, CityTimeTools cityTimeTools) {
this.chatClient = chatClient;
this.cityTimeTools = cityTimeTools;
}
@GetMapping("/ask")
public Flux<String> askTime(@RequestParam String question) {
return chatClient.prompt()
.user(question)
.tools(cityTimeTools) // 把工具实例传进去
.stream()
.content();
}
}
调用tools(cityTimeTools)之后,Spring AI会自动扫描这个对象上所有带@Tool注解的方法,生成工具定义发给模型。
@Tool 注解关键点
@Tool:标记可调用工具,description告诉模型工具用途@ToolParam:描述参数含义,帮助模型理解应该传什么值- 方法返回值会被直接发送回模型作为工具执行结果
现在你访问/time/ask?question=东京现在几点了,模型就会识别出需要调用queryCityTime方法,参数是"东京"。
付费内容提示
该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放
加入星球后,你可以获得:
- 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
- 讲解文档:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的详细文档
- 讲解视频:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
- 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
- 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
- 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
- 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
- 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
- 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
