Spring AI 2.0 开发Java Agent智能体 - 工具调用(Function Calling / Tools)

大家好,我是Java1234_小锋老师,最近更新《2027版本 Spring AI 2.0 开发Java Agent智能体 视频教程》专辑,感谢大家支持。

本课程主要介绍和讲解Spring AI 2.0简介,Spring AI 2.0 HelloWorld搭建,Advisors --- 拦截器模式增强AI能力,对话与提示词工程(Prompt),工具调用 (Function Calling / Tools) ,RAG(检索增强生成),MCP(模型 上下文协议)和多模态支持。

等这个Spring AI2.0基础课程录制完成,接下来要发布2个 企业级Java AI实战课程,RAG 企业知识库系统和AI智能客服系统。大家可以点点关注,后面更精彩。

视频教程+课件+源码打包下载:

链接:https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd=1234

提取码:0000

Spring AI 2.0 开发Java Agent智能体 - 工具调用(Function Calling / Tools)

一、什么是工具调用

工具调用(Tool Calling,又称 Function Calling)是 Spring AI 2.0 的核心能力之一,它让 LLM 能够调用你在 Java 后端中定义的函数,从而打通了 AI 与外部系统的连接。简单来说,就是让大模型不仅能"聊天",还能真正"做事"------比如查询数据库、调用 API、执行业务逻辑等。

在 Spring AI 2.0 中,工具调用已与 Java 方法签名全面打通,只需用 @Tool 注解标记一个 Java 方法,AI 就能像调用本地函数一样调用它。

在没有工具调用的情况下,AI 模型只能基于其训练数据回答问题,无法获取实时信息或执行操作。例如,当你问"现在几点了?"时,模型会回答:"我无法获取实时信息,请告诉我当前日期。"而有了工具调用,模型可以自动调用你提供的 getCurrentDateTime() 方法,精准地返回当前时间。

我们可以先测试下,浏览器输入:http://localhost:8080/ai?question=现在是几点了?

二、核心工作原理

工具调用的核心流程可以概括为四个步骤:

  1. 定义工具 :在 Java 代码中定义一个方法,并用 @Tool(description = "xxx") 注解标明其功能描述。

  2. 注册工具 :将工具类实例注册到 ChatClient 中,Spring AI 会自动将其转换为 AI 模型可识别的 JSON Schema。

  3. 模型决策:当 LLM 判断需要调用工具时,会在响应中生成 JSON 格式的调用指令(包含函数名和参数),而非直接输出最终答案。

  4. 执行与应答:Spring AI 将 JSON 指令转换为实际的方法调用,并将结果返回给模型,模型再基于这些"实时数据"生成最终的自然语言回答。

重要提醒 :请务必注意,模型本身从不直接执行任何代码。它只是根据用户问题和定义的工具,以 JSON 格式"请求"你执行这个工具。真正的执行权 100% 掌握在你的 Java 应用中,这是一个关键的安全设计。

三、快速入门实例:让 AI 学会"看时间"

下面通过一个完整的代码示例,展示如何让 AI 获取当前日期和时间。本实例基于 Spring AI 2.0 推荐的 @Tool 注解方式。

复制代码
package com.java1234.tool;
​
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
​
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
​
@Component
public class DateTimeTools {
​
    @Tool(description = "获取用户在指定时区的当前日期和时间,用于回答需要实时时间的问题")
    public String getCurrentTime(){
        // 获取用户的时区偏好设置
        var zoneId = LocaleContextHolder.getTimeZone().toZoneId();
        var now = LocalDateTime.now().atZone(zoneId);
        // 格式化为 yyyy-MM-dd HH:mm:ss
        return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(now);
    }
​
}

对比说明:两种常见的工具定义方式:

  • @Tool 注解(推荐) :代码最简洁,只需在方法上添加 @Tool 注解即可。这是 Spring AI 2.0 主推的新 API,也是本实例采用的方式。

  • FunctionCallback 方式(旧版) :在 Spring AI 1.x 中需要实现复杂的 Function 接口,代码量较大。此 API 已被标记为过时(deprecated),建议在新项目中使用 @Tool 注解的方式。

MyAiChatController控制器里,在调用 ChatClient 时,通过 .tools() 方法将定义好的工具注册进去。

