WorkBlog

LangChain Agent 開發入門:工具呼叫教學

劉芷晴
LangChain Agent 開發入門:工具呼叫教學

如果你最近有在關注 AI 開發的趨勢,你一定聽過 LangChain 這個名字。老實說,當我第一次接觸 LangChain 的時候,覺得它的文件寫得有點混亂,但等到真正上手之後,才發現它在 Agent 開發上的威力真的很強大。今天這篇文章,我想帶你從零開始認識 LangChain Agent 的工具呼叫機制,讓你不再對這些概念感到陌生。

什麼是 LangChain Agent

簡單來說,LangChain Agent 就是一個能夠「自己思考該怎麼做」的 AI 程式。一般的 LLM 只能接收輸入然後產出文字回應,但 Agent 不一樣——它可以根據使用者的問題,自己決定要呼叫哪些工具、要執行什麼動作,然後把結果整合起來回覆你。

你可以把它想像成一個聰明的助理。當你問它「今天台北的天氣如何?」的時候,它不會瞎掰一個答案,而是會去呼叫天氣 API,拿到真實的資料之後再回答你。這就是 Agent 跟一般聊天機器人最大的區別。

在 LangChain 的架構中,Agent 主要由三個部分組成:LLM(大型語言模型)、Tools(工具)和 Prompt(提示詞)。LLM 負責思考和推理,Tools 負責執行具體的任務,而 Prompt 則定義了 Agent 的行為模式。

工具呼叫的核心概念

工具呼叫(Tool Calling)是 Agent 的靈魂所在。沒有工具呼叫,Agent 就只是一個比較會聊天的程式而已。那到底什麼是工具呼叫呢?

本質上,工具呼叫就是讓 LLM 能夠以結構化的方式來「使用」外部功能。當 LLM 判斷需要使用某個工具時,它會輸出一段符合特定格式的資料(通常是 JSON),告訴系統:「我要呼叫這個工具,參數是這些。」然後系統就會真的去執行那個工具,把結果回傳給 LLM。

舉個例子,假設你定義了一個「搜尋資料庫」的工具,當使用者問「我們公司上個月的營收是多少?」時,Agent 就會自動呼叫這個搜尋工具,帶入適當的查詢條件,然後拿到結果。這整個過程都是自動完成的,不需要你寫一堆 if-else 判斷。

使用 @tool 裝飾器定義工具

在 LangChain 中,定義工具最簡單的方式就是使用 @tool 裝飾器。這個裝飾器可以把任何一個普通的 Python 函式變成 Agent 可以使用的工具。

from langchain_core.tools import tool

@tool
def search_weather(city: str) -> str:
    """搜尋指定城市的天氣資訊。
    
    Args:
        city: 要查詢天氣的城市名稱
    """
    # 這裡放你的 API 呼叫邏輯
    return f"{city}目前天氣晴朗,氣溫 28°C"

這邊有幾個重點要注意。第一,函式的 docstring 非常重要,因為 LLM 就是靠這段描述來判斷什麼時候該用這個工具。寫得越清楚,Agent 就越能正確地使用它。第二,型別註解也不能省略,LangChain 會根據型別註解來產生工具的參數定義。

我自己的經驗是,docstring 最好寫得像是在跟人解釋「這個工具能做什麼」,而不是寫成技術規格。這樣 LLM 更容易理解什麼情況下該呼叫這個工具。

建立 Tool Calling Agent

工具定義好之後,接下來就是把它們組裝成一個 Agent。LangChain 提供了 create_tool_calling_agent 這個函式,讓整個過程變得非常簡單。

from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate

# 初始化 LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 定義提示詞模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一個有用的助理,請使用提供的工具來回答問題。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

# 建立 Agent
tools = [search_weather]
agent = create_tool_calling_agent(llm, tools, prompt)

# 建立執行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 執行
result = agent_executor.invoke({"input": "台北現在天氣怎樣?"})

這段程式碼的關鍵在於 AgentExecutor。它負責管理 Agent 的整個執行流程,包括呼叫 LLM、解析工具呼叫、執行工具、把結果回傳給 LLM 等等。你只需要 invoke 一次,它就會自動處理所有事情。

ReAct Agent 模式解析

ReAct(Reasoning + Acting)是目前最流行的 Agent 模式之一。它的核心理念是讓 LLM 在每一步都先「思考」再「行動」,形成一個 Thought → Action → Observation 的循環。

在 ReAct 模式下,Agent 的運作流程大概是這樣的:首先,Agent 收到使用者的問題後會先思考(Thought),分析需要什麼資訊來回答這個問題。接著,它會決定要執行什麼動作(Action),也就是呼叫哪個工具。工具執行完之後,Agent 會觀察結果(Observation),然後決定是否需要再呼叫其他工具,或者已經可以給出最終答案。

這個模式的好處是 Agent 的推理過程是透明的。你可以看到它每一步在想什麼、為什麼要呼叫某個工具。這對除錯來說非常有用,因為你可以很快找出 Agent 在哪個環節出了問題。

串接多個工具的實戰範例

真實世界的應用通常不會只有一個工具。讓我們來看一個稍微複雜一點的例子:一個可以同時查詢天氣和搜尋餐廳的旅遊助手。

