工具呼叫
概述
許多人工智慧應用程式直接與人類互動。在這些情況下,模型以自然語言回應是適當的。但是,如果我們希望模型也*直接*與系統互動,例如資料庫或 API 呢?這些系統通常有特定的輸入架構;例如,API 通常有要求的有效負載結構。這種需求促成了*工具呼叫*的概念。您可以使用工具呼叫來請求符合特定架構的模型回應。
您有時會聽到術語「函數呼叫」。我們將此術語與「工具呼叫」交替使用。
主要概念
(1) 工具建立:使用 @tool 裝飾器建立工具。工具是函數及其架構之間的關聯。(2) 工具綁定:工具需要連接到支援工具呼叫的模型。這讓模型意識到工具以及工具所需的相關輸入架構。(3) 工具呼叫:在適當的情況下,模型可以決定呼叫工具,並確保其回應符合工具的輸入架構。(4) 工具執行:可以使用模型提供的參數執行工具。
建議用法
此偽代碼說明了使用工具呼叫的建議工作流程。建立的工具作為列表傳遞給 .bind_tools()
方法。可以像往常一樣呼叫此模型。如果進行工具呼叫,模型的回應將包含工具呼叫參數。工具呼叫參數可以直接傳遞給工具。
# Tool creation
tools = [my_tool]
# Tool binding
model_with_tools = model.bind_tools(tools)
# Tool calling
response = model_with_tools.invoke(user_input)
工具建立
建立工具的建議方法是使用 @tool
裝飾器。
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""Multiply a and b."""
return a * b
工具綁定
請參閱我們的模型整合頁面,以獲取支援工具呼叫的供應商列表。
要理解的核心概念是 LangChain 提供了用於將工具連接到模型的標準化介面。.bind_tools()
方法可用於指定哪些工具可供模型呼叫。
model_with_tools = model.bind_tools(tools_list)
作為一個具體範例,讓我們取一個函數 multiply
並將其作為工具綁定到支援工具呼叫的模型。
def multiply(a: int, b: int) -> int:
"""Multiply a and b.
Args:
a: first int
b: second int
"""
return a * b
llm_with_tools = tool_calling_model.bind_tools([multiply])
工具呼叫
工具呼叫的一個關鍵原則是模型根據輸入的相關性決定何時使用工具。模型不總是需要呼叫工具。例如,給定一個不相關的輸入,模型將不會呼叫工具
result = llm_with_tools.invoke("Hello world!")
結果將是一個包含模型自然語言回應的 AIMessage
(例如,「Hello!」)。但是,如果我們傳遞與工具相關的輸入,模型應該選擇呼叫它
result = llm_with_tools.invoke("What is 2 multiplied by 3?")
與之前一樣,輸出 result
將是一個 AIMessage
。但是,如果呼叫了工具,result
將具有 tool_calls
屬性。此屬性包含執行工具所需的一切,包括工具名稱和輸入參數
result.tool_calls
{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'xxx', 'type': 'tool_call'}
有關使用方式的更多詳細資訊,請參閱我們的操作指南!
工具執行
工具實現了 Runnable 介面,這意味著它們可以直接被調用 (例如,tool.invoke(args)
)。
LangGraph 提供了預先構建的組件 (例如,ToolNode
),這些組件通常會代表用戶調用工具。
- 請參閱我們的工具呼叫操作指南。
- 請參閱 LangGraph 文檔,了解如何使用 ToolNode。
最佳實踐
在設計模型使用的工具時,重要的是要記住
- 具有顯式工具呼叫 API 的模型將比非微調模型更擅長工具呼叫。
- 如果工具具有精心選擇的名稱和描述,模型將表現更好。
- 簡單、範圍狹窄的工具比複雜的工具更容易讓模型使用。
- 要求模型從大量工具列表中進行選擇會對模型構成挑戰。