LangChain【7】之工具創建和錯誤處理策略

文章目錄

  • 一 LangChain 自定義工具概述
  • 二創建自定義工具的三種方法
    • 2.1 方法一:@tool 裝飾器
      • 2.1.1 同步方法案例
      • 2.1.2 工具描述方式1:傳參
      • 2.1.3 工具描述方式2:文檔字符串
    • 2.2 方法二:StructuredTool類
      • 2.2.1 StructuredTool創建自定義工具
      • 2.2.2 StructuredTool配置信息
    • 2.3 方法三:BaseTool類
  • 三 異步工具的實現
  • 四 工具錯誤處理策略

一 LangChain 自定義工具概述

  • LangChain提供了一套工具、組件和接口,可簡化創建由大型語言模型(LLM)和聊天模型提供支持的應用程序的過程。
  • 在構建智能代理時,為其提供合適的工具是確保其強大功能的關鍵,LangChain作為一個支持創建和管理工具的框架,能讓開發者以模塊化方式擴展代理的能力。

  • 當構建代理時,需要為其提供一組工具列表,代理可以使用這些工具。除了調用的實際函數之外,工具由幾個組件組成:
    • name(str)是必需的,并且在提供給代理的工具集中必須是唯一的;
    • description(str)是可選的但建議的,因為代理使用它來確定工具的使用方式;
    • return_direct(bool)默認為False;
    • args_schema(PydanticBaseModel)是可選的但建議的,可以用于提供更多信息或用于驗證預期參數。

二創建自定義工具的三種方法

  • LangChain為開發人員提供了不同的方式來創建工具,這些工具可以被智能代理或語言模型調用。
    • 第一種方法是使用@tool裝飾器(定義自定義工具的最簡單方法);
    • 第二種方法是使用StructuredTool類,允許更細粒度的配置而無需過多的代碼;
    • 第三種方法是基于BaseTool類構造子類顯式自定義工具,工具定義提供最大限度的把控,但需要做更多的工作。

2.1 方法一:@tool 裝飾器

  • 使用@tool修飾符是自定義工具最簡單的方法。默認情況下修飾符用函數的名字作為工具名稱,但傳字符串作為第一個參數可以重命名工具名稱。例如,可以創建一個總是返回字符串"LangChain"的虛構搜索函數,或者將兩個數字相乘的乘法函數。這些函數最大的區別是第一個函數只有一個輸入,第二個函數需要多個輸入。

2.1.1 同步方法案例

from langchain_core.tools import tool
@tool
def multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*bprint(multiply.name) # multiply
print(multiply.description) # Multiply two numbers
print(multiply.args) # {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

2.1.2 工具描述方式1:傳參

  • 通過將工具名稱和 JSON 參數傳遞給工具裝飾器進行自定義
from langchain_core.tools import tool
from pydantic import BaseModel, Fieldclass CalculatorInput(BaseModel):a: int = Field(description="The first number")b: int = Field(description="The second number")@tool("multiplication-tool", args_schema=CalculatorInput, return_direct=True)
def multiply(a: int, b: int) -> int:"""Multiply two numbers"""return a * bprint(multiply.name)  # multiplication-tool
print(multiply.description)  # Multiply two numbers
print(multiply.args)  # {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}
print(multiply.return_direct)  # True

2.1.3 工具描述方式2:文檔字符串

  • @tool 可以選擇性地解析 Google 風格文檔字符串,并將文檔字符串組件(如參數描述)與工具模式的相關部分關聯起來。
@tool(parse_docstring=True)
def foo(bar: str, baz: int) -> str:"""The foo.Args:bar: The bar.baz: The baz."""return bar
foo.args_schema.schema()
{'description': 'The foo.','properties': {'bar': {'description': 'The bar.','title': 'Bar','type': 'string'},'baz': {'description': 'The baz.', 'title': 'Baz', 'type': 'integer'}},'required': ['bar', 'baz'],'title': 'fooSchema','type': 'object'}

2.2 方法二:StructuredTool類

  • 使用StructuredTool類,允許更細粒度的配置而無需過多的代碼

2.2.1 StructuredTool創建自定義工具

  • 使用StructuredToolfrom_function可以創建自定義工具,包含兩個參數func,coroutine,分別指定同步方法和異步方法。
