使用LangGraph在Python中構建智慧體工作流
本文詳細介紹瞭如何使用LangGraph在Python中構建完整的智慧體工作流,從單次模型呼叫到具有持久對話記憶的工具使用智慧體。涵蓋了狀態、節點、邊的定義,訊息歷史管理,模型呼叫,工具註冊與路由,以及推理迴圈追蹤。
本文詳細介紹瞭如何使用LangGraph在Python中構建完整的智慧體工作流,從單次模型呼叫到具有持久對話記憶的工具使用智慧體。
引言
大多數AI智慧體設定能良好處理單輪問答:接收問題,呼叫模型,返回答案。但更困難的問題很快出現:智慧體可能需要查詢資料庫、記住之前訊息的上下文,或讓使用者清楚瞭解模型的決定過程。如果不為每個用例構建自定義管道,解決這些挑戰往往會讓實現變得複雜。
LangGraph為處理這些問題提供了清晰的結構。智慧體被表示為圖,節點是工作單元,邊定義下一步執行什麼,共享狀態物件在每個步驟中攜帶完整訊息歷史。模型在節點內執行,因此每個推理步驟、工具呼叫和響應都成為圖狀態的一部分。這使得整個執行流程可見、可檢查,並可供後續任何節點使用。
理解狀態、節點和邊
每個LangGraph圖由三個元件構建:
- 狀態(State):一個TypedDict,作為整個圖的共享記憶體。每個節點從中讀取並寫入更新。欄位如果不更新則保持不變。
- 節點(Nodes):普通的Python函式。節點接收當前狀態作為引數,並返回要更新的欄位字典。使用
add_node註冊。 - 邊(Edges):定義執行順序。
add_edge(A, B)表示A完成後執行B。add_conditional_edges允許基於路由函式分支。
透過歸約器(reducer)可以處理欄位的累積。例如,使用operator.add可以使列表欄位追加而非替換。LangGraph的MessagesState使用add_messages歸約器,支援訊息去重和排序。
管理對話歷史
MessagesState是一個內建狀態型別,包含一個messages欄位,使用add_messages歸約器。每次節點返回新訊息時,它們會被追加到現有列表。我們可以擴充套件該狀態以新增其他欄位(如客戶ID)。
在節點中呼叫模型
核心節點函式將當前訊息列表傳遞給模型並附加其響應。使用ChatOpenAI(或任何LangChain聊天模型)並返回AIMessage。系統訊息可以在每次呼叫時設定而不儲存在狀態中。
註冊工具並路由工具呼叫
使用@tool裝飾器定義工具,然後用bind_tools繫結到模型。ToolNode負責執行工具呼叫,tools_condition作為條件邊,根據模型輸出是否有tool_calls路由到工具節點或結束。從工具節點返回模型節點的邊形成閉環,使模型能根據工具結果生成最終答案。
追蹤推理迴圈
當模型使用工具時,實際過程比最終輸出更復雜:模型先產生帶有tool_calls的AIMessage,工具節點執行並返回ToolMessage,模型再次呼叫後生成最終回答。這是標準的ReAct模式,每次工具使用需要兩次模型呼叫。
設定與安裝
安裝所需包:pip install langgraph langchain-openai python-dotenv,建立.env檔案存放OpenAI API金鑰。
本文從零開始構建圖,涵蓋所有步驟,為構建更復雜的智慧體工作流奠定基礎。