Spirng AI 工具调用:核心概念

在前面 Spring AI 工具(Tool)调用 我们通过“获取当前日期和时间”与“设置距当前 10 分钟的闹钟”示例介绍了如何在 Spring AI 中使用工具调用,对工具调用有了一个粗浅的认识,下面将进一步进行介绍,加深对工具调用的认识。

在 Spring AI 中,通过一组灵活的抽象机制支持工具调用功能,这些抽象允许你以统一的方式定义、解析和执行工具。本节将概述 Spring AI 中工具调用的核心概念与组件构成。

Spring AI 工具调用流程图如下:

Spirng AI 工具调用:核心概念

上图说明:

    ① 当我们想让模型使用某个工具时,我们会在聊天请求中包含该工具的定义。每个工具的定义都包括名称(name)、描述(description)和输入参数的模式(input schema)。

    ② 当模型决定调用工具时,它会发送包含工具名称及符合预定义模式的输入参数的响应。

    ③ 应用程序负责根据工具名称识别对应工具,并使用提供的输入参数执行该工具。

    ④ 工具调用的结果由应用程序进行处理。

    ⑤ 应用程序将工具调用结果返回至模型。

    ⑥ 模型最终利用工具调用结果作为附加上下文生成响应。

Tool 是工具调用的基础构建单元,通过 ToolCallback 接口进行建模。Spring AI 内置支持从方法和函数生成 ToolCallback,同时你还可以自定义 ToolCallback 实现以满足更多使用场景。内置支持如下图:

Spirng AI 工具调用:核心概念

上述 TooCallback 实现简单说明:

  • FunctionToolCallback  用于将函数形式的工具能力适配到 ToolCallback 接口规范中。它可以把具体的函数封装起来,让 Spring AI 体系能够识别和调用,实现通过函数来完成工具侧的功能执行。

  • MethodToolCallback  针对方法进行适配。可以把某个类的特定方法封装成符合 ToolCallback 接口的形式,这样就能让 Spring AI 在需要调用工具时,通过调用该方法来完成相应功能。

  • AsyncMcpToolCallback  用于异步场景下与 MCP 相关的工具调用适配。它支持以异步的方式去和 MCP 进行交互,在调用工具时不会阻塞当前线程,能够非同步地执行获取结果,适合处理那些耗时较长、不需要立即拿到返回,或者希望不影响主流程执行的与 MCP 相关的工具调用任务,比如异步从 MCP 拉取数据、异步执行 MCP 相关的业务逻辑等。

  • SyncMcpToolCallback 和上面的 AsyncMcpToolCallback 对应,是同步方式与 MCP 相关的工具调用适配。在调用和 MCP 关联的工具功能时,会阻塞当前线程,直到从 MCP 拿到执行结果返回,适用于那些需要立即获取 MCP 交互结果,且当前流程可以等待的场景,比如同步调用 MCP 接口获取实时业务数据、同步执行 MCP 相关的关键业务逻辑并等待响应等 。

在 Spring AI 中,ChatModel 实现类会透明地将工具调用请求转发给对应的 ToolCallback 实现,并将工具调用结果返回给 AI 模型以生成最终响应。注意,工具调用过程是通过 ToolCallingManager 接口实现,该接口负责管理工具执行的完整生命周期。

ChatClient 和 ChatModel 均可接收 ToolCallback 对象列表,向 AI 模型提供可用工具集,也向最终执行这些工具的 ToolCallingManager 提供支持。

除直接传递 ToolCallback 对象外,你还可传递工具名称列表,这些名称将通过 ToolCallbackResolver 接口进行动态解析。

    

核心接口

下面介绍 Spring AI 为工具调用提供的核心接口,以及这些接口的用途。

ToolCallback 接口

ToolCallback 是 Spring AI 1.0 中定义的工具回调接口,为 AI 模型与外部工具的交互提供了标准契约。其核心作用是规范工具的描述信息和调用方式,使 AI 模型能够统一地识别、调用各类外部工具。