import asyncio
from langchain_core.tools import StructuredTooldef multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*b
async def a_multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*basync def main():calculator=StructuredTool.from_function(func=multiply,coroutine=a_multiply)print(calculator.run({"a":2, "b":3}))print(calculator.invoke({"a":2, "b":3}))print(await calculator.ainvoke({"a":2, "b":5}))asyncio.run(main())

2.2.2 StructuredTool配置信息

import asyncio
from langchain_core.tools import StructuredTool
from pydantic import Field, BaseModelclass CalculatorInput(BaseModel):a: int = Field(description="The first number")b: int = Field(description="The second number")#創建同步、異步包裝器函數
def multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*b
async def async_multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*basync def main():calculator=StructuredTool.from_function(func=multiply,name="calculator",description="Multiply two numbers",args_schema=CalculatorInput,coroutine=async_multiply,return_direct=True)print(calculator.name)print(calculator.description)print(calculator.args)asyncio.run(main())

2.3 方法三:BaseTool類

  • 接受字符串或 dict 輸入的 LangChain Runnables 可以使用 as_tool 方法轉換為工具,該方法允許為參數指定名稱、描述和其他模式信息。
# 導入所需的模塊
from langchain_core.language_models import GenericFakeChatModel  # 導入一個假的聊天模型,用于測試
from langchain_core.output_parsers import StrOutputParser  # 導入字符串輸出解析器
from langchain_core.prompts import ChatPromptTemplate  # 導入聊天提示模板# 創建一個聊天提示模板,包含一個占位符 {answer_style}
prompt = ChatPromptTemplate.from_messages([("human", "Hello. Please respond in the style of {answer_style}.")]
)# 創建一個假的聊天模型實例,并提供一個固定的響應
llm = GenericFakeChatModel(messages=iter(["hello matey"]))# 構建一個鏈式調用:先應用提示模板,然后調用 LLM,最后解析輸出為字符串
chain = prompt | llm | StrOutputParser()# 將 chain 轉換為一個工具(Tool),并指定名稱和描述
as_tool = chain.as_tool(name="Style responder", description="Description of when to use tool."
)# 打印工具的參數信息
print(as_tool.args) # {'answer_style': {'title': 'Answer Style', 'type': 'string'}}

三 異步工具的實現

  • LangChain的工具可以實現異步版本,以節省計算資源和提高效率。在定義異步工具時,需要使用async/await語法,并確保函數和工具名準確反映功能,提供詳細的文檔字符串。對于涉及外部API調用的工具,建議使用API代理服務來提高訪問的穩定性,并確保異步工具充分利用并發優勢,避免阻塞操作。
from langchain_core.tools import tool@tool
async def multiply(a:int,b:int)->int:"""Multiply two numbers"""return a*bprint(multiply.name) # multiply
print(multiply.description) # Multiply two numbers
print(multiply.args) # {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}

四 工具錯誤處理策略

  • 為了讓代理能從錯誤中恢復并繼續執行,需要特定的錯誤處理策略。可以拋出ToolException并定義錯誤處理函數,設置handle_tool_error屬性來定義工具錯誤的應對策略,可以是字符串、布爾值或函數。需要注意的是僅引發ToolException是無效的,需要先設置該工具的handle_tool_error,因為它的默認值為False
from langchain_core.tools import StructuredTool
from langchain_core.tools import ToolExceptiondef get_weather(city: str) -> str:"""獲取給定城市的天氣。"""raise ToolException(f"錯誤:沒有名為{city}的城市。")get_weather_tool = StructuredTool.from_function(func=get_weather,# 默認情況下,如果函數拋出TooLException,則將TooLException的message作為響應。# 如果設置為True,則將返回TooLException異常文本,False將會拋出TooLExceptionhandle_tool_error=True,
)response = get_weather_tool.invoke({"city":"天京"})
print(response) # 錯誤:沒有名為天京的城市。
  • 定義異常處理
from langchain_core.tools import StructuredTool
from langchain_core.tools import ToolExceptiondef get_weather(city: str) -> str:"""獲取給定城市的天氣。"""raise ToolException(f"錯誤:沒有名為{city}的城市。")get_weather_tool = StructuredTool.from_function(func=get_weather,handle_tool_error="沒有找到這個城市",
)response = get_weather_tool.invoke({"city":"天京"})
print(response) # 沒有找到這個城市
  • 異常個性化處理
