我們在介紹在 MRKL時有提到,調用工具(Tool) 是讓模型具備「行動能力」的核心組件。
在MRKL的框架下(其實AI Agent都是如此),LLM 並不直接回答所有問題,而是判斷問題是否有合適的tool能幫助LLM更正確的完成任務,tool有可能是一個函式或外部 API,能幫助取得資訊、計算結果或查詢資料,透過「模組化推理」與「外部工具整合」能讓 Agent 更聰明、更可控。
但有些讀者可能會覺得:"現在AI Agent調用東西不是都要用**MCP(Model Context Protocol)**嗎?為什麼還要學用tool?"
這邊整理一張小表供各位讀者比較參考
MCP(Model Context Protocol)
MCP 是一種讓模型與外部系統「安全、結構化」互動的協定,
它更像是一種 標準化的插件介面(Plugin Layer),
讓各種 LLM 都能透過統一協定安全地呼叫外部資源。
比較面向 | LangChain Tool | MCP (Model Context Protocol) |
---|---|---|
定位 | 框架內部功能模組 | 跨模型、跨系統的標準協定 |
作用層級 | 屬於應用層(由開發者定義) | 屬於協定層(由框架與系統溝通) |
調用方式 | LLM 根據 description 自行選擇執行 | 系統依協定暴露可呼叫的端點 |
靈活度 | 高,可快速自定義工具邏輯 | 高度標準化,整合性更強但開發需符合協定 |
典型用途 | 在 Agent 架構中讓模型執行任務 | 在多服務整合或雲端環境中標準化模型能力 |
部署場景 | 應用開發、RAG、企業內部 Agent | 平台級整合、跨 LLM 通訊 |
雖然 MCP 帶來了統一標準與更強整合性,
但在實務上,Tool 仍是最直接、靈活且可控的設計方式。
理解 Tool 架構,你能:
因此,筆者認為在邁向 MCP 之前,
掌握 Tool 架構,仍然是理解「模型如何思考與行動」的最佳起點。
現在我們回到LangChain,在 LangChain 的 Agent 架構 中,Tool
是讓模型具備「行動能力」的核心元件,能讓 LLM 不再只是被動生成文字,而能主動調用外部功能:
查資料、算數學、執行 Python、呼叫企業內部系統……
換句話說,Tool 是讓模型「動起來」的第一步。
LangChain 的 Tool
本質上是一個封裝好的「函式」,
其主要目的是讓 Agent 在推理過程中能夠:
在設計 Agent 前,我們通常會先定義可使用的工具清單:
name
: 工具名稱(讓 LLM 可識別)description
: 工具用途(幫助 LLM 選擇)func
: 實際執行的 Python 函式這些工具會被傳入 Agent,如同給模型一組可呼叫的「API 目錄」。
LangChain 內建的基礎類別是 BaseTool
或更簡化的 Tool
。
一個 Tool 一般包含三個重點:
屬性/方法 | 說明 |
---|---|
name |
工具名稱,LLM 用來辨識調用哪個工具 |
description |
工具描述,幫助模型選擇合適工具 |
_run() |
同步執行邏輯(主要邏輯實作) |
_arun() |
非同步執行邏輯(可選) |
流程可視為:
User Input → LLM → Tool Selection → Execute Tool → Return Output → LLM → Final Answer
在實務上設計 Tool 時,有幾個重點原則:
description
要明確,讓模型知道什麼時候用這個工具。args_schema
定義輸入欄位與型別,提升正確率。以下是一個簡單示範:
定義兩個工具,並讓 Agent 自動選擇使用。
from langchain.tools import BaseTool
from langchain.agents import initialize_agent, AgentType
from langchain.llms import OpenAI
# 定義第一個工具
class CalculatorTool(BaseTool):
name = "calculator"
description = "用來執行簡單數學運算"
def _run(self, query: str):
try:
return eval(query)
except Exception as e:
return f"錯誤: {e}"
# 定義第二個工具
class SearchTool(BaseTool):
name = "search"
description = "搜尋簡短知識或資料"
def _run(self, query: str):
fake_knowledge = {
"LangChain": "LangChain 是一個構建 LLM 應用的框架",
"Agent": "Agent 是讓模型能夠自主選擇工具的模組"
}
return fake_knowledge.get(query, "找不到資料")
tools = [CalculatorTool(), SearchTool()]
# 以調用openAI為例
llm = OpenAI(temperature=0)
agent = initialize_agent(
tools=tools,
llm=llm,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # MRKL 核心類型
verbose=True
)
完成上面步驟,你就能提供給LangChain架構下的 AI Agent (ReAct, MRKL等等都可以!) 調用你做的工具囉!
今天我們更加熟悉tool如何使用,明天我們就試著將RAG中的Retrieval也包成是tool來讓MRKL調用吧!!!