接口主要包含以下核心内容:

  • 工具定义信息:通过 getToolDefinition() 方法提供工具的基本信息(如名称、描述、参数规范等),帮助 AI 模型理解工具功能。

  • 工具元数据:默认通过 getToolMetadata() 方法返回附加信息(如作者、版本等),子类可按需重写扩展。

  • 工具调用方法:通过 call() 方法调用工具,它接收输入参数并返回工具处理结果。接口中定义了两个 call 方法,分别是 call(String toolInput) 和 call(String toolInput, @Nullable ToolContext tooContext),唯一的区别是一个接收 ToolContext,另一个不接收。默认不支持 ToolContext(传入非空 ToolContext 会抛异常),子类可重写以实现 ToolContext 感知的工具调用。

通过实现该接口,各类工具可被 Spring AI 体系识别和调用,成为 AI 模型处理任务时的扩展能力。接口定义如下:

package org.springframework.ai.tool;

import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.definition.ToolDefinition;
import org.springframework.ai.tool.metadata.ToolMetadata;
import org.springframework.lang.Nullable;

public interface ToolCallback {

    /**
     * 获取工具的定义信息
     * 工具定义通常包含工具名称、描述、参数信息等元数据,用于AI模型理解工具功能
     *
     * @return 工具定义对象,包含工具的基本信息和参数规范
     */
    ToolDefinition getToolDefinition();

    /**
     * 获取工具的元数据信息
     * 元数据可以包含更详细的工具描述、作者、版本等附加信息
     * 默认实现返回一个空的元数据对象,子类可以根据需要重写
     *
     * @return 工具元数据对象
     */
    default ToolMetadata getToolMetadata() {
        return ToolMetadata.builder().build();
    }

    /**
     * 调用工具并返回处理结果
     * 这是工具执行的核心方法,接收输入参数并返回处理后的字符串结果
     *
     * @param toolInput 工具的输入参数,通常是符合工具定义的结构化数据(如JSON)
     * @return 工具处理后的结果,以字符串形式返回
     */
    String call(String toolInput);

    /**
     * 带上下文的工具调用方法
     * 支持在调用工具时传入上下文信息,默认实现不支持上下文,如传入非空上下文会抛出异常
     * 子类可以重写此方法以实现对上下文的支持
     *
     * @param toolInput 工具的输入参数
     * @param tooContext 工具调用的上下文信息,可能包含对话历史、环境变量等
     * @return 工具处理后的结果
     * @throws UnsupportedOperationException 如果不支持上下文则抛出此异常
     */
    default String call(String toolInput, @Nullable ToolContext tooContext) {
        // 检查是否有上下文信息需要处理
        if (tooContext != null && !tooContext.getContext().isEmpty()) {
            throw new UnsupportedOperationException("Tool context is not supported!");
        } else {
            // 没有上下文时调用无参call方法
            return this.call(toolInput);
        }
    }
}

注意,Spring AI 已经为工具方法(MethodToolCallback)和工具函数(FunctionToolCallback)提供了内置实现。


ToolCallingManager 接口

ToolCallingManager 接口扮演着工具调用协调者的关键角色,主要负责管理和执行 AI 模型调用外部工具的整个流程,它让 AI 模型与外部工具之间的交互更加有序和规范。

接口定义如下:

package org.springframework.ai.model.tool;

import java.util.List;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.tool.definition.ToolDefinition;

public interface ToolCallingManager {

    /**
     * 该方法用于确定在当前对话上下文中,哪些工具可以被AI模型调用
     *
     * @param chatOptions 聊天选项,可能包含工具调用的配置参数、启用的工具列表等
     * @return 可用工具的定义列表,每个定义包含工具的名称、描述、参数规范等信息
     */
    List<ToolDefinition> resolveToolDefinitions(ToolCallingChatOptions chatOptions);