from langchain_core.tools import StructuredTool
from langchain_core.tools import ToolExceptiondef get_weather(city: str) -> str:"""獲取給定城市的天氣。"""raise ToolException(f"錯誤:沒有名為{city}的城市。")def _handle_tool_error(error: ToolException) -> str:"""處理工具錯誤。"""return f"工具執行期間發生以下錯誤:`{error.args[0]}`"get_weather_tool = StructuredTool.from_function(func=get_weather,handle_tool_error=_handle_tool_error
)response = get_weather_tool.invoke({"city":"天京"})
print(response) # 工具執行期間發生以下錯誤:`錯誤:沒有名為天京的城市。`

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

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

相關文章

【信息系統項目管理師-選擇真題】2025上半年(第二批)綜合知識答案和詳解(回憶版)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 【第1題】【第2題】【第3題】【第4題】【第5題】【第6題】【第7題】【第8題】【第9題】【第10題】【第11題】【第12題】【第13題】【第14題】【第15題】【第16題】【第17題】【第18題】【第19題】【第20題】【第…

「EN 18031」訪問控制機制(ACM - 1):智能路由器的安全守衛

家用路由器要是出口歐洲,可得留意歐盟EN18031標準里的訪問控制機制。以路由器為例,訪問控制機制(ACM)能決定誰能連入網絡、訪問哪些網站。比如通過設置不同的用戶角色和權限,家長可以限制孩子設備的上網時間和可訪問的…

關于項目多語言化任務的概述

今天的任務一個是關于多語言化的,也就是i18n,我需要做的呢首先是知道項目多語言是怎么實現的,一般情況下沒有多語言化這個功能的時候,我們會寫一個頁面,默認是英文,然后里面的文本都是英文,那么…

護網行動面試試題(2)

文章目錄 51、常見的安全工具有哪些?52、說說Nmap工具的使用?53、近幾年HW常見漏洞有哪些?54、HW 三(四)大洞56、獲得文件讀取漏洞,通常會讀哪些文件57、了解過反序列化漏洞嗎?58、常見的框架漏…

Transformer-BiGRU多變量時序預測(Matlab完整源碼和數據)

Transformer-BiGRU多變量時序預測(Matlab完整源碼和數據) 目錄 Transformer-BiGRU多變量時序預測(Matlab完整源碼和數據)效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現Transformer-BiGRU多變量時間序列預測&…

SOC-ESP32S3部分:31-ESP-LCD控制器庫

飛書文檔https://x509p6c8to.feishu.cn/wiki/Syy3wsqHLiIiQJkC6PucEJ7Snib ESP 系列芯片可以支持市場上常見的 LCD(如 SPI LCD、I2C LCD、并行 LCD (Intel 8080)、RGB/SRGB LCD、MIPI DSI LCD 等)所需的各種時序。esp_lcd 控制器為上述各類 LCD 提供了一…

蘋果電腦深度清理,讓老舊Mac重煥新生

在日常使用蘋果電腦的過程中,隨著時間推移,系統內會積累大量冗余數據,導致電腦運行速度變慢、磁盤空間緊張。想要讓設備恢復流暢,蘋果電腦深度清理必不可少。那么,如何進行蘋果電腦深度清理呢?接下來為你詳…

如何處理React中表單的雙向數據綁定?

