SpringAI Alibaba Tool工具调用机制实战-注解注册与函数调用全流程

目录

[一、什么是工具调用(Function Calling / Tool Calling)](#一、什么是工具调用(Function Calling / Tool Calling))

[二、Spring AI 工具调用三步走](#二、Spring AI 工具调用三步走)

[2.1 第一步:定义工具类](#2.1 第一步:定义工具类)

[2.2 第二步:注册工具到ChatClient](#2.2 第二步:注册工具到ChatClient)

[2.3 第三步:直接调用,AI自动决定是否使用工具](#2.3 第三步:直接调用,AI自动决定是否使用工具)

三、工具注册的几种方式

四、注意事项


一、什么是工具调用(Function Calling / Tool Calling)

  • 工具调用是让 AI 大模型能够"调用"外部函数的能力,使 AI 不再局限于生成文本,而是能执行真实操作

  • 简单说,就像给 AI 配了一套"工具箱"------模型自己判断什么时候用哪个工具,用完再把结果告诉用户

  • 典型场景:

    • 用户问"今天北京天气怎么样" → AI 调用天气查询工具 → 返回实时天气

    • 用户说"帮我查询订单123的状态" → AI 调用数据库查询工具 → 返回订单信息

    • 用户说"帮我发一封邮件给张三" → AI 调用邮件发送工具 → 执行发送

二、Spring AI 工具调用三步走

2.1 第一步:定义工具类

java 复制代码
@Component
public class WeatherTool {

    /**
     * @Tool 注解标记这是一个可以被 AI 调用的工具
     * description 是给 AI 看的工具说明,越清晰 AI 越会正确使用
     */
    @Tool(description = "查询指定城市的实时天气信息,包括温度、天气状况、湿度等")
    public String getWeather(
            @ToolParam(description = "城市名称,如:北京、上海、杭州") String city) {
        // 实际业务中调用天气API
        // 这里用模拟数据演示
        return String.format("{\"city\":\"%s\", \"temperature\":\"25°C\", " +
                "\"weather\":\"晴\", \"humidity\":\"60%%\"}", city);
    }

    @Tool(description = "根据订单ID查询订单状态和详细信息")
    public String queryOrder(
            @ToolParam(description = "订单ID,格式为纯数字") String orderId) {
        // 实际业务中查询数据库
        return String.format("{\"orderId\":\"%s\", \"status\":\"已发货\", " +
                "\"createTime\":\"2026-03-21\"}", orderId);
    }
}

2.2 第二步:注册工具到ChatClient

java 复制代码
@Configuration
public class AiConfig {

    @Autowired
    private WeatherTool weatherTool;

    @Bean
    public ChatClient chatClient(ChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem("你是一位智能助手,可以帮助用户查询天气和订单信息")
                // 注册工具:方式一,注册 Bean(推荐)
                .defaultTools(weatherTool)
                .build();
    }
}

2.3 第三步:直接调用,AI自动决定是否使用工具

java 复制代码
@GetMapping("/chat7")
public String chat7(@RequestParam String message) {
    // AI 会根据用户问题自动判断是否调用工具
    return chatClient.prompt()
            .user(message)
            .call()
            .content();
}

三、工具注册的几种方式

java 复制代码
// 方式一:defaultTools 注册对象(推荐,AI自动判断调用时机)
ChatClient.builder(chatModel)
        .defaultTools(weatherTool)
        .build();

// 方式二:运行时动态指定工具(本次请求有效)
chatClient.prompt()
        .user("查一下北京天气")
        .tools(weatherTool)    // 临时注册工具
        .call()
        .content();

// 方式三:通过 ToolCallback 函数式注册
ToolCallback weatherCallback = MethodToolCallback.builder()
        .toolMethod(WeatherTool.class.getMethod("getWeather", String.class))
        .toolObject(weatherTool)
        .build();
ChatClient.builder(chatModel)
        .defaultTools(weatherCallback)
        .build();

四、注意事项

  • @ToolParam 的 description 必须清晰准确,这是 AI 判断"什么时候调用、传什么参数"的依据

  • 工具方法的返回值会被序列化为字符串传给模型,建议返回 JSON 格式字符串,信息更结构化

  • 工具调用涉及多次模型请求(查询+分析),会消耗更多 Token,注意成本控制

  • 高危操作(如删除数据、发送消息)建议在工具内部增加二次确认逻辑或权限校验

相关推荐
lovingsoft18 分钟前
AI 开发的软件质量如何保证?一套可落地的 LLM 应用质量工程体系(QA 视角)
人工智能
小易测试笔记29 分钟前
如何选择适合的半导体静电放电测试设备,易捷测试 Hanwa中国区代理提供哪些支持?
人工智能
益莱储中国30 分钟前
益莱储任命 Vincent Kwa为亚太区副总裁兼总经理
大数据·人工智能
鬼手点金33 分钟前
上下文:Agent 的眼睛
java·前端·人工智能·git·深度学习
具身AGI36 分钟前
一块远程显卡服务一队机器人,瓶颈不在模型
人工智能·机器人
hzxxxz36 分钟前
AI任务分流链路:从3层可验证路由到判断力留痕
人工智能
我有酒两杯38 分钟前
从一条样本看懂 Kev:数据、模型、训练与推理
人工智能·深度学习·机器学习·lora·大语言模型
EterNity_TiMe_40 分钟前
Docker服务越装越多记不住端口?我用Fenrus把NAS里的常用入口整理成一个导航页
运维·人工智能·docker·ai·容器·cpolar
晨间晓1 小时前
图片里的关键点怎么找?用华为云码道开发 OpenCV FAST 特征点检测工具
人工智能·opencv·华为云
科创致远1 小时前
科创致远 ESD 静电监控全景落地指南
人工智能·信息可视化·制造·精益工程