    /**
     * 执行工具调用并返回执行结果
     * 当AI模型决定调用工具时,通过此方法执行实际的工具调用逻辑,并将结果返回给后续处理流程
     *
     * @param prompt 触发工具调用的提示词,包含用户输入和对话上下文
     * @param chatResponse AI模型的响应,其中可能包含工具调用的指令(如调用哪个工具、传入什么参数)
     * @return 工具执行结果对象,包含调用状态、返回数据等信息
     */
    ToolExecutionResult executeToolCalls(Prompt prompt, ChatResponse chatResponse);

    /**
     * 创建默认工具调用管理器的构建器
     * 提供了一种便捷的方式来构建 DefaultToolCallingManager 实例
     *
     * @return DefaultToolCallingManager 的构建器对象
     */
    static DefaultToolCallingManager.Builder builder() {
        return DefaultToolCallingManager.builder();
    }
}


ToolCallbackResolver 接口

ToolCallbackResolver 接口主要用于在工具调用流程中,根据工具名称来解析并获取对应的 ToolCallback 实例。在工具调用流程中,起到工具名称与实际工具实现之间的映射桥梁作用。

接口定义如下:

package org.springframework.ai.tool.resolution;

import org.springframework.ai.tool.ToolCallback;
import org.springframework.lang.Nullable;

public interface ToolCallbackResolver {

    /**
     * 根据工具名称解析对应的 ToolCallback 实例
     * 当AI模型需要调用指定名称的工具时,通过此方法获取实际执行该工具功能的 ToolCallback 实现
     *
     * @param toolName 工具的名称,用于唯一标识某个工具
     * @return 对应的 ToolCallback 实例;如果未找到匹配的工具,则返回 null
     */
    @Nullable
    ToolCallback resolve(String toolName);
}


ToolDefinition 接口

ToolDefinition 接口是工具元信息的核心定义接口,用于描述一个工具的基本信息、功能特性和参数规范,帮助 AI 模型理解工具的作用和使用方式。它是 AI 模型与工具之间的“说明书”,是工具调用流程中不可或缺的元数据载体。

接口定义如下:

package org.springframework.ai.tool.definition;

public interface ToolDefinition {

    /**
     * 工具的唯一名称
     * 在AI模型可访问的工具集合中,该名称需保持唯一性,用于精准定位和调用工具
     * @return 工具的名称字符串
     */
    String name();

    /**
     * 详细说明工具的用途和能力,帮助AI模型判断该工具是否适用于当前任务
     * @return 工具的功能描述字符串
     */
    String description();

    /**
     * 工具输入参数的 schema 定义
     * 通常以JSON Schema格式描述参数的结构、类型、约束等信息,指导AI模型正确构造调用参数
     * @return 输入参数的schema字符串(一般为JSON Schema格式)
     */
    String inputSchema();

    /**
     * 创建默认工具定义实现类的构建器
     * 提供便捷的方式来构建 DefaultToolDefinition 实例,简化工具定义的创建过程
     * @return DefaultToolDefinition的构建器对象
     */
    static DefaultToolDefinition.Builder builder() {
        return DefaultToolDefinition.builder();
    }
}

ToolDefinition.Builder 允许你使用默认实现(DefaultToolDefinition)构建 ToolDefinition 实例,如下:

ToolDefinition toolDefinition = ToolDefinition.builder()
    .name("currentWeather")
    .description("Get the weather in location")
    .inputSchema("""
        {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string"
                },
                "unit": {
                    "type": "string",
                    "enum": ["C", "F"]
                }
            },
            "required": ["location", "unit"]
        }
    """)
    .build();

方法工具定义(MethodToolCallback)

基于方法构建工具时,ToolDefinition 不会自动生成。需要自己创建,源码如下:

public final class MethodToolCallback implements ToolCallback {
    //...
    public static final class Builder {
        private ToolDefinition toolDefinition;
        private ToolMetadata toolMetadata;
        private Method toolMethod;
        private Object toolObject;
        private ToolCallResultConverter toolCallResultConverter;

