LangChain組件Tools/Toolkits詳解(6)——特殊類型注解Annotations
- 本篇摘要
- 14. LangChain組件Tools/Toolkits詳解
- 14.6 特殊類型注解Annotations
- 14.6.1 特殊類型注解分類
- 14.6.1 InjectedToolArg構建運行時綁定值工具
- 14.6.3 查看并傳入參數
- 14.6.4 在運行時注入參數
- 14.6.5 其它特殊類型注解
- 參考文獻
本章目錄如下:
- 《LangChain組件Tools/Toolkits詳解(1)——Tools接口與創建工具概述》
- 《LangChain組件Tools/Toolkits詳解(2)——裝飾器@tool》
- 《LangChain組件Tools/Toolkits詳解(3)——結構化工具StructuredTool》
- 《LangChain組件Tools/Toolkits詳解(4)——處理Error》
- 《LangChain組件Tools/Toolkits詳解(5)——返回產物artifact》
- 《LangChain組件Tools/Toolkits詳解(6)——特殊類型注解》
- 《LangChain組件Tools/Toolkits詳解(7)——工具調用與Toolkits》
本篇摘要
本章介紹LangChain組件Tools/Toolkits。
14. LangChain組件Tools/Toolkits詳解
工具(Tools)是一種封裝函數及其模式schema的方法,可以傳遞給聊天模型,使模型能夠請求執行帶有特定輸入的工具函數,例如從數據庫獲取數據、發出API請求或運行自定義代碼。LangChain中的tool抽象類將Python函數與定義函數名稱、描述和預期參數的模式schema關聯起來,以明確創建工具的作用及調用方式。本節將從Tools接口與創建工具概述、裝飾器@tool、結構化工具StructuredTool、處理Error、返回產物artifact、特殊類型注解、工具調用和Toolkits等方面詳細介紹工具。
14.6 特殊類型注解Annotations
在工具的函數簽名中,可以使用一些特殊的類型注解(Special Type Annotations)來配置工具的運行時行為。本節將講述其分類及使用方法。
14.6.1 特殊類型注解分類
常用的特殊類型注解有以下幾種,下面注解將從工具的模式schema中移除相應的參數,這對于不應暴露給模型且模型不應控制的參數非常有用:
- InjectedToolArg:值應在運行時使用.invoke或.ainvoke手動注入;
- RunnableConfig:將RunnableConfig對象傳遞給工具;
- InjectedState:將LangGraph圖的整體狀態傳遞給工具;
- InjectedStore:將LangGraph存儲對象傳遞給工具。
我們還可以使用Annotated類型與上面參數的字符串字面量(string literal)結合,為工具模式中暴露的相關參數提供描述,其調用格式為:
- Annotated[type, “string literal”]:為參數添加描述,該描述將暴露在工具的模式中。
14.6.1 InjectedToolArg構建運行時綁定值工具
運行時綁定值:我們有時可能需要將僅在運行時已知的值綁定到工具,例如工具邏輯可能需要使用發起請求的用戶ID。在大多數情況下,這些值不應由LLM(大語言模型)控制,因為允許LLM控制用戶ID可能會導致安全風險,它們應由應用程序邏輯固定。為此我們使用InjectedToolArg注解來標記工具的某些參數,它允許從工具的模式中隱藏某些參數。下面將展示如何防止模型生成某些工具參數,并在運行時直接注入這些參數。
關于兼容性,本部分代碼需要langchain-core >= 0.2.21,請確保已安裝正確版本的包。另外對于LangGraph,請參考How to pass runtime values to tools,它講述如何創建一個代理來跟蹤給定用戶最喜歡的寵物。
例如當工具需要在運行時動態注入user_id,首先以Anthropic為例創建LLM:
# !pip install -qU "langchain[anthropic]"
import getpass
import osif not os.environ.get("ANTHROPIC_API_KEY"):os.environ["ANTHROPIC_API_KEY"] = getpass.getpass("Enter API key for Anthropic: ")from langchain.chat_models import init_chat_modelllm = init_chat_model("claude-3-5-sonnet-latest", model_provider="anthropic")
然后通過使用InjectedToolArg注解user_id參數,告訴LangChain該參數不應作為工具模式的一部分暴露:
from typing import List
from langchain_core.tools import InjectedToolArg, tool
from typing_extensions import Annotateduser_to_pets = {}
@tool(parse_docstring=True)
def update_favorite_pets(pets: List[str], user_id: Annotated[