复制代码
  @Autowired
    private DateTimeTools dateTimeTools ;
 
    @RequestMapping("/aitool")
    public String aitool(String question) {
        return chatClient.prompt() // 创建一个 Prompt 对象,用于构建聊天请求。
                .user( question) // 设置用户输入的文本。
                .tools(dateTimeTools) // 注册工具
                .call() // 调用 ChatClient 对象的 call() 方法,发送聊天请求给大模型并获取响应。
                .content(); // 获取响应的文本内容。
    }

我们再测试下,浏览器输入:http://localhost:8080/aitool?question=现在是几点了?

通过对比可以清晰地看出:注册工具后,AI 自动识别需求并调用了 getCurrentDateTime 方法,从而提供了精准的实时信息

四、进阶实践:让 AI 执行操作

工具调用不仅能获取信息,还能让 AI 执行具体操作。以下示例展示了如何实现闹钟设置功能

在工具类DateTimeTools中添加操作型工具

复制代码
@Tool(description = "设置闹钟,调用此工具可在指定时间触发提醒。时间参数必须是 ISO-8601 格式,例如:2026-05-03 15:30:00")
    public void setAlarm(@ToolParam(description = "闹钟的触发时间,标准格式:yyyy-MM-dd HH:mm:ss") String alarmTime) {
        System.out.println("⏰ 闹钟已设置,将在 " + alarmTime + " 提醒用户。");
        // 此处可扩展实际逻辑:如存入数据库、发送推送通知等
    }

现在向 AI 提问:"帮我设置一个 1分钟后的闹钟。"

带工具注册的调用会自动触发如下流程:

  1. AI 模型首先调用 getCurrentDateTime 获取当前时间。

  2. 模型计算出 10 分钟后对应的时间点。

  3. 模型调用 setAlarm 工具,传入计算出的具体时间。

  4. 控制台输出闹钟设置成功的提示。

这正是 Agent 模式的雏形:模型负责理解意图、拆解任务、规划步骤,你只需提供对应的工具方法,AI 就能自动编排执行

五,工具调用底层实现原理

Spring AI 通过一组灵活的抽象支持工具调用,使您能够以一致的方式定义、解析和执行工具。本节概述了 Spring AI 中工具调用的主要概念和组件。

  1. 当我们希望将某个工具提供给模型使用时,会将其定义包含在聊天请求中。每个工具定义包括名称、描述以及输入参数的模式。

  2. 当模型决定调用工具时,它会发送一条包含工具名称和按照定义的模式建模的输入参数的响应。

  3. 应用程序负责使用工具名称来识别并执行带有所提供输入参数的工具。

  4. 应用程序会处理工具调用的结果。

  5. 应用程序将工具调用结果发送回模型。

  6. 模型使用工具调用结果作为额外上下文,生成最终响应。

工具是工具调用的构建模块,它们由ToolCallback接口进行建模。Spring AI 提供了内置支持,可从方法和函数中指定ToolCallback(s),但您也可以随时定义自己的ToolCallback实现,以支持更多用例。

ChatModel实现会透明地将工具调用请求分发到相应的ToolCallback实现,并将工具调用结果返回给模型,最终由模型生成最终响应。它们通过ToolCallingManager接口来完成这一过程,该接口负责管理工具执行的生命周期。

相关推荐
JavaGuide1 小时前
万字详解 Harness Engineering:六层架构、上下文管理与一线团队实战
人工智能·ai编程
Cosmoshhhyyy1 小时前
《Effective Java》解读第 52 条:慎用重载
java·开发语言·windows
大大杰哥1 小时前
温故知新:Java 线程创建方式的演进与总结
java·开发语言·jvm
nix.gnehc1 小时前
AI Agent 设计范式的演进之路:从工具调用到多智能体协作
人工智能·agent
凯瑟琳.奥古斯特1 小时前
死锁四大必要条件解析
java·开发语言·后端·职场和发展
冰的第三次元1 小时前
接口,抽象的避坑指南和多态的“两面派”真相
java
小辰记事本1 小时前
RDMA:AI算力集群的“网络命脉”
网络·人工智能·网络协议·rdma
keineahnung23451 小时前
PyTorch SymNode 的 _is_contiguous 從何而來?──sizes_strides_impl 實作詳解
人工智能·pytorch·python·深度学习
测试员周周1 小时前
【Appium 系列】第02节-环境搭建 — Android + iOS 双平台环境配置
开发语言·人工智能·功能测试·appium·自动化·测试用例·web app