【Spring AI+Spring AI Albaba从零开始的学习之旅】之工具调用(Tool Calling)篇

        工具调用(亦称函数调用)是 AI 应用的常见模式,允许模型通过与一组 API(即工具)交互来扩展其能力。工具可以是任何东西:网页搜索、对外部 API 的调用,或特定代码的执行等。

        LLM 本身不能实际调用工具,工具调用逻辑是由客户端应用程序提供的。模型只能请求工具调用并提供输入参数,而应用程序负责根据输入参数执行工具调用并返回结果。

一、概述

        Spring AI 通过一组灵活的抽象机制支持工具调用功能,这些抽象允许你以统一的方式定义、解析和执行工具。

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

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

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

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

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

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

        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参数描述,用于帮助模型更准确地理解如何使用该参数。例如:参数格式要求、允许取值范围等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆大聪明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值