SpringAI系列4: Tool Calling 工具調用 【感覺這版本有bug】

前言:在最近發布的 Spring AI 1.0.0.M6 版本中,其中一個重大變化是 Function Calling 被廢棄,被 Tool Calling 取代。Tool Calling工具調用(也稱為函數調用)是AI應用中的常見模式,允許模型通過一組API或工具進行交互,從而增強其能力


1、Tool Calling 工具調用 簡介

Spring AI 中的工具調用使 AI 模型能夠與外部工具和服務交互,從而增強其功能。Tool Calling 工具調用允許 AI 模型執行外部函數、訪問外部服務、執行復雜操作和與現有系統集成

主要使用的場景:

  1. 信息檢索(Information Retrieval)。

    此類工具可用于從外部資源(如數據庫、Web服務、文件系統或者 WEB 搜索引擎)檢索信息。

    目標:增強模型的知識,使其能夠回答其其它方式不能回答的問題。例如,工具用于檢索給定的位置天氣、檢索最新的新聞文章或者查詢數據庫。

  2. 采取行動(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)主要操作流程

  1. 定義工具 :當需要向模型提供工具時,需在聊天請求中包含其定義。每個工具定義包含名稱、描述及輸入參數的模式(schema)。

  2. 模型發起調用 :當模型決定調用工具時,會返回包含工具名稱和符合預定義模式的輸入參數的響應。

  3. 應用執行工具 :應用程序負責根據工具名稱識別并執行對應工具,傳入提供的輸入參數。

  4. 處理結果 :工具調用的結果由應用程序處理。

  5. 返回結果至模型 :應用程序將工具調用結果返回給模型。

  6. 生成最終響應 :模型結合工具調用結果作為上下文生成最終響應

(2)源碼

?
@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Tool {/*** 指定工具的名稱,如果不指定則默認使用方法名稱。* 注意:方法名稱的唯一性*/String name() default "";/*** 工具的描述,模型可以使用它來了解何時以及如何調用工具,如果不指定則使用方法名。* 強烈建議:詳細,清晰的描述工具的功能,這對于工具的使用至關重要,直接影響大模型的* 使用效果。*/String description() default "";/*** 指定工具執行的結果是直接返回,還是要發給大模型,默認發送給大模型*/boolean returnDirect() default false;/*** 指定工具執行結果轉換器。Spring AI 內置一個默認轉換為String,如果有特殊業務* 需求可自行實現。*/Class<? extends ToolCallResultConverter> resultConverter() default DefaultToolCallResultConverter.class;}?

4、Tool Calling 快速入門?

讓我們通過一個示例了解如何在Spring AI中使用工具調用。我們將實現兩個簡單工具:一個用于信息檢索,另一個用于執行操作。信息檢索工具用于獲取用戶時區的當前日期和時間,操作工具用于設置指定時間的鬧鐘。

(1)信息檢索

AI模型無法訪問實時信息。任何涉及當前日期、天氣預報等實時信息的問題,模型都無法直接回答。但我們可以提供能夠檢索此類信息的工具,并讓模型在需要實時數據時調用這些工具。

首先在DateTimeTools類中實現一個獲取用戶時區當前日期時間的工具。該工具不需要參數,通過Spring框架的LocaleContextHolder獲取用戶時區。工具方法使用@Tool注解,并添加詳細描述幫助模型理解調用時機。

package com.hs.demo.tool;import org.springframework.ai.tool.annotation.Tool;
import org.springframework.context.i18n.LocaleContextHolder;import java.time.LocalDateTime;public class DateTimeTools {@Tool(description = "獲取用戶時區的當前日期和時間")String getCurrentDateTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}}

接下來將工具提供給模型,本例使用ChatClient與模型交互,通過tools()方法傳入DateTimeTools實例。當模型需要實時時間信息時,會自動請求調用該工具。ChatClient會執行工具調用并將結果返回給模型,模型結合結果生成最終響應。

輸出示例:

明天是2025-05-30。

如果直接提問但不提供工具,模型將返回:

我無法訪問實時信息,請提供當前日期以便計算明天的日期。

這證明模型在缺乏工具時無法自主獲取實時數據

?(2)? 執行操作

AI模型可以生成實現目標的計劃(如制定瑞士旅行計劃),但無法直接執行。此時需要工具來落實模型生成的計劃。

我們將定義第二個工具,用于在特定時間設置鬧鐘。在第一個工具的基礎上,先獲取當前時間,在當前時間的基礎上設置鬧鐘。在現有DateTimeTools類中新增設置鬧鐘的工具。該工具接收ISO-8601格式的時間參數,向控制臺輸出鬧鐘設置信息。同樣使用@Tool注解并添加詳細描述

