ReAct Agent是什麼?使用LangChain與LangGraph的簡單範例

<p>LangGraph 建立在 LangChain 和 ReAct 框架之上,能夠實現複雜、有狀態的 AI 應用程式。它擅長維持上下文、做出動態決策,以及處理複雜邏輯。LangGraph 將工作流程實作為有向圖,在 LLM 驅動的系統中實現精密的推理、適應性和多代理協作。</p>

在深入了解 LangGraph 之前,讓我們先理解促成其發展的基礎概念。

什麼是 ReAct?

ReAct(推理與行動)是一個結合 AI 系統推理和行動的框架。基本概念是 AI 應該:

  1. 推理它需要做什麼
  2. 規劃它將採取的步驟
  3. 執行這些計畫
  4. 觀察結果
  5. 反思並調整方法

就像一位廚師:

  • 推理要做什麼菜
  • 規劃烹飪步驟
  • 按照食譜執行
  • 觀察每個步驟的結果
  • 如果有問題就反思並調整

什麼是 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 提供五個範本:

  1. 新的 LangGraph 專案
  2. ReAct 代理
  3. 記憶代理
  4. 檢索代理
  5. 資料豐富化代理

你可以使用這些官方範本踏出最困難的第一步,然後根據需求進行客製化。

🚀 以每年 5 美元解鎖無廣告體驗

✓ 14 天免費試用 ✓ 隨時取消

在〈ReAct Agent是什麼?使用LangChain與LangGraph的簡單範例〉中有 1 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *