文章目录

    • 简述
    • 工具定义
    • 工具上下文
    • 直接返回
        • 方法:直接返回
    • 工具执行
        • 框架控制工具执行
        • 用户控制的工具执行
        • 异常处理

在这里插入图片描述

简述

工具调用(也称为函数调用)是 AI 应用程序中的一种常见模式,允许模型与一组 API 或工具进行交互,从而增强其功能。

工具主要用于:

  • 信息检索。此类别中的工具可用于从外部源(如数据库、Web 服务、文件系统或 Web 搜索引擎)检索信息。目标是增强模型的知识,使其能够回答其他方式无法回答的问题。因此,它们可用于检索增强生成 (RAG) 方案。例如,工具可用于检索给定位置的当前天气、检索最新的新闻文章或查询数据库以获取特定记录。
  • 采取行动。此类别中的工具可用于在软件系统中执行作,例如发送电子邮件、在数据库中创建新记录、提交表单或触发工作流。目标是自动执行原本需要人工干预或显式编程的任务。例如,可以使用工具为与聊天机器人交互的客户预订航班,在网页上填写表单,或在代码生成场景中实现基于自动测试 (TDD) 的 Java 类

工具定义

获取类中用户时区的当前日期和时间

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();}}

我们将通过传递 via 方法的实例来为模型提供该工具。当模型需要知道当前日期和时间时,它将请求调用工具。在内部,将调用工具并将结果返回给模型,然后模型将使用工具调用结果生成对原始问题的最终响应。

ChatModel chatModel = ...String response = ChatClient.create(chatModel).prompt("What day is tomorrow?").tools(new DateTimeTools()).call().content();System.out.println(response);

未使用工具的
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用工具之后
在这里插入图片描述

工具上下文

Spring AI 支持通过 API 将额外的上下文信息传递给工具。此功能允许您提供额外的用户提供的数据,这些数据可用于工具执行以及 AI 模型传递的工具参数。ToolContext

class CustomerTools {@Tool(description = "Retrieve customer information")Customer getCustomerInfo(Long id, ToolContext toolContext) {return customerRepository.findById(id, toolContext.get("tenantId"));}}

在调用 时,将使用用户提供的数据填充 。ToolContextChatClient

ChatModel chatModel = ...String response = ChatClient.create(chatModel).prompt("Tell me more about the customer with ID 42").tools(new CustomerTools()).toolContext(Map.of("tenantId", "acme")).call().content();System.out.println(response);

同样,您可以在直接调用 时定义工具上下文数据。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);

工具类内容

public class CustomerTools {@Tool(description = "Retrieve customer information")String getCustomerInfo(Long id, ToolContext toolContext) {Map<String, Object> context = toolContext.getContext();return context.get("tenantId").toString();}}

直接返回

默认情况下,工具调用的结果将作为响应发送回模型。然后,模型可以使用结果继续对话。

在某些情况下,您宁愿将结果直接返回给调用方,而不是将其发送回模型。例如,如果构建依赖于 RAG 工具的代理,则可能希望将结果直接返回给调用方,而不是将其发送回模型以进行不必要的后处理。或者,也许您有某些工具可以结束代理的推理循环。

每个实现都可以定义工具调用的结果是应直接返回给调用方还是发送回模型。默认情况下,结果将发送回模型。但是,您可以根据每个工具更改此行为。ToolCallback

负责管理工具执行生命周期的 ,负责处理与工具关联的属性。如果该属性设置为 ,则工具调用的结果将直接返回给调用方。否则,结果将发送回模型。ToolCallingManagerreturnDirecttrue

方法:直接返回

使用声明性方法从方法构建工具时,可以通过将注释的属性设置为 来标记工具以将结果直接返回给调用者。returnDirect@Tooltrue

class CustomerTools {@Tool(description = "Retrieve customer information", returnDirect = true)Customer getCustomerInfo(Long id) {return customerRepository.findById(id);}}

