工具调用(亦称函数调用)是 AI 应用的常见模式,允许模型通过与一组 API(即工具)交互来扩展其能力。工具可以是任何东西:网页搜索、对外部 API 的调用,或特定代码的执行等。
LLM 本身不能实际调用工具,工具调用逻辑是由客户端应用程序提供的。模型只能请求工具调用并提供输入参数,而应用程序负责根据输入参数执行工具调用并返回结果。
一、概述
Spring AI 通过一组灵活的抽象机制支持工具调用功能,这些抽象允许你以统一的方式定义、解析和执行工具。

-
当我们想让模型使用某个工具时,我们会在聊天请求中包含该工具的定义。每个工具的定义都包括名称、描述和输入参数的模式。
-
当模型决定调用工具时,它会发送包含工具名称及符合预定义模式的输入参数的响应。
-
应用程序负责根据工具名称识别对应工具,并使用提供的输入参数执行该工具。
-
工具调用的结果由应用程序进行处理。
-
应用程序将工具调用结果返回至模型。
-
模型最终利用工具调用结果作为附加上下文生成响应。
Tool 是工具调用的基础构建单元,通过 ToolCallback 接口进行建模。Spring AI 内置支持从方法和函数生成 ToolCallback,同时你始终可以自定义 ToolCallback 实现以满足更多使用场景。
工具主要应用于以下场景:
-
信息检索。此类工具可用于从外部源检索信息,例如数据库、网络服务、文件系统或网络搜索引擎。其目的是增强模型的知识,使其能够回答原本无法回答的问题。因此,它们可用于检索增强生成(RAG)场景。例如,可以使用工具检索给定位置的当前天气、检索最新新闻文章或查询数据库中的特定记录。
-
执行操作。此类工具可用于在软件系统中执行操作,例如发送电子邮件、在数据库中创建新记录、提交表单或触发工作流。其目的是自动化那些原本需要人工干预或显式编程的任务。例如,可以使用工具为与聊天机器人交互的客户预订航班、填写网页上的表单,或在代码生成场景中基于自动化测试(TDD)实现 Java 类。
Spring AI 支持两种工具调用的定义:方法工具 和 函数工具,ChatClient 和 ChatModel 均可接收 ToolCallback 对象列表,既向模型提供可用工具。
一、方法工具
Spring AI 为方法转工具(即 ToolCallback)提供两种内置支持方式:
-
声明式:通过
@Tool注解实现。 -
编程式:通过底层的
MethodToolCallback实现。
这里我们只看最常用的声明式:
1.声明式配置:@Tool 注解方案
1.1 @Tool
你只需为方法添加 @Tool 注解,即可将其转换为工具。
@Tool 注解允许你配置以下关键工具信息:
-
name:工具名称。若不指定,默认使用方法名称。AI 模型通过此名称识别调用工具,因此不允许在同一类中存在同名工具。模型处理单个聊天请求时,所有可用工具的名称必须保持全局唯一。 -
description:工具描述,用于指导模型判断何时及如何调用该工具。若未指定,默认使用方法名称作为工具描述。但强烈建议提供详细描述,因为这对模型理解工具用途和使用方式至关重要。若描述不充分,可能导致模型在该调用工具时未调用,或错误调用工具。 -
returnDirect:控制工具结果直接返回客户端(true)还是传回模型(false),默认false。 -
resultConverter:工具调用结果的转化器,默认使用 DefaultToolCallResultConverter,将结果转换为字符串。
class DateTimeTools {
@Tool(description = "Get the current date and time in the user's timezone")
String getCurrentDateTime() {
return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
}
}
1.2 @ToolParam
Spring AI 将自动为 @Tool 注解方法的输入参数生成 JSON Schema。该 Schema 供模型理解如何调用工具及准备工具请求。你可使用 @ToolParam 注解为输入参数提供额外信息(如描述、是否必需等),默认情况下所有输入参数均为必需参数。
你可以为方法定义任意数量的参数(包括无参数),支持大多数类型(基本类型、POJO、枚举、List、数组、Map 等)。同样,方法可以返回大多数类型,包括 void。若方法有返回值,则返回类型必须是可序列化类型,因为结果将被序列化并发送回模型。
@ToolParam 注解允许你配置工具参数的关键信息:
-
description:参数描述,用于帮助模型更准确地理解如何使用该参数。例如:参数格式要求、允许取值范围等。

最低0.47元/天 解锁文章
1618

被折叠的 条评论
为什么被折叠?



