經過前 13 天,我們一步步讓 LLM 從單純回話工具,逐漸具備了 Agentic 的核心能力。
在「旅途中繼站」回顧後,我們要開始進入實戰篇:不只是 Demo,而是要用 架構化方式,把能力組織起來。
值得注意的是,LangChain 官方已公告在今年 10 月全面切換到 v1.0 版本,舊版 API 將逐步淘汰。
因此,這裡我們直接研究 最新 v1.0 的設計,讓未來的實作與維護更穩健。
如果說前半程像是「徒步旅行」,今天開始,我們要拿出 地圖(架構) 與 指南針(控制流),讓旅程更長遠、更可靠。這就是 LangChain × LangGraph 要帶來的力量。
LangChain v1.0 把介面大幅簡化,核心功能聚焦在六大模組:
invoke / stream / batch
。.content_blocks
),讓輸入輸出一致。
圖:LangChain v1.0 的積木式架構,Agent 作為核心,結合模型、工具、記憶與串流,處理輸入並輸出結果
今年 10 月要全面上線的 LangChain v1.0,其實帶來了幾個關鍵轉變,對開發者來說「用起來真的有感」。
Agent 抽象更統一
輸出格式更標準
content_blocks
屬性,把推理過程、工具呼叫、引用來源,甚至多媒體內容,都放進相同結構裡。簡單來說:
這些改動,讓 v1.0 不只是「改版號」,而是真正替開發者省下學習與維護成本。
這邊我們拿 核心篇 Day 6 (Tool Use)「查今天維也納的天氣」的例子運用 LangChain 來重新實作
1. 安裝最新 v1.0
的 LangChain
以及 Gemini
model 套件
pip install -q --pre -U langchain
pip install -q -U langchain-google-genai
2. 用 LangChain v1.0
實作「查今天維也納的天氣」,簡單幾行程式碼就能實現
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.agents import create_agent
from langchain_core.tools import tool
# 1. 定義工具(用 @tool 包裝)
@tool
def get_weather(city: str) -> str:
"""查詢指定城市的天氣狀況。"""
weather_data = {
"維也納": "大晴天,氣溫 22°C",
"台北": "多雲,氣溫 30°C",
}
return weather_data.get(city, "查無資料")
# 2. 初始化 Gemini 模型
llm = ChatGoogleGenerativeAI(
model="gemini-2.5-flash",
temperature=0,
)
# 3. 建立 Agent(支援 tool calling)
agent = create_agent(
model=llm,
tools=[get_weather],
)
# 4. 使用者查詢
query = "請告訴我今天維也納的天氣"
# 5. 由 Agent 決定是否呼叫工具
result = agent.invoke({"messages": [{"role": "user", "content": query}]})
# 6. 輸出最終回覆
print(result["messages"][-1].content)
3. 執行結果
這個範例展示了最小的 LangChain v1.0 Agent:使用者輸入經過模型判斷,若需要,會自動呼叫工具,最後整合輸出。
光有積木還不夠,我們需要一張「路線圖」,能處理分支、迴圈、決策。這就是 LangGraph。
invoke()
或 stream()
。
圖:LangGraph 的狀態機流程圖,以 Router 決策分流,經過 Reason 或 Tool 節點,再由 Observe 節點整合輸出
pip install --pre -U langgraph
from langchain_google_genai import ChatGoogleGenerativeAI
from langgraph.graph import StateGraph, END
from typing import TypedDict
# 初始化 Gemini
llm = ChatGoogleGenerativeAI(model="gemini-2.5-flash", temperature=0)
# 定義狀態
class State(TypedDict):
message: str
# 節點
def start_node(state: State):
resp = llm.invoke(f"Say hello to {state['message']}")
return {"message": resp.content}
def end_node(state: State):
print("LangGraph Output:", state["message"])
return state
# 建立圖
graph = StateGraph(State)
graph.add_node("start", start_node)
graph.add_node("end", end_node)
graph.set_entry_point("start")
graph.add_edge("start", "end")
app = graph.compile()
app.invoke({"message": "LangGraph"})
這個範例展示了最小的 StateGraph,只有兩個節點(start → end)。雖然只是打招呼,但能清楚看到 狀態流動與節點邏輯。
官方 (v1.0) 建議:
If you are just getting started with agents, or want a higher level abstraction, it is recommended that you use LangChain’s agents.
也就是說:
如果你只是要開發一般的 AI 助理、聊天機器人,或是做簡單的工具串接,LangChain v1.0 的 Agents 就已經足夠。它幫你處理了 Prompt、模型呼叫、工具調用、短期記憶和串流輸出,大部分應用都能直接搞定。
但如果遇到以下情境,就會建議引入 LangGraph:
換句話說:
功能需求 | LangChain Agents(就足夠) | LangGraph(必要時才用) |
---|---|---|
單輪對話 | ✅ | — |
基本 tool calling | ✅ | — |
短期記憶(上下文) | ✅ | — |
Streaming 即時回覆 | ✅ | — |
多步驟推理(簡單 if/else) | ✅ | — |
複雜分支 / 條件流 | ⚠️ 難維護 | ✅ |
長時間執行 / 可恢復任務 | — | ✅ |
Human-in-the-loop | — | ✅ |
Debug / 視覺化執行路徑 | — | ✅ |
Multi-agent 協作 | — | ✅ |
生產級部署(容錯、監控) | — | ✅ |
今天,我們從「積木」到「地圖」,認識了 LangChain v1.0 的核心組件,也看到了 LangGraph 的狀態機思維。
接下來,我們將在這個基礎上,逐步把 CoT、RAG、Reflection、Memory 等能力工程化落地。
圖:維也納中央車站(Wien Hauptbahnhof)。現代感十足的玻璃立面與巨大的時鐘,象徵著跨越城市與國界的交通樞紐。旅人從這裡出發,選擇不同的路線,最終都能抵達目的地。這就像 LangChain 與 LangGraph —— 一者提供積木般的模組,另一者規劃清晰的流程,讓我們能自由組合、靈活轉換,開啟屬於自己的 AI 工程旅程。(攝影:作者自攝)