        private Builder() {
        }

        // 设置自己创建的 ToolDefinition
        public Builder toolDefinition(ToolDefinition toolDefinition) {
            this.toolDefinition = toolDefinition;
            return this;
        }

        //...

        public MethodToolCallback build() {
            // 实例化MethodToolCallback
            return new MethodToolCallback(this.toolDefinition, this.toolMetadata,
                    this.toolMethod, this.toolObject, this.toolCallResultConverter);
        }
    }
}

函数工具定义(FunctionToolCallback)

基于函数构建工具时,ToolDefinition 会自动生成。当使用 FunctionToolCallback.Builder 构建 FunctionToolCallback 实例时,可指定用于生成 ToolDefinition 的工具名称、描述及输入模式。然后,由 FunctionToolCallback 帮我们创建 ToolDefinition 对象。

源码如下:

public class FunctionToolCallback<I, O> implements ToolCallback {
    //...
    public static final class Builder<I, O> {
        //...
        public FunctionToolCallback<I, O> build() {
            Assert.notNull(this.inputType, "inputType cannot be null");
            // 自动帮我们创建 ToolDefinition
            ToolDefinition toolDefinition = DefaultToolDefinition.builder()
                .name(this.name)
                .description(StringUtils.hasText(this.description) ? this.description : ToolUtils.getToolDescriptionFromName(this.name))
                .inputSchema(StringUtils.hasText(this.inputSchema) ? this.inputSchema : JsonSchemaGenerator.generateForType(this.inputType, new JsonSchemaGenerator.SchemaOption[0]))
                .build();
            return new FunctionToolCallback(toolDefinition, this.toolMetadata, this.inputType, this.toolFunction, this.toolCallResultConverter);
        }
    }
}

  

JSON Schema

JSON Schema 是一种用于描述和验证 JSON 数据结构的规范。它相当于 JSON 数据的 "蓝图" 或 "契约",定义了 JSON 数据应该包含哪些字段、每个字段的数据类型(如字符串、数字、布尔值等)、字段间的关系以及其他约束条件(如是否必填、数值范围、字符串格式等)。

JSON Schema 的核心作用如下:

  • 数据结构描述:清晰定义 JSON 数据的结构,让开发者或系统明确知道 "应该接收 / 生成什么样的 JSON"。例如,定义一个 "用户" 的 JSON Schema,可以指定必须包含 name(字符串)、age(整数,且大于 0)等字段。

  • 数据验证:根据定义的 Schema 自动校验 JSON 数据是否符合规范,避免不合规数据导致的解析错误或业务异常。例如,若 JSON 中 age 是负数,通过 Schema 验证可直接发现该错误。

  • 文档化:作为 JSON 数据的 "说明书",帮助团队成员或系统间理解数据格式,减少沟通成本。

  • 代码生成:部分工具可根据 JSON Schema 自动生成对应的数据模型类(如 Java 的 POJO、TypeScript 的 Interface 等)。

以下是一个描述 "用户" 信息的 JSON Schema 示例:

{
  "$schema": "http://json-schema.org/draft-07/schema#",  // 声明使用的Schema版本
  "type": "object",  // 根数据类型为对象
  "title": "用户信息",
  "description": "存储用户的基本信息",
  "properties": {  // 定义对象的属性
    "name": {
      "type": "string",  // 类型为字符串
      "description": "用户姓名"
    },
    "age": {
      "type": "integer",  // 类型为整数
      "minimum": 0,  // 最小值为0
      "description": "用户年龄"
    },
    "email": {
      "type": "string",
      "format": "email",  // 符合邮箱格式
      "description": "用户邮箱"
    }
  },
  "required": ["name", "age"],  // 必选字段
  "additionalProperties": false  // 不允许出现未定义的其他字段
}

