注意:本文撰寫於 2026 年 7 月,使用 LangChain 0.3.x。未來版本的 API 可能會有所變更 — 如果有任何部分無法正常運作,請查閱 LangChain 文件。
當我開始學習 LangChain 時,感到相當不知所措。有 chains、agents、memory、retrievers、output parsers — 數十種抽象概念。後來我才發現:其中大部分已經被棄用。
LangGraph(由同一團隊開發)已經取代了編排層。但你仍然需要在 LangGraph 的節點中使用 LangChain 的核心建構模組。因此,我整理出你實際需要學習的最小範圍。
以下是全部內容,整理在一份檔案中。
真正重要的 4 件事
| # | 主題 | 對 LangGraph 的重要性 |
|---|---|---|
| 1 | LLM 設定 | 你需要與模型溝通 |
| 2 | Prompt Templates + LCEL | LCEL 的管道語法仍然適用 |
| 3 | 結構化輸出 | Pydantic 模型取代了舊的 output parsers |
| 4 | 工具呼叫 | 這是最重要的 — LangGraph agents 正是建立在工具呼叫迴圈之上 |
讓我們逐一說明。
1. LLM 設定
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="llama-3.3-70b-versatile",
temperature=0.0,
api_key=os.environ["GROQ_API_KEY"],
base_url="https://api.groq.com/openai/v1",
)
Enter fullscreen mode Exit fullscreen mode
ChatOpenAI 可搭配任何與 OpenAI 相容的 API 使用。這裡我使用 Groq 搭配 Llama 3.3 提供免費且快速的推論服務。
2. Prompt Templates + LCEL
from langchain_core.prompts import ChatPromptTemplate
template_string = """Translate the text that is delimited by triple backticks \
into a style that is {style}.
text: ```
{text}
Enter fullscreen mode Exit fullscreen mode
"""
prompt_template = ChatPromptTemplate.from_template(template_string)
chain = prompt_template | llm
response = chain.invoke({"style": "formal English", "text": "yo what's up"})```
管道符號 (|) 語法稱為 LCEL(LangChain Expression Language)。它取代了舊有的 LLMChain、SequentialChain 等。簡單且具可組合性。
3. 結構化輸出
舊版需要使用 ResponseSchema、StructuredOutputParser,並將格式指示注入提示詞中。新版只需使用 Pydantic:
from pydantic import BaseModel, Field
class ReviewInfo(BaseModel):
"""Information extracted from a product review."""
gift: bool = Field(description="Was the item purchased as a gift?")
delivery_days: int = Field(description="How many days to arrive? -1 if unknown.")
price_value: list[str] = Field(description="Sentences about value or price.")
structured_llm = llm.with_structured_output(ReviewInfo, method="function_calling")
result = (prompt | structured_llm).invoke({"text": review})
print(result.gift) # True (a real bool, not the string "true")
print(result.delivery_days) # 2 (a real int)
Enter fullscreen mode Exit fullscreen mode
各個步驟由誰負責:
| 步驟 | 負責方 |
|---|---|
| 將 Pydantic 轉換為 JSON schema | LangChain |
| 理解 schema 並產生 JSON | LLM |
| 將 JSON 解析回 Pydantic 物件 | LangChain |
不再需要在提示詞中加入格式指示。LLM 根本不會看到「return JSON」 — 它在底層使用 function calling。
4. 工具呼叫 — 最重要的一環
這正是 LangGraph 自動化的部分。先手動理解這個流程,能讓你更快速掌握 LangGraph。
定義工具 — 只需使用 @tool 裝飾器定義 Python 函式:
from langchain_core.tools import tool
@tool
def get_current_weather(city: str) -> str:
"""Get the current weather for a given city."""
return {"berlin": "17°C, cloudy"}.get(city.lower(), "No data")
@tool
def get_population(city: str) -> int:
"""Get the approximate population of a city."""
return {"berlin": 3_700_000}.get(city.lower(), -1)
Enter fullscreen mode Exit fullscreen mode
@tool 裝飾器會將這些函式轉換為 BaseTool 物件。函式的 docstring 會成為描述,供 LLM 判斷何時呼叫該工具。
綁定工具並呼叫:
tools = [get_current_weather, get_population]
llm_with_tools = llm.bind_tools(tools)
messages = [HumanMessage("What's the weather and population in Berlin?")]
ai_response = llm_with_tools.invoke(messages)
print(ai_response.tool_calls)
# [{"name": "get_current_weather", "args": {"city": "Berlin"}, "id": "..."},
# {"name": "get_population", "args": {"city": "Berlin"}, "id": "..."}]
Enter fullscreen mode Exit fullscreen mode
LLM 不會執行工具。它會回傳一個結構化的請求,要求你來執行它們。
執行工具並將結果送回:
tool_map = {t.name: t for t in tools}
messages.append(ai_response)
for tc in ai_response.tool_calls:
result = tool_map[tc["name"]].invoke(tc["args"])
messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))
final_response = llm_with_tools.invoke(messages)
print(final_response.content)
# "The weather in Berlin is 17°C and cloudy, with a population of 3.7 million."
Enter fullscreen mode Exit fullscreen mode
這個迴圈 — LLM 決定 → 你執行 → 送回結果 → 重複 — 正是 LangGraph 的 ToolNode 所自動化的流程。
可以跳過的部分
如果你目標是學習 LangGraph,不需要花時間學習這些已淘汰的 LangChain 抽象:
-
LLMChain→ 已被 LCEL(prompt | llm)取代 -
SequentialChain→ 已被 LCEL 管道取代 -
RouterChain→ 已被 LangGraph 分支機制取代 -
ConversationChain→ 已被 LangGraph 狀態取代 -
AgentExecutor→ 已被 LangGraph agent 迴圈取代
LangChain 與 LangGraph 的關係
LangGraph 並非 LangChain 的替代品 — 它建構於 LangChain 之上:
- LangChain Core → LLMs、prompts、tools、messages (你仍然需要使用這些)
- LangGraph → 編排層 (控制這些模組如何連接與迴圈)
LangGraph 於 2024 年初推出,原因是 LangChain 原有的 agent/chain 抽象過於僵硬 — 難以客製化、不支援循環或分支,且記憶體功能是後來附加而非內建。
取得程式碼
完整內容僅需一個檔案:github.com/santanu2908/langchain-essentials
git clone https://github.com/santanu2908/langchain-essentials.git
cd langchain-essentials
uv sync
# add your GROQ_API_KEY to .env
uv run main.py
Enter fullscreen mode Exit fullscreen mode
下一篇:LangGraph。如果你覺得這篇文章有幫助,請持續關注 — 我也會分享學習 LangGraph 的歷程。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.