使用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密鑰。
本文從零開始構建圖,涵蓋所有步驟,為構建更復雜的智能體工作流奠定基礎。