我们向 AI 模型提供工具时,AI 模型需要知道工具调用时输入参数的 JSON SchemaJSON Schema 用于理解如何调用工具,及如何准备调用工具的请求。Spring AI 通过 JsonSchemaGenerator 类内置支持生成工具输入类型的 JSON Schema,该模式作为 ToolDefinition 的一部分提供。如下图:

image.png

JsonSchemaGenerator 类在底层用于生成方法工具或函数工具输入参数的 JSON Schema。JSON Schema 的生成逻辑支持一系列注解,你可在方法/函数的输入参数上使用这些注解来自定义生成的 JSON Schema

下面将描述生成工具输入参数 JSON Schema 时可定制的两个主要选项:描述信息(description)必选状态(required)

描述信息(description

描述信息除了为工具本身提供描述外,你还可为工具的输入参数添加描述。该描述可用于提供参数的关键信息,如参数格式要求、允许取值等,有助于模型理解输入模式及使用方法。Spring AI 内置支持通过以下注解生成输入参数描述:

  • Spring AI 的 @ToolParam(description = "…")

  • Jackson 的 @JsonClassDescription(description = "…")

  • Jackson 的 @JsonPropertyDescription(description = "…")

  • Swagger 的 @Schema(description = "…")

简单示例:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.context.i18n.LocaleContextHolder;

public class DateTimeTools {

    @Tool(description="为给定时间设置用户闹钟")
    public void setAlarm(@ToolParam(description="ISO-8601格式的时间") String time) {
        LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);
        System.out.println("闹钟设置为 " + alarmTime);
    }

}

必选/可选

默认情况下,每个输入参数都被视为必选参数,这会强制 AI 模型在调用工具时必须提供该参数值。但你可通过以下注解(按优先级顺序)将输入参数设为可选:

  • Spring AI 的 @ToolParam(required = false)

  • Jackson 的 @JsonProperty(required = false)

  • Swagger 的 @Schema(required = false)

  • Spring 的 @Nullable

简单示例:

public class CustomerTools {

    // updateCustomerInfo() 工具中,id 和 name 参数是必须的,而 email 参数是可选的
    @Tool(description = "更新客户信息")
    public void updateCustomerInfo(Long id, String name, @ToolParam(required = false) String email) {
        System.out.println("更新客户信息 id: " + id);
    }

}
📢注意:正确定义输入参数的必选状态对降低幻觉风险至关重要,能确保模型调用工具时提供正确的输入。在上述例子中,email 参数为可选,意味着模型可不提供该参数值直接调用工具。若参数为必选,则模型调用时必须提供参数值 —— 当不存在有效值时,模型可能会虚构参数值,从而导致幻觉。

结果转换

工具调用结果通过 ToolCallResultConverter 序列化后返回给 AI 模型,该接口提供将工具调用结果转换为 String 对象的能力。

接口定义如下:

@FunctionalInterface
public interface ToolCallResultConverter {

    /**
    * 将工具返回的对象转换为与指定类型兼容的字符串
    * 
    * @param result 工具调用后的返回结果对象,可能为null(如工具无返回值)
    * @param returnType 目标类型,用于指定转换后的字符串应兼容的数据类型,可能为null
    * @return 转换后的字符串,需与returnType类型兼容,便于后续处理或传递给LLM
    */
    String convert(@Nullable Object result, @Nullable Type returnType);
}

注意,结果必须是可序列化类型。默认情况下,结果通过 Jackson 序列化为 JSON(使用 DefaultToolCallResultConverter),但你可通过自定义 ToolCallResultConverter 接口实现来定制序列化过程。并且,Spring AI 在方法工具和函数工具中均依赖 ToolCallResultConverter。如下图:

image.png

image.png

方法工具调用结果转换

使用声明式方法从方法构建工具时,你可以通过设置 @Tool 注解的 toolCallResultConverter 属性来为该工具提供自定义的 ToolCallResultConverter。例如:

public class CustomerTools {

    // CustomToolCallResultConverter 为自定义的转换器
    @Tool(description = "Retrieve customer information", resultConverter = CustomToolCallResultConverter.class)
    public Customer getCustomerInfo(Long id) {
        return customerRepository.findById(id);
    }

}

