Agent调用工具实战
Tool Use,也叫 Function Calling,就是大模型在需要时调用一个外部函数,拿到结果,再组织语言回答用户。它不是简单的 RAG。RAG 是从知识库找东西,Tool Use 是"动手":查天气、调接口、查数据库、发邮件、改订单状态。
你做了个 Agent,用户问"北京今天天气怎么样?",它回答得头头是道。
但你要知道,它没查天气,它只是根据训练数据瞎编。你要是信了,出门可能被淋成狗。
这就是纯 LLM 的硬伤:会说不代表会干。想让 Agent 从"嘴炮"变成"能动手",必须让它能调用外部工具。
今天聊 Tool Use 模式。
什么是 Tool Use
Tool Use,也叫 Function Calling,就是大模型在需要时调用一个外部函数,拿到结果,再组织语言回答用户。
它不是简单的 RAG。RAG 是从知识库找东西,Tool Use 是"动手":查天气、调接口、查数据库、发邮件、改订单状态。
核心流程就四步:
- 用户提出问题。
- 模型判断是否需要调用工具。
- 调用工具,拿到结构化结果。
- 模型根据结果生成最终回答。
判断权交给模型,执行权交给代码。模型负责"想",工具负责"做"。
为什么用 Spring AI
Spring AI 把工具调用封装得很简单。你只需要:
- 定义一个函数,说明它干什么。
- 把它注册给 ChatClient。
- 模型自己决定什么时候调用。
你不需要手动解析模型输出里的函数名和参数,Spring AI 帮你处理中间那堆麻烦事。
下面我用一个"天气查询"的例子,给你看完整代码。
完整代码
1. 定义请求和响应
public record WeatherRequest(String city) {}
public record WeatherResponse(String city, String condition, int temperature) {}
为什么这样写?模型调用函数时需要参数结构,函数执行后要返回结构化数据。用 Java record 最简洁,Spring AI 能自动序列化。
2. 实现天气工具函数
import java.util.function.Function;
import org.springframework.stereotype.Component;
@Component("weatherFunction")
public class WeatherFunction implements Function<WeatherRequest, WeatherResponse> {
@Override
public WeatherResponse apply(WeatherRequest request) {
// 实际项目这里调用第三方天气 API
// 为了演示,直接返回模拟数据
String condition = "晴";
int temperature = 32;
if (request.city().contains("雨") || request.city().contains("伦敦")) {
condition = "小雨";
temperature = 18;
}
return new WeatherResponse(request.city(), condition, temperature);
}
}
注意:这个函数就是普通 Java 函数。你写业务逻辑、调数据库、调 HTTP 都可以。Spring AI 不关心里面怎么实现,只关心输入输出结构。
3. 配置文件
spring.ai.openai.api-key=sk-你的key
spring.ai.openai.chat.options.model=gpt-4o
4. 让 Agent 调用工具
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/agent")
public class ToolAgentController {
private final ChatClient chatClient;
public ToolAgentController(ChatClient.Builder builder) {
this.chatClient = builder
.defaultFunctions("weatherFunction")
.build();
}
@GetMapping("/weather")
public String weather(@RequestParam String city) {
String answer = chatClient.prompt()
.user(city + "今天天气怎么样?")
.call()
.content();
return answer;
}
}
关键在 defaultFunctions("weatherFunction")。这句话告诉模型:你手里有一个查天气的工具,需要就用。
当你请求 /api/agent/weather?city=北京 时,模型会自己生成函数调用,拿到天气结果,再回答"北京今天晴,32度"。
运行效果
我本地实测了几个问题:
- 问"北京今天天气怎么样?" → 模型调用了 weatherFunction,返回"北京今天晴,32度"。
- 问"北京天气和上海的温差是多少?" → 模型调用了两次工具,一次查北京,一次查上海,然后自己算出差值回答。
- 问"Java 的 HashMap 底层原理是什么?" → 模型没有调用工具,直接用知识回答。
这说明模型能自己判断什么时候该动手,什么时候不需要。
三个常见踩坑
第一,工具描述写得太抽象。Spring AI 会自动用函数名和参数名生成描述,但建议你加 @Description 或 JavaDoc,让模型清楚知道什么场景下调用。
第二,工具太多。一次性塞给模型十几个工具,它会懵。建议按场景分组,只给当前会话可能用到的工具。
第三,不处理工具报错。外部 API 可能超时、可能限流。你要在函数里 catch 异常,返回一个清晰的错误信息,让模型告诉用户"天气服务暂时不可用",而不是直接报错。
什么时候加 Tool Use
Tool Use 不是必需品,但以下场景非常合适:
- 需要实时数据:天气、股价、航班、库存。
- 需要操作业务系统:查订单、改状态、创建任务。
- 需要计算能力:复杂公式、数据聚合、代码执行。
如果用户只是想聊天、翻译、写文章,不用加工具。加了反而增加延迟和复杂度。
我的判断标准:如果回答需要模型不知道的信息,或者需要它动一动外部系统,就上 Tool Use。
商业机会
B 端项目里,Tool Use 是 Agent 从"玩具"变"工具"的关键。
比如做一个企业客服 Agent,只让它聊天,它只能背 FAQ。但给它接入订单查询、物流跟踪、工单创建工具,它就能直接帮用户解决问题。客户感知到的价值完全不一样。
代码层面也很简单,一个 Function Bean + 一行 defaultFunctions 就能让模型拥有新能力。你的 Agent 能做什么,取决于你愿意暴露哪些工具给它。
最后
我们整理出这套 AI 大模型 突围资料包:
✅ 从零到一的 AI 学习路径图
✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
✅ 百度/阿里专家闭门录播课
✅ 大模型当下最新行业报告
✅ 真实大厂面试真题
✅ 2025 最新岗位需求图谱
所有资料 ⚡️ ,朋友们如果有需要 《 AI大模型 入门+进阶学习资源包》,下方扫码获取~

资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。



需要这份AI大模型资料清单的话,在评论区回复「清单」即可;我会根据大家的问题继续补充对应的实战内容。
更多推荐

所有评论(0)