Table of Contents
<p>LangGraph 建立在 LangChain 和 ReAct 框架之上,能夠實現複雜、有狀態的 AI 應用程式。它擅長維持上下文、做出動態決策,以及處理複雜邏輯。LangGraph 將工作流程實作為有向圖,在 LLM 驅動的系統中實現精密的推理、適應性和多代理協作。</p>
在深入了解 LangGraph 之前,讓我們先理解促成其發展的基礎概念。
什麼是 ReAct?
ReAct(推理與行動)是一個結合 AI 系統推理和行動的框架。基本概念是 AI 應該:
- 推理它需要做什麼
- 規劃它將採取的步驟
- 執行這些計畫
- 觀察結果
- 反思並調整方法
就像一位廚師:
- 推理要做什麼菜
- 規劃烹飪步驟
- 按照食譜執行
- 觀察每個步驟的結果
- 如果有問題就反思並調整
什麼是 LangChain?
LangChain 是一個專為開發語言模型驅動應用程式而設計的框架。可以把它想像成一個工具包,幫助你使用大型語言模型(LLMs)如 GPT-4 或 Claude 來建構複雜的應用程式。LangChain 提供了建立操作鏈的基礎模組,每個步驟都可以包含以下任務:
- 與 LLM 互動
- 處理輸出結果
- 根據結果做出決策
- 存取外部工具或資料來源
舉例來說,你可以建立一個鏈,接收使用者問題、搜尋資料庫、格式化相關資訊,並使用 LLM 生成回應。
進入 LangGraph
LangGraph 是建立在 LangChain 之上的新函式庫,能更輕鬆愉快的使用 ReAct 框架開發複雜的應用程式。雖然 LangChain 很適合建立線性的操作鏈,但 LangGraph 在建構以下工作流程方面表現出色:
- 在互動過程中維持狀態
- 動態決定下一步要做什麼
- 處理複雜的迴圈和條件邏輯
- 管理多個代理協同工作
LangGraph 將這些工作流程實作為有向圖,其中每個節點代表流程中的一個步驟,邊緣代表步驟之間可能的路徑。
LangChain 的鏈和 LangGraph 的工作流程之間的關鍵差異在於,LangGraph 維持狀態並可以根據該狀態動態決定要走哪條路徑。這使得它特別適合:
- 多步驟推理任務
- 需要記住上下文的互動式代理
- 複雜的決策過程
- 可能需要迴圈或回溯的工作流程
本質上,LangGraph 將狀態機和基於圖的工作流程的力量帶到 LLM 應用程式中,讓建構更精密的 AI 系統變得更容易,這些系統可以根據互動進行推理、行動和適應。
LangGraph 視覺化與流程說明

上圖為LangGraph預設的結構,讓我們逐步分解各個步驟。
1. 起始點
- 流程從
__start__開始,代表初始進入點 - 這是系統首次接收使用者查詢或任務的地方
2. 模型互動(call_model)
- 第一個主要步驟是
call_model,代理在此與語言模型互動 - 在這裡,模型執行三個關鍵功能:
- 分析當前情況
- 推理潛在的行動
- 決定是否使用工具或提供最終答案
3. 決策點
- 從
call_model出發有兩條可能的路徑(以虛線表示):- 通往
__end__的路徑:當模型有足夠資訊時選擇 - 通往
tools的路徑:需要外部工具時選擇
- 通往
4. 工具執行(tools)
- 當需要工具時,系統可以執行各種操作:
- 進行網路搜尋
- 查詢資料庫
- 執行計算
- 發送 API 請求
- 工具執行後,結果會回流到
call_model(以實線弧形箭頭表示)
5. 回饋迴圈
- 從
tools到call_model的實線弧形箭頭代表關鍵的回饋機制 - 這裡建立了一個疊代循環,代理會:
- 處理工具結果
- 重新評估情況
- 決定下一步行動
6. 完成(__end__)
- 當代理收集到足夠資訊時,流程在
__end__結束 - 這代表對原始查詢的最終答案或解決方案
這個工作流程體現了 ReAct(推理與行動)模式:
- 思考:
call_model步驟代表推理 - 行動:
tools步驟代表採取行動 - 觀察: 回饋迴圈代表觀察結果
圖表的設計使用虛線表示條件性流程,實線表示保證轉換,創造了一個靈活但結構化的問題解決系統,能夠透過迭代推理和行動來處理複雜任務。
LangGraph 和 ReAct 框架的簡單範例
from langchain_core.tools import tool
from langchain_google_vertexai import ChatVertexAI
from langgraph.prebuilt import create_react_agent
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
@tool
def add_two(input: int) -> int:
"""將輸入加二。"""
return input + 2
@tool
def power_two(input: int) -> int:
"""將輸入的二次方。"""
return input ** 2
tools = [add_two, power_two]
# 你可以根據需要更換模型
model = ChatVertexAI(model='gemini-1.5-flash-001')
langgraph_agent_executor = create_react_agent(model, tools)
prompt = ChatPromptTemplate.from_messages(
[
("system", "你是一個有用的助手"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
]
)
agent = create_tool_calling_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
query = "3 加 2 的值是多少?"
agent_executor.invoke({"input": query})
# {'input': '3 加 2 的值是多少?',
# 'output': '值是 5。 \n'}
query = "3 的二次方的值是多少?"
agent_executor.invoke({"input": query})
# {'input': '3 的二次方的值是多少?',
# 'output': '值是 9。 \n'}
query = "3 加 5 的值是多少?"
agent_executor.invoke({"input": query})
# {'input': '3 加 5 的值是多少?',
# 'output': '值是 7。 \n'}
# add_two 工具無法處理這個輸入,所以回傳 7
query = "5 的二次方,然後加 2 的值是多少?"
agent_executor.invoke({"input": query})
# {'input': '5 的二次方,然後加 2 的值是多少?',
# 'output': '值是 27。 \n'}LangGraph 官方範例
如果你想使用 LangGraph 或 ReAct 框架建構應用程式,我強烈建議從 LangChain 官方範例開始。LangChain 提供五個範本:
- 新的 LangGraph 專案
- ReAct 代理
- 記憶代理
- 檢索代理
- 資料豐富化代理
你可以使用這些官方範本踏出最困難的第一步,然後根據需求進行客製化。






References: Legiano Casino Test