Spring AI 工具調用

文章目錄

    • 簡述
    • 工具定義
    • 工具上下文
    • 直接返回
        • 方法:直接返回
    • 工具執行
        • 框架控制工具執行
        • 用戶控制的工具執行
        • 異常處理

在這里插入圖片描述

簡述

工具調用(也稱為函數調用)是 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;這背后的核心…