如果使用编程方法,您可以通过接口设置属性并将其传递给 .returnDirectToolMetadataMethodToolCallback.Builder

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

这种操作可以只返回结果
在这里插入图片描述

工具执行

工具执行是使用提供的输入参数调用工具并返回结果的过程。工具执行由接口处理,接口负责管理工具执行生命周期。ToolCallingManager

public interface ToolCallingManager {/*** Resolve the tool definitions from the model's tool calling options.*/List<ToolDefinition> resolveToolDefinitions(ToolCallingChatOptions chatOptions);/*** Execute the tool calls requested by the model.*/ToolExecutionResult executeToolCalls(Prompt prompt, ChatResponse chatResponse);}

如果您使用的是任何 Spring AI Spring Boot Starters,则是接口的自动配置实现。您可以通过提供自己的 Bean 来自定义工具执行行为。DefaultToolCallingManagerToolCallingManagerToolCallingManager

@Bean
ToolCallingManager toolCallingManager() {return ToolCallingManager.builder().build();
}

默认情况下,Spring AI 会从每个实现中透明地为您管理工具执行生命周期。但是,您可以选择退出此行为并自行控制工具执行。本节介绍这两种方案。ChatModel

框架控制工具执行

使用默认行为时,Spring AI 会自动拦截来自模型的任何工具调用请求,调用工具并将结果返回给模型。所有这些都是通过每个实现使用 .ChatModelToolCallingManager
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户控制的工具执行

在某些情况下,您宁愿自己控制工具执行生命周期。您可以通过将 的属性设置为 来做到这一点。internalToolExecutionEnabledToolCallingChatOptionsfalse

当您使用此选项调用 时,工具执行将委托给调用方,从而使您能够完全控制工具执行生命周期。您有责任检查 中的工具调用并使用 .ChatModelChatResponseToolCallingManager

以下示例演示了用户控制的工具执行方法的最小实现:

ChatModel chatModel = ...
ToolCallingManager toolCallingManager = ToolCallingManager.builder().build();ChatOptions chatOptions = ToolCallingChatOptions.builder().toolCallbacks(new CustomerTools()).internalToolExecutionEnabled(false).build();
Prompt prompt = new Prompt("Tell me more about the customer with ID 42", chatOptions);ChatResponse chatResponse = chatModel.call(prompt);while (chatResponse.hasToolCalls()) {ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse);prompt = new Prompt(toolExecutionResult.conversationHistory(), chatOptions);chatResponse = chatModel.call(prompt);
}System.out.println(chatResponse.getResult().getOutput().getText());
异常处理

当工具调用失败时,异常将传播为可以捕获以处理错误。A 可用于处理具有两种结果的 a:生成要发送回 AI 模型的错误消息,或引发由调用方处理的异常。ToolExecutionExceptionToolExecutionExceptionProcessorToolExecutionException

@FunctionalInterface
public interface ToolExecutionExceptionProcessor {/*** Convert an exception thrown by a tool to a String that can be sent back to the AI* model or throw an exception to be handled by the caller.*/String process(ToolExecutionException exception);}

如果您使用的是任何 Spring AI Spring Boot Starters,则是接口的自动配置实现。默认情况下,错误消息将发送回模型。构造函数允许您将属性设置为 或 。如果 ,将抛出异常,而不是将错误消息发送回模型。DefaultToolExecutionExceptionProcessor ToolExecutionExceptionProcessor DefaultToolExecutionExceptionProcessor alwaysThrowtrue false true