若使用编程式方法,可通过设置 MethodToolCallback.Builder 的 resultConverter() 属性来为工具提供自定义的 ToolCallResultConverter。如下图:

image.png

函数工具调用结果转换

使用编程式方法从函数构建工具时,你可以通过设置 FunctionToolCallback.Builder 的 toolCallResultConverter 属性来为该工具提供自定义的 ToolCallResultConverter。如下图:

image.png

  


ToolContext(工具上下文)

Spring AI 支持通过 ToolContext API 向工具传递额外的上下文信息。此功能允许你提供用户自定义的额外数据,这些数据可与 AI 模型传递的工具参数一起在工具执行过程中使用。如下图:

Spirng AI 工具调用:核心概念

上图是 Spring AI 中工具调用流程示意图,展示了从用户发起对话请求,到借助工具、AI 模型协作,最终返回响应的完整过程。其中:

① 初始输入:Chat Request 包含工具上下文(ToolContext)和定义(ToolDefinition),一起被传入 Spring AI 模块,启动工具调用流程。

  • ToolContext:包含工具调用所需的环境信息,比如历史对话、业务参数,告诉系统当前场景需要哪些工具辅助。

  • ToolDefinition:工具本身的“说明书”,比如工具能做什么、需要哪些参数、输出格式,类似函数的 入参/出参定义。

② Spring AI 向 AI 模型“咨询”:是否需要工具?Spring AI 把“用户请求 + 工具定义”传给 AI Model(大语言模型)。让 AI 判断「是否需要调用工具」,以及「调用哪个工具、传什么参数」。

③ AI 决定调用工具 → Spring AI 执行调用

  • 步骤 3:AI Model 分析后,返回 “工具调用指令”,比如:调用天气查询工具,参数填北京、今天。

  • 步骤 3'':Spring AI 的 Dispatch Tool Call Requests(工具调度器),根据指令实际触发工具执行,把 ToolContext 上下文和参数传给工具 Tool。

  • 步骤 4:Tool 完成任务,返回结果,比如:北京今天晴,25℃。

④ 工具结果回传给 AI 模型,补充上下文

Spring AI 把工具返回的结果再次传给 AI Model,相当于给 AI 补充“实时信息”。此时 AI 拿到两部分内容:原始用户请求 + 工具返回的结果,可以更精准地理解问题、生成回答。

⑤ AI 生成最终回答

AI Model 结合“用户需求 + 工具结果”,组织出完整、准确的回复内容,再传给 Spring AI。

⑥ 返回对话响应:Chat Response

Spring AI 把 AI 生成的最终回复,包装成 Chat Response,返回给用户/调用方。

ToolContext 使用示例:

public class CustomerTools {

    @Tool(description = "检索客户信息")
    public Customer getCustomerInfo(Long id, ToolContext toolContext) {
        // 从 ToolContext 中获取租户ID
        return customerRepository.findById(id, toolContext.get("tenantId"));
    }

}

ToolContext 中的数据由用户调用 ChatClient 时提供。

ChatModel chatModel = ...

String response = ChatClient.create(chatModel)
        .prompt("Tell me more about the customer with ID 42")
        .tools(new CustomerTools())
        // 提供工具上下文数据
        // ChatClientRequestSpec toolContext(Map<String, Object> toolContext)
        .toolContext(Map.of("tenantId", "acme"))
        .call()
        .content();

System.out.println(response);
注意,ToolContext 中提供的任何数据都不会发送给 AI 模型。

同样,直接调用 ChatModel 时也可定义工具上下文数据。

ChatModel chatModel = ...
ToolCallback[] customerTools = ToolCallbacks.from(new CustomerTools());
ChatOptions chatOptions = ToolCallingChatOptions.builder()
    .toolCallbacks(customerTools)
    .toolContext(Map.of("tenantId", "acme"))
    .build();
    
