SpringAI系列4: Tool Calling 工具调用

[复制链接]
发表于 2025-7-7 15:57:26 | 显示全部楼层 |阅读模式
前言:在迩来发布的 Spring AI 1.0.0.M6 版本中,此中一个庞大变革是 Function Calling 被废弃,被 Tool Calling 取代。Tool Calling工具调用(也称为函数调用)是AI应用中的常见模式,允许模型通过一组API或工具举行交互,从而增强其本事

1、Tool Calling 工具调用 简介

   Spring AI 中的工具调用使 AI 模型能够与外部工具和服务交互,从而增强其功能。Tool Calling 工具调用允许 AI 模型实行外部函数、访问外部服务、实行复杂操作和与现有系统集成
  

主要利用的场景:

  • 信息检索(Information Retrieval)。
    此类工具可用于从外部资源(如数据库、Web服务、文件系统或者 WEB 搜刮引擎)检索信息。
    目的:增强模型的知识,使其能够答复其别的方式不能答复的问题。比方,工具用于检索给定的位置天气、检索最新的新闻文章或者查询数据库
  • 采取办法(Taking Action)
    此类工具可用于在软件系统中的实行操作(如发送电子邮件、在数据库中创建新纪录、提交表单或触发工作流),主动实行本来必要人工干预或者显式编程的任务。比方,与呆板人交互生成待办事项、主动填写网页表单、谈天呆板人预订机票、创建聚会会议安排等。
注意: 通常我们认为工具调用是模型功能,但实际上由客户端应用步伐提供工具调用逻辑,模型只能哀求工具调用并提供输入参数,模型本身不实行工具调用。

2、为什么废弃 Function Calling?



  • 更好的改进和扩展 Spring AI 中工具调用功能
  • 新的 API 从 functions 改为 tools 术语,与行业术语保持一致性。
除以上两点之外,在筹划上也做了一定的优化,主要体如今;


  • 新的 API 在工具的定义和实现之间提供了更好的分离
  • 工具定义可以在不同的实现中重复利用
  • 在利用上,简化了构造器模式,更好的支持基于方法的工具,并改进了错误处理。
   两者在本质上概念上没有区别,都是为增强大模型的本事,在底层的实现原理上也是一致的,只是对外提供的概念稍微变动一下。官方发起尽快将 Function Calling 干系利用的 API 迁移到 Tool Calling API。Function Calling API 在后续的版本中会被移除。基本上是将原API 中的Function 更换为 Tool,再者就是为了方便方法的利用做了一些优化。
  
3、Tool Calling 主要操作流程和源代码

(1)主要操作流程

   

  • 定义工具 :当必要向模型提供工具时,需在谈天哀求中包含其定义。每个工具定义包含名称、形貌及输入参数的模式(schema)。
  • 模型发起调用 :当模型决定调用工具时,会返回包含工具名称和符合预定义模式的输入参数的响应。
  • 应用实行工具 :应用步伐负责根据工具名称识别并实行对应工具,传入提供的输入参数。
  • 处理结果 :工具调用的结果由应用步伐处理。
  • 返回结果至模型 :应用步伐将工具调用结果返回给模型。
  • 生成终极响应 :模型结合工具调用结果作为上下文生成终极响应
  

(2)源码


  1. @Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Tool {
  5.     /**
  6.      * 指定工具的名称,如果不指定则默认使用方法名称。
  7.      * 注意:方法名称的唯一性
  8.      */
  9.     String name() default "";
  10.     /**
  11.      * 工具的描述,模型可以使用它来了解何时以及如何调用工具,如果不指定则使用方法名。
  12.      * 强烈建议:详细,清晰的描述工具的功能,这对于工具的使用至关重要,直接影响大模型的
  13.      * 使用效果。
  14.      */
  15.     String description() default "";
  16.     /**
  17.      * 指定工具执行的结果是直接返回,还是要发给大模型,默认发送给大模型
  18.      */
  19.     boolean returnDirect() default false;
  20.     /**
  21.      * 指定工具执行结果转换器。Spring AI 内置一个默认转换为String,如果有特殊业务
  22.      * 需求可自行实现。
  23.      */
  24.     Class<? extends ToolCallResultConverter> resultConverter() default DefaultToolCallResultConverter.class;
  25. }