@Bean
ToolExecutionExceptionProcessor toolExecutionExceptionProcessor() {return new DefaultToolExecutionExceptionProcessor(true);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90042.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90042.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90042.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 趋势日报 (2025年07月20日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图2033maybe737remote-jobs674Hyprland581n8n572shadPS4341bknd281Resume-Matcher249…

替代标准库:实用 C++ 开源组件推荐

C17 及 C20 引入了许多现代化的标准库组件&#xff0c;如 std::filesystem、std::optional、std::format、std::chrono 的增强&#xff0c;以及 std::expected 等。然而&#xff0c;在一些项目中&#xff0c;受限于老版本编译器、不完善的标准库实现&#xff0c;或跨平台兼容性…

夯实基础:配置Java开发环境JDK与构建工具Maven

摘要&#xff1a;在前面两个章节中&#xff0c;我们一同探讨了Spring Boot的革命性优势&#xff0c;并深入其内部&#xff0c;理解了起步依赖、自动配置和内嵌容器这三大核心基石。理论的铺垫是为了更稳健的实践。从本章开始&#xff0c;我们将正式“卷起袖子”&#xff0c;搭建…

PyCharm 未正确关联 .jpg 为图片格式

1. PyCharm 未正确关联 .jpg 为图片格式PyCharm 可能错误地将 .jpg 文件识别为文本文件&#xff0c;导致无法预览图片。解决方法手动关联 .jpg 为图片格式&#xff1a;Windows/Linux: File → SettingsmacOS: PyCharm → Preferences进入 Editor → File Types。在 Recognized …

DM8数据库Docker镜像部署最佳实践

DM8数据库Docker镜像部署最佳实践一、Docker加载DM8镜像二、Docker创建DM8容器三、验证目录是否挂载成功一、Docker加载DM8镜像 1.下载DM8镜像&#xff0c;由于官网暂未提供docker镜像下载&#xff0c;可通过网盘下载&#xff1a;https://pan.quark.cn/s/fe38ba821a2a 2.打开…

数据结构——树(2)

数据结构基础&#xff08;12&#xff09; 文章目录数据结构基础&#xff08;12&#xff09;二叉树的先序遍历先序遍历中序遍历后序遍历二叉树的层序遍历由遍历序列构造二叉树前序 中序遍历序列后序 中序遍历序列层序 中序遍历序列二叉树的中序遍历&#xff08;缺点&#xff…

【C语言进阶】结构体练习:通讯录

要求&#xff1a; 实现一个通讯录。 (1)人的信息&#xff1a; 包括姓名、年龄、性别、电话地址。 (2)功能&#xff1a; ①存放一百个人的信息。 ②增加联系人。 ③删除指定联系人。 ④查找指定联系人。 ⑤修改联系人。 ⑥排序。 ⑦显示联系人。 (3)文件&#xff1a; ①contact.…

缓存三剑客解决方案

缓存三剑客解决方案 1.缓存雪崩 定义&#xff1a; 大量缓存数据在同一时间点集体失效&#xff0c;导致所有请求直接穿透到数据库&#xff0c;引发数据库瞬时高负载甚至崩溃。 解决方案&#xff1a; 设置过期随机值&#xff0c;避免大量缓存同时失效。 // 缓存雪崩防护&#xff…

HTML 页面禁止缩放功能

页面禁止缩放 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1, shrink-to-fitno, maximum-scale1.0, us…

在github上搭建自己主页

主要是这篇博客进行一些补充。 第一步照做就行 首先是第二步 克隆仓库到本地 先下载一个git&#xff0c;电脑创建一个新文件夹&#xff0c;然后 git clone xxxxx 注意即使你使用了代理&#xff0c;这里大概率也会报错&#xff0c;Failed to connect to github.com port 443 …

Laravel 框架NOAUTH Authentication required 错误解决方案-优雅草卓伊凡

Laravel 框架NOAUTH Authentication required 错误解决方案-优雅草卓伊凡NOAUTH Authentication required 错误这个错误通常出现在以下几种情况&#xff1a;Redis 认证问题&#xff1a;如果你的应用使用了 Redis 且配置了密码API 认证问题&#xff1a;请求需要认证的 API 端点但…

kafka生产端和消费端的僵尸实例以及解决办法

目录 一 生产端僵尸 1.1 原因 1.2 问题 1.3解决办法 1.4 案例 1.4.1 案例1&#xff1a;生产者崩溃后重启 (同一 transactional.id) 1.4.2 案例2&#xff1a;短暂网络分区导致的脑裂 1.4.3 案例3&#xff1a;正确 - 解决僵尸 1.4.4 案例4&#xff1a;错误 - 无法解决僵…

国产电科金仓数据库金仓KES V9 2025:AI时代的数据库融合标杆

国产电科金仓数据库金仓KES V9 2025&#xff1a;AI时代的数据库融合标杆 在AI技术迅猛发展的今天&#xff0c;企业数据管理面临着前所未有的挑战&#xff1a;异构数据库兼容难题、多数据模型融合需求、高并发场景性能瓶颈、跨中心容灾压力……这些痛点如同数据流转的大问题&am…

【STM32】关于STM32F407写Flash失败问题的解决办法

问题描述 在使用正点原子的STM32F407写flash例程时&#xff0c;发现STMFLASH_Write函数没办法写入数据到flash&#xff0c;原始代码输入下&#xff1a; 随后对每一行代码的结果进行分析&#xff0c;发现87行的“FLASH_ProgramWord(WriteAddr,*pBuffer)”返回值是7&#xff0c;一…

CUDA与RISC-V的融合:打破架构霸权,重塑AI计算未来

当x86和Arm统治数据中心十余年后,一家GPU巨头正悄悄将十亿颗RISC-V核心嵌入其系统。如今,它决定拆除CPU架构的围墙。 2025年7月,上海张江科学会堂。英伟达硬件工程副总裁Frans Sijstermanns在第五届RISC-V中国峰会上宣布:英伟达正式启动CUDA向RISC-V架构的移植工作。 这个…

微信二维码扫描登录流程详解

二维码扫描登录流程细节&#xff08;项目经验&#xff09; 1&#xff1a; 获取二维码信息 PC会优先存放服务器生成的唯一密钥&#xff1a; 比如 source、secret 以密文形式存储大致发送字段&#xff1a; sourcesecretmac(mac 地址) 服务器生成 二维码信息&#xff1a;二维码字符…

日本上市IT企业|8月125日将在大连举办赴日it招聘会

株式会社GSD的核心战略伙伴贝斯株式会社&#xff0c;将于2025年8月25日在大连香格里拉大酒店商务会议室隆重举办赴日技术人才专场招聘会。本次招聘会面向全国范围内的优秀IT人才&#xff0c;旨在为贝斯株式会社东京本社长期发展招募优质的系统开发与管理人才。招聘计划&#xf…

Python 数据分析与可视化:从基础到进阶的技术实现与优化策略

数据分析与可视化是数据科学领域的核心技能,Python 凭借其丰富的库生态和灵活的编程范式,成为该领域的首选工具。本文将系统讲解 Python 数据分析与可视化的技术栈实现,从基础操作到性能优化,结合实战场景提供可复用的解决方案。 数据分析核心库技术解析 Pandas 数据处理…

Rust Web 全栈开发(十):编写服务器端 Web 应用

Rust Web 全栈开发&#xff08;十&#xff09;&#xff1a;编写服务器端 Web 应用Rust Web 全栈开发&#xff08;十&#xff09;&#xff1a;编写服务器端 Web 应用创建成员库&#xff1a;webappmodelshandlersrouterserrorsmodsvrstaticteachers.htmlregister.htmlbootstrap.m…

每日面试题11:JVM

深入理解JVM&#xff1a;Java的“心脏”如何驱动程序运行&#xff1f;为什么需要JVM&#xff1f;你是否想过&#xff0c;为什么用Java写的程序&#xff0c;能在Windows、Linux、macOS上“无缝运行”&#xff1f;为什么开发者无需为不同操作系统重写代码&#xff1f;这背后的核心…