@tool
def search_restaurants(city: str, cuisine: str) -> str:
    """搜尋指定城市中特定類型的餐廳推薦。
    
    Args:
        city: 城市名稱
        cuisine: 料理類型,例如日式、義式、中式
    """
    return f"在{city}推薦的{cuisine}餐廳:好味道餐廳、美食天堂"

@tool
def get_travel_info(destination: str) -> str:
    """取得旅遊目的地的基本資訊,包含交通和住宿建議。
    
    Args:
        destination: 旅遊目的地
    """
    return f"{destination}的旅遊資訊:建議搭高鐵前往,住宿推薦車站附近"

當你問這個 Agent「我週末想去台南玩,想吃日式料理,天氣會怎樣?」的時候,Agent 會自動拆解這個問題,分別呼叫天氣查詢、餐廳搜尋和旅遊資訊三個工具,最後把結果整合成一個完整的回答。

如果你對資料檢索這塊有興趣,也可以參考向量資料庫比較這篇文章,了解如何讓 Agent 從向量資料庫中取得更精準的資訊。

2026 年 Deep Agents 新功能

說到 2026 年 LangChain 最讓人興奮的更新,絕對是 Deep Agents 功能。這個新功能讓 Agent 可以進行更深層的推理,不再只是簡單的 Thought → Action → Observation 循環。

Deep Agents 引入了「計畫-執行-反思」的三階段架構。在計畫階段,Agent 會先分析整個任務,制定一個執行計畫。在執行階段,它會按照計畫一步一步完成任務。在反思階段,它會回顧整個執行過程,檢查是否有遺漏或錯誤。

另外一個很實用的功能是 Agent 之間的協作。你現在可以建立多個專門化的 Agent,讓它們彼此溝通合作。比如一個負責搜尋、一個負責分析、一個負責撰寫報告,整個流程完全自動化。這在處理複雜任務的時候特別有用。

LangGraph 在這次更新中也加入了更好的狀態管理機制,讓你可以更靈活地控制 Agent 的執行流程。如果你之前覺得 LangGraph 的學習曲線太陡,現在是重新嘗試的好時機。

錯誤處理與除錯技巧

開發 Agent 的時候,錯誤處理是絕對不能忽略的。工具呼叫可能會因為各種原因失敗,比如 API 逾時、參數格式錯誤、權限不足等等。

@tool
def safe_search(query: str) -> str:
    """安全的搜尋工具,帶有錯誤處理。
    
    Args:
        query: 搜尋關鍵字
    """
    try:
        result = perform_search(query)
        return result
    except TimeoutError:
        return "搜尋逾時,請稍後再試"
    except Exception as e:
        return f"搜尋發生錯誤:{str(e)}"

我的建議是,工具函式永遠不要拋出例外。如果發生錯誤,就回傳一段清楚的錯誤訊息,讓 Agent 知道發生了什麼事。這樣 Agent 可以自己決定下一步該怎麼做,比如重試或者使用其他工具。

除錯方面,把 verbose=True 打開是最基本的做法。它會把 Agent 的每一步推理過程都印出來。更進階的話,你可以用 LangSmith 來追蹤和監控 Agent 的執行過程,它提供了非常好的視覺化界面。

效能優化建議

當你的 Agent 越來越複雜、工具越來越多的時候,效能就會變成一個問題。這裡分享幾個我自己踩過坑之後學到的優化技巧。

首先,工具數量不要太多。雖然理論上你可以給 Agent 幾十個工具,但實際上工具太多的話,LLM 反而會搞混,經常呼叫錯誤的工具。我的經驗是控制在 10 個以內比較理想。

其次,善用 caching。如果某些工具呼叫的結果在短時間內不會變化(比如匯率查詢),就把結果快取起來,不要每次都重新呼叫 API。

最後,考慮使用串流(streaming)來改善使用者體驗。Agent 的執行通常需要好幾秒,如果讓使用者乾等的話體驗會很差。透過串流,你可以即時顯示 Agent 的思考過程,讓使用者知道它正在做什麼。如果你的 Agent 涉及到網頁爬取,可以參考Python Selenium 動態爬蟲教學來優化資料擷取的效率。

總結與下一步

回顧一下今天學到的內容:我們從 LangChain Agent 的基本概念開始,認識了工具呼叫的運作機制,學會了用 @tool 裝飾器定義工具,用 create_tool_calling_agent 建立 Agent,也探討了 ReAct 模式和 2026 年的 Deep Agents 新功能。

如果你是剛入門的開發者,我建議你先從一個簡單的單工具 Agent 開始練習,等熟悉了基本流程之後,再慢慢增加工具數量和複雜度。不要一開始就想做太複雜的東西,循序漸進才是最有效率的學習方式。

LangChain 的生態系統還在快速發展中,幾乎每個月都有新的功能和改進。保持學習的心態,持續關注官方文件和社群討論,你一定可以打造出強大的 AI Agent 應用。

劉芷晴

AI 研究員與資料科學家,專注於 NLP 與 LLM 應用。

機器學習NLPLLM資料分析

你可能也喜歡

探索其他領域的精選好文