iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
生成式 AI

從 RAG 到 Agentic RAG:30 天打造本機智慧檢索系統系列 第 21

Day 21: 在了解MCP之前,先試試簡單的tool吧!

  • 分享至 

  • xImage
  •  

前言

我們在介紹在 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?

雖然 MCP 帶來了統一標準與更強整合性,
但在實務上,Tool 仍是最直接、靈活且可控的設計方式

理解 Tool 架構,你能:

  • 快速建立可行的原型(Prototype)
  • 完全掌握工具執行流程與資料邏輯
  • 在無需雲端整合或協定支援的環境中,依然能構建完整的 Agent 系統
  • 為日後遷移至 MCP 奠定基礎(因為 MCP 的每個 Action,本質上也對應到一個 Tool)

因此,筆者認為在邁向 MCP 之前,
掌握 Tool 架構,仍然是理解「模型如何思考與行動」的最佳起點。


🧰LangChain 的 AI Agent 工具(Tool)調用機制

現在我們回到LangChain,在 LangChain 的 Agent 架構 中,Tool 是讓模型具備「行動能力」的核心元件,能讓 LLM 不再只是被動生成文字,而能主動調用外部功能
查資料、算數學、執行 Python、呼叫企業內部系統……
換句話說,Tool 是讓模型「動起來」的第一步。


Tool 架構概念

LangChain 的 Tool 本質上是一個封裝好的「函式」,
其主要目的是讓 Agent 在推理過程中能夠:

  1. 知道有哪些工具可用(工具清單)
  2. 根據任務選擇合適的工具
  3. 傳入正確參數,獲取結果
  4. 根據結果更新上下文,繼續推理

Tool 定義清單

在設計 Agent 前,我們通常會先定義可使用的工具清單:

  • 每個工具都應有明確的:
    • name: 工具名稱(讓 LLM 可識別)
    • description: 工具用途(幫助 LLM 選擇)
    • func: 實際執行的 Python 函式

這些工具會被傳入 Agent,如同給模型一組可呼叫的「API 目錄」。

Tool 的 Class 架構

LangChain 內建的基礎類別是 BaseTool 或更簡化的 Tool
一個 Tool 一般包含三個重點:

屬性/方法 說明
name 工具名稱,LLM 用來辨識調用哪個工具
description 工具描述,幫助模型選擇合適工具
_run() 同步執行邏輯(主要邏輯實作)
_arun() 非同步執行邏輯(可選)

Agent 調用流程簡述

  1. LLM 接收使用者輸入
  2. 根據 prompt 推理:需要哪種能力?
  3. 選擇 Tool:根據 description 選擇適合的工具
  4. 執行 Tool:呼叫工具背後的函式
  5. 回傳結果:再交給 LLM 進一步整合、回答

流程可視為:

User Input → LLM → Tool Selection → Execute Tool → Return Output → LLM → Final Answer

Tool 設計重點

在實務上設計 Tool 時,有幾個重點原則:

  • 描述清晰description 要明確,讓模型知道什麼時候用這個工具。
  • 輸入結構化:用 args_schema 定義輸入欄位與型別,提升正確率。
  • 回傳簡潔:輸出應可直接被 LLM 理解。
  • 可組合性:工具應能被多個 Agent 或任務共用。

🧾程式示範

以下是一個簡單示範:
定義兩個工具,並讓 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()]

Agent調用

# 以調用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調用吧!!!


上一篇
Day 20: RAG無法找回正確的資料該怎麼辦? 淺談embedding model fine-tuning
下一篇
Day 22: 將Qdrant的Retrieval包成LangChain tool
系列文
從 RAG 到 Agentic RAG:30 天打造本機智慧檢索系統22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言