复制代码

4、Tool Calling 快速入门​

让我们通过一个示例了解怎样在Spring AI中利用工具调用。我们将实现两个简单工具:一个用于信息检索,另一个用于实行操作。信息检索工具用于获取用户时区的当前日期和时间,操作工具用于设置指定时间的闹钟。
(1)信息检索

   AI模型无法访问实时信息。任何涉及当前日期、天气预告等实时信息的问题,模型都无法直接答复。但我们可以提供能够检索此类信息的工具,并让模型在必要实时数据时调用这些工具。
  首先在DateTimeTools类中实现一个获取用户时区当前日期时间的工具。该工具不必要参数,通过Spring框架的LocaleContextHolder获取用户时区。工具方法利用@Tool注解,并添加具体形貌帮助模型理解调用时机。
  1. package com.hs.demo.tool;
  2. import org.springframework.ai.tool.annotation.Tool;
  3. import org.springframework.context.i18n.LocaleContextHolder;
  4. import java.time.LocalDateTime;
  5. public class DateTimeTools {
  6.     @Tool(description = "获取用户时区的当前日期和时间")
  7.     String getCurrentDateTime() {
  8.         return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
  9.     }
  10. }
复制代码
接下来将工具提供给模型,本例利用ChatClient与模型交互,通过tools()方法传入DateTimeTools实例。当模型必要实时时间信息时,会主动哀求调用该工具。ChatClient会实行工具调用并将结果返回给模型,模型结合结果生成终极响应。

输出示例:
   明天是2025-05-30。
  如果直接提问但不提供工具,模型将返回:
   我无法访问实时信息,请提供当前日期以便计算明天的日期。
  这证明模型在缺乏工具时无法自主获取实时数据
 (2)  实行操作

   AI模型可以生成实现目的的筹划(如制定瑞士旅行筹划),但无法直接实行。此时必要工具来落实模型生成的筹划。
  我们将定义第二个工具,用于在特定时间设置闹钟。在第一个工具的基础上,先获取当前时间,在当前时间的基础上设置闹钟。在现有DateTimeTools类中新增设置闹钟的工具。该工具吸收ISO-8601格式的时间参数,向控制台输出闹钟设置信息。同样利用@Tool注解并添加具体形貌
  1. class DateTimeTools {
  2.     @Tool(description = "获取用户时区的当前日期和时间")
  3.     String getCurrentDateTime() {
  4.         return LocalDateTime.now()
  5.             .atZone(LocaleContextHolder.getTimeZone().toZoneId())
  6.             .toString();
  7.     }
  8.     @Tool(description = "为指定ISO-8601时间设置用户闹钟")
  9.     void setAlarm(String time) {
  10.         LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);
  11.         System.out.println("闹钟已设置为 " + alarmTime);
  12.     }
  13. }
复制代码
通过ChatClient同时提供两个工具。当哀求"10分钟后设置闹钟"时,模型会先调用getCurrentDateTime获取当前时间,计算目的时间后调用setAlarm工具。ChatClient主动处理工具调用哀求并返回结果,模型终极生成响应
  1. ChatModel chatModel = ...
  2. String response = ChatClient.create(chatModel)
  3.         .prompt("能设置10分钟后的闹钟吗?")
  4.         .tools(new DateTimeTools())
  5.         .call()
  6.         .content();
  7. System.out.println(response);
复制代码
应用日志日志将显示精确设置的闹钟时间,验证工具调用流程

参考链接:
被吹上天的Spring AI Tool Calling机制,也不外云云
Spring AI 框架在升级,Function Calling 废弃,被 Tool Calling 取代
Spring AI之工具调用_springai-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

快速回复 返回顶部 返回列表