class DateTimeTools {@Tool(description = "獲取用戶時區的當前日期和時間")String getCurrentDateTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}@Tool(description = "為指定ISO-8601時間設置用戶鬧鐘")void setAlarm(String time) {LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);System.out.println("鬧鐘已設置為 " + alarmTime);}
}

通過ChatClient同時提供兩個工具。當請求"10分鐘后設置鬧鐘"時,模型會先調用getCurrentDateTime獲取當前時間,計算目標時間后調用setAlarm工具。ChatClient自動處理工具調用請求并返回結果,模型最終生成響應

ChatModel chatModel = ...String response = ChatClient.create(chatModel).prompt("能設置10分鐘后的鬧鐘嗎?").tools(new DateTimeTools()).call().content();System.out.println(response);

應用日志將顯示正確設置的鬧鐘時間,驗證工具調用流程


參考鏈接:

Spring AI 框架在升級,Function Calling 廢棄,被 Tool Calling 取代

Spring AI之工具調用_springai-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83050.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第六十三節:深度學習-模型推理與后處理

深度學習模型訓練完成后,如何高效地將其部署到實際應用中并進行準確預測?這正是模型推理與后處理的核心任務。OpenCV 的 dnn 模塊為此提供了強大支持,本文將深入探討 OpenCV 在深度學習模型推理與后處理中的關鍵技術與實踐。 第一部分:基礎概念與環境搭建 1.1 核心概念解析…

uniapp開發企業微信小程序時 wx.qy.login 在uniapp中使用的時候,需要導包嗎?

在 UniApp 中使用 “wx.qy.login” 不需要手動導包&#xff0c;但需要滿足以下條件&#xff1a; 一、環境要求與配置 1&#xfffd; 企業微信環境判斷 必須確保當前運行環境是企業微信客戶端&#xff0c;通過 “uni.getSystemInfoSync().environment” 判斷是否為 “wxwork”…

ONLYOFFICE文檔API:更強的安全功能

在數字化辦公時代&#xff0c;文檔的安全性與隱私保護已成為企業和個人用戶的核心關切。如何確保信息在存儲、傳輸及協作過程中的安全&#xff0c;是開發者與IT管理者亟需解決的問題。ONLYOFFICE作為一款功能強大的開源辦公套件&#xff0c;不僅提供了高效的文檔編輯與協作體驗…

Linux系統編程之共享內存

概述 在Linux系統中&#xff0c;共享內存也是一種高效的進程間通信機制&#xff0c;允許兩個或多個進程共享同一塊物理內存區域。通過這種方式&#xff0c;不同進程可以直接訪問和操作相同的數據&#xff0c;從而避免了數據的復制。由于數據直接在內存中共享&#xff0c;沒有額…

零知開源——STM32F407VET6驅動Flappy Bird游戲教程

簡介 本教程使用STM32F407VET6零知增強板驅動3.5寸TFT觸摸屏實現經典Flappy Bird游戲。通過觸摸屏控制小鳥跳躍&#xff0c;躲避障礙物柱體&#xff0c;挑戰最高分。項目涉及STM32底層驅動、圖形庫移植、觸摸控制和游戲邏輯設計。 目錄 簡介 一、硬件準備 二、軟件架構 三、…

Elasticsearch創建快照倉庫報錯處理

創建快照倉庫報錯&#xff1a; 根據報錯提示的信息&#xff0c;問題可能出在 Elasticsearch 的配置中。當你嘗試創建一個文件系統&#xff08;fs&#xff09;類型的快照倉庫時&#xff0c;雖然已經指定了 location 參數&#xff0c;但 Elasticsearch 仍然報錯&#xff0c;這通…

服務器如何配置防火墻管理端口訪問?

配置服務器防火墻來管理端口訪問&#xff0c;是保障云服務器安全的核心步驟。下面我將根據你使用的不同操作系統&#xff08;Linux: Ubuntu/Debian/CentOS&#xff1b;Windows Server&#xff09;介紹常用防火墻配置方法。 ? 一、Linux 防火墻配置&#xff08;UFW / firewalld…

Redis最佳實踐——安全與穩定性保障之連接池管理詳解

Redis 在電商應用的連接池管理全面詳解 一、連接池核心原理與架構 1. 連接池工作模型 #mermaid-svg-G7I3ukCljlJZAXaA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G7I3ukCljlJZAXaA .error-icon{fill:#552222;}…

打印機無法遠程打印?可以本地打印,本地網絡打印機設置給異地使用

