Tool Use,也叫 Function Calling,就是大模型在需要时调用一个外部函数,拿到结果,再组织语言回答用户。它不是简单的 RAG。RAG 是从知识库找东西,Tool Use 是"动手":查天气、调接口、查数据库、发邮件、改订单状态。

你做了个 Agent,用户问"北京今天天气怎么样?",它回答得头头是道。

但你要知道,它没查天气,它只是根据训练数据瞎编。你要是信了,出门可能被淋成狗。

这就是纯 LLM 的硬伤:会说不代表会干。想让 Agent 从"嘴炮"变成"能动手",必须让它能调用外部工具。

今天聊 Tool Use 模式。

什么是 Tool Use

Tool Use,也叫 Function Calling,就是大模型在需要时调用一个外部函数,拿到结果,再组织语言回答用户。

它不是简单的 RAG。RAG 是从知识库找东西,Tool Use 是"动手":查天气、调接口、查数据库、发邮件、改订单状态。

核心流程就四步:

  1. 用户提出问题。
  2. 模型判断是否需要调用工具。
  3. 调用工具,拿到结构化结果。
  4. 模型根据结果生成最终回答。

判断权交给模型,执行权交给代码。模型负责"想",工具负责"做"。

为什么用 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大模型资料清单的话,在评论区回复「清单」即可;我会根据大家的问题继续补充对应的实战内容。

    Logo

    有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

    更多推荐