Prompt prompt = new Prompt("Tell me more about the customer with ID 42", chatOptions);
chatModel.call(prompt);

注意,如果在默认选项和运行时选项中均设置了 toolContext,最终 ToolContext 将是两者的合并结果,其中运行时选项优先于默认选项。

直接返回

默认情况下,工具调用结果将作为响应返回给 AI 模型,随后模型可利用该结果继续对话。

某些场景下,你可能希望将结果直接返回调用方而非传回模型。例如:当构建依赖 RAG 工具的代理时,你可能希望直接将检索结果返回调用方,而非传回模型进行不必要的后处理;又或者某些工具应当终止代理的推理循环。

每个 ToolCallback 实现均可定义工具调用结果应直接返回调用方还是传回模型。默认结果为传回 AI 模型,但你可按工具单独修改此行为。

ToolCallingManager 负责管理工具执行生命周期,其会处理工具的 returnDirect 属性。若该属性设为 true,工具调用结果将直接返回调用方;否则结果将传回模型。如果同时请求多个工具调用,则所有工具的 returnDirect 属性必须设为 true 才能将结果直接返回调用方。否则,结果将传回 AI 模型。

工具调用流程图:

Spirng AI 工具调用:核心概念

上图是 Spring AI 中工具调用的简化流程,核心特点是 returnDirect=true(工具结果直接返回调用方,跳过 AI 二次处理)。下面分步拆解逻辑:

① 输入:Chat Request 携带工具定义(含 returnDirect=true)

  • Chat Request:用户发起的对话请求,需借助工具解决问题。

  • Tool Definition:工具的“说明书”(能做什么、参数要求等),额外带 returnDirect=true(关键标记,决定流程走向,表示工具调用结果不需要回传给 AI 模型进行二次处理)。

② Spring AI 调用 AI 模型,确认工具调用逻辑

Spring AI 把“用户请求 + 工具定义”传给 AI Model(大语言模型),让 AI 判断“是否需要调用工具?调用哪个?传什么参数?”。因为有 returnDirect=true,这里 AI 主要做“工具调用的决策”(而非后续二次处理)。

③ Spring AI 执行工具调用

Dispatch Tool Call Requests(工具调度器)根据 AI 决策,实际触发 Tool 执行,把参数传给工具,工具开始干活。

④ 工具返回结果

Tool 完成任务,把结果直接回传给 Spring AI 的调度器。由于 returnDirect=true,结果不再返回给 AI 二次处理,跳过传统流程中“AI 整合结果”的步骤。

⑤ 直接返回工具结果作为响应

Spring AI 把 工具返回的原始结果包装成 Chat Response,直接返回给用户/调用方。

方法直接返回

使用声明式方法从方法构建工具时,你可以通过将 @Tool 注解的 returnDirect 属性设为 true,将工具标记为直接向调用方返回结果。例如:

public class CustomerTools {

    @Tool(description = "检索客户信息", returnDirect = true)
    public Customer getCustomerInfo(Long id) {
        return customerRepository.findById(id);
    }

}

若使用编程式方法,可通过 ToolMetadata 接口设置 returnDirect 属性,并将其传递给 MethodToolCallback.Builder。例如:

oolMetadata toolMetadata = ToolMetadata.builder()
        .returnDirect(true)
        .build();

MethodToolCallback.builder()
        .toolMetadata(toolMetadata).build();

函数直接返回

使用编程式方法从函数构建工具时,你可通过 ToolMetadata 接口设置 returnDirect 属性,并将其传递给 FunctionToolCallback.Builder。例如:

ToolMetadata toolMetadata = ToolMetadata.builder()
        .returnDirect(true)
        .build();

FunctionToolCallback.builder("", (city, context) -> {
            // 业务逻辑
            return true;
        })
        .toolMetadata(toolMetadata).build();

更多关于 Spring AI 工具调用的知识请参考官方文档,后续章节将介绍如何定义方法工具和函数工具。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号