很多小伙伴常有打印、遠程打印的需求&#xff0c;特別是對于電商人、跨境電商、教師、產品經理、實驗人員等群體來說掌握這項技能可謂是能夠在很多場景下帶來便捷&#xff0c;大幅提升做事效率&#xff01;打印機是家庭和企業經常用到的設備&#xff0c;很多情況下會遇到本地可…

【Linux】進程地址空間揭秘(初步認識)

10.進程地址空間&#xff08;初步認識&#xff09; 文章目錄 10.進程地址空間&#xff08;初步認識&#xff09;一、進程地址空間的實驗現象解析二、進程地址空間三、虛擬內存管理補充&#xff1a;數據的寫時拷貝&#xff08;淺談&#xff09;補充&#xff1a;頁表&#xff08;…

深入探討redis:主從復制

前言 如果某個服務器程序&#xff0c;只部署在一個物理服務器上就可能會面臨一下問題(單點問題) 可用性問題&#xff0c;如果這個機器掛了&#xff0c;那么對應的客戶端服務也相繼斷開性能/支持的并發量有限 所以為了解決這些問題&#xff0c;就要引入分布式系統&#xff0c…

MacOS安裝Docker Desktop并漢化

1. 安裝Docker Desktop 到Docker Desktop For Mac下載對應系統的Docker Desktop 安裝包&#xff0c;下載后安裝&#xff0c;沒有賬號需要注冊&#xff0c;然后登陸即可。 2. 漢化 前往漢化包下載鏈接下載對應系統的.asar文件 然后將安裝好的文件覆蓋原先的文件app.asar文件…

索引的選擇與Change Buffer

1. 索引選擇與Change Buffer 問題引出&#xff1a;普通索引 vs 唯一索引 ——如何選擇&#xff1f; 在實際業務中&#xff0c;如果一個字段的值天然具有唯一性&#xff08;如身份證號&#xff09;&#xff0c;并且業務代碼已確保無重復寫入&#xff0c;那就存在兩種選擇&…

lua注意事項

感覺是lua的一大坑啊&#xff0c;它還不如函數內部就局部變量呢 注意函數等內部&#xff0c;全部給加上local得了

【多線程初階】死鎖的產生 如何避免死鎖

文章目錄 關于死鎖一.死鎖的三種情況1.一個線程,一把鎖,連續多次加鎖2.兩個線程,兩把鎖3.N個線程,M把鎖 --哲學家就餐問題 二.如何避免死鎖死鎖是如何構成的(四個必要條件)打破死鎖 三.死鎖小結 關于死鎖 一.死鎖的三種情況 1.一個線程,一把鎖,連續多次加鎖 -->由synchroni…

【NLP基礎知識系列課程-Tokenizer的前世今生第二課】NLP 中的 Tokenizer 技術發展史

從詞表到子詞&#xff1a;Tokenizer 的“進化樹” 我們常說“語言模型是理解人類語言的工具”&#xff0c;但事實上&#xff0c;模型能不能“理解”&#xff0c;關鍵要看它接收到了什么樣的輸入。而 Tokenizer&#xff0c;就是這一輸入階段的設計者。 在 NLP 的發展歷程中&am…

Rust 學習筆記:循環和迭代器的性能比較

Rust 學習筆記&#xff1a;循環和迭代器的性能比較 Rust 學習筆記&#xff1a;循環和迭代器的性能比較示例 1示例 2總結 Rust 學習筆記&#xff1a;循環和迭代器的性能比較 示例 1 我們運行一個基準測試&#xff0c;將《福爾摩斯探案集》的全部內容加載到一個字符串中&#x…

pod創建和控制

一、引言 ?主題?&#xff1a;pod以及控制器模式中的Deployment作用。?控制器模式&#xff1a;使用一種API對象&#xff08;如Deployment&#xff09;管理另一種API對象&#xff08;如Pod&#xff09;的方式。 二、容器鏡像與配置文件 ?容器鏡像?&#xff1a;應用開發者…

HTML實戰:愛心圖的實現

設計思路 使用純CSS創建多種風格的愛心 添加平滑的動畫效果 實現交互式愛心生成器 響應式設計適應不同設備 優雅的UI布局和色彩方案 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta nam…

2022年 中國商務年鑒(excel電子表格版)

2022年 中國商務年鑒&#xff08;excel電子表格版&#xff09;.ziphttps://download.csdn.net/download/2401_84585615/89772883 https://download.csdn.net/download/2401_84585615/89772883 《中國商務年鑒2022》是由商務部國際貿易經濟合作研究院主辦的年度統計資料&#xf…