在前端開發中,雙向數據綁定(Two-way Data Binding)是指視圖(View)與數據模型(Model)之間保持同步:當模型發生變化時,視圖會自動更新;當視圖(用戶輸…

手機上網可以固定ip地址嗎?詳細解析

在移動互聯網時代,手機已成為人們日常上網的主要設備之一。無論是工作、學習還是娛樂,穩定的網絡連接都至關重要。許多用戶對IP地址的概念有所了解,尤其是固定IP地址的需求。那么,手機上網能否固定IP地址?又該如何實現…

Spring Boot + Prometheus 實現應用監控(基于 Actuator 和 Micrometer)

文章目錄 Spring Boot Prometheus 實現應用監控(基于 Actuator 和 Micrometer)環境準備示例結構啟動和驗證驗證 Spring Boot 應用Prometheus 抓取配置(靜態方式)Grafana 面板配置總結 Spring Boot Prometheus 實現應用監控&…

rk3588 上運行smolvlm-realtime-webcam,將視頻轉為文字描述

smolvlm-realtime-webcam 是一個開源項目,結合了輕量級多模態模型 SmolVLM 和本地推理引擎 llama.cpp,能夠在本地實時處理攝像頭視頻流,生成自然語言描述, 開源項目地址 https://github.com/ngxson/smolvlm-realtime-webcamhttps…

原生js操作元素類名(classList,classList.add...)

1、classList classList屬性是一個只讀屬性&#xff0c;返回元素的類名&#xff0c;作為一個DOMTokenList集合(用于在元素中添加&#xff0c;移除及切換css類) length:返回類列表中類的數量&#xff0c;該屬性是只讀的 <style> .lis { width: 200px; …

九.C++ 對引用的學習

一.基本概念 引用即內存的別名 int a 10; int& b a; 引用本身不占用內存&#xff0c;并非實體&#xff0c;對引用的所有操作都是在對目標內存進行操作 引用必須初始化&#xff0c;且不能更換對象 int c 5; b c; // 僅僅是在對引用的目標內存進行賦值 #include <ios…

7.2.1_順序查找

知識總覽&#xff1a; 順序查找&#xff1a; 算法思想&#xff1a; 從頭到腳挨個找或者從腳到頭挨個找適用于線性表(順序存儲和鏈式存儲都適用)&#xff0c;又叫線性查找 實現&#xff1a; 1個數組elem指向數組的起始位置&#xff0c;索引從0開始遍歷數組直到找到目標值返回…

視覺SLAM基礎補盲

3D Gaussian Splatting for Real-Time Radiance Field Rendering SOTA方法3DGS contribution傳統重建基于點的渲染NeRF 基礎知識補盲光柵化SFM三角化極線幾何標準的雙目立體視覺立體匹配理論與方法立體匹配的基本流程李群和李代數 李群和李代數的映射李代數的求導李代數解決求導…

如何利用 Redis 實現跨多個無狀態服務實例的會話共享?

使用 Redis 實現跨多個無狀態服務實例的會話共享是一種非常常見且有效的方案。無狀態服務本身不存儲會話信息&#xff0c;而是將用戶的會話數據集中存儲在外部存儲中&#xff08;如 Redis&#xff09;&#xff0c;這樣任何一個服務實例都可以通過查詢外部存儲來獲取和更新用戶的…

《chipyard》docker使用

一、啟動/重啟服務 二、登入/退出 容器對象查看 sudo docker ps -a # 查看容器列表 登入已例化的容器 sudo docker exec -it -u root 737ed3ddd5ff bash # 737ed3ddd5ff<容器名稱/ID> 三、容器編輯 刪除單個容器 sudo docker stop <容器ID> #停止容器 s…

瀏覽器工作原理06 [#]渲染流程(下):HTML、CSS和JavaScript是如何變成頁面的

引用 瀏覽器工作原理與實踐 簡單回顧下上節前三個階段的主要內容&#xff1a;在HTML頁面內容被提交給渲染引擎之后&#xff0c;渲染引擎首先將HTML解析為瀏覽器可以理解的DOM&#xff1b;然后根據CSS樣式表&#xff0c;計算出DOM樹所有節點的樣式&#xff1b;接著又計算每個元素…

AI書簽管理工具開發全記錄(十三):TUI基本框架搭建

文章目錄 AI書簽管理工具開發全記錄&#xff08;十三&#xff09;&#xff1a;TUI基本框架搭建前言 &#x1f4dd;1.TUI介紹 &#x1f50d;2. 框架選擇 ??3. 功能梳理 &#x1f3af;4. 基礎框架搭建??4.1 安裝4.2 參數設計4.3 繪制ui4.3.1 設計結構體4.3.2 創建頭部4.3.3 創…

CC7利用鏈深度解析

CommonsCollections7&#xff08;CC7&#xff09;是CC反序列化利用鏈中的重要成員&#xff0c;由Matthias Kaiser在2016年發現。本文將從底層原理到實戰利用&#xff0c;全面剖析這條獨特而強大的利用鏈。 一、CC7鏈技術定位 1.1 核心價值 無第三方依賴&#xff1a;僅需JDK原…