通俗易懂的LangGraph圖定義解析

LangGraph 是一個基于狀態的工作流框架,它通過 節點(Nodes)邊(Edges) 的組合,構建出復雜的工作流邏輯。這種設計特別適合處理需要動態決策、循環、多步驟交互的場景(比如對話系統、智能代理等)。下面我們通過一個簡單的例子,逐步講解 LangGraph 中的圖(Graph)是如何定義的。


1. 什么是 StateGraph?

StateGraph 是 LangGraph 的核心類,用于定義和管理基于狀態的圖結構。它的核心思想是:

  • 節點:表示執行的操作(如調用模型、處理數據)。
  • :定義節點之間的執行順序(支持無條件跳轉、條件跳轉、循環)。
  • 狀態(State):貫穿整個圖的數據結構,存儲和傳遞上下文信息。

舉個例子
想象你正在開發一個聊天機器人,用戶輸入一條消息后,機器人需要依次完成以下步驟:

  1. 解析用戶意圖(節點A)。
  2. 查詢數據庫(節點B)。
  3. 生成回復(節點C)。

通過 StateGraph,你可以將這三個步驟定義為節點,并通過邊連接它們,同時用狀態對象傳遞上下文(比如用戶的消息、查詢結果等)。


2. 如何定義一個圖?

定義一個圖的核心步驟包括:創建狀態、添加節點、設置邊,并最終編譯圖。以下是具體操作:

(1) 定義狀態

狀態是圖中傳遞的數據結構,通常是一個字典(TypedDict 或自定義類)。例如:

from typing_extensions import TypedDict
class State(TypedDict):messages: list  # 存儲對話歷史query: str      # 用戶當前問題
(2) 創建圖實例

使用 StateGraph 類初始化一個圖:

from langgraph.graph import StateGraph
graph_builder = StateGraph(State)
(3) 添加節點

節點是執行具體任務的函數。例如,添加一個解析用戶意圖的節點:

def parse_intent(state: State) -> dict:# 假設解析出用戶意圖是"查詢天氣"return {"query": "查詢天氣"}
graph_builder.add_node("parse_intent", parse_intent)
(4) 添加邊

邊定義了節點的執行順序。例如,將解析意圖節點連接到查詢數據庫節點:

graph_builder.add_edge("parse_intent", "query_database")
(5) 設置入口和出口

指定圖的起點和終點:

graph_builder.set_entry_point("parse_intent")  # 起點
graph_builder.set_finish_point("generate_response")  # 終點
(6) 編譯圖

將圖編譯為可執行對象:

compiled_graph = graph_builder.compile()

3. 核心方法詳解

LangGraph 提供了多個方法來構建圖,以下是關鍵方法的簡明說明:

方法名作用
add_node()添加一個節點到圖中。可以指定節點名稱和執行函數。
add_edge()添加一條有向邊,定義兩個節點的執行順序。如果多個起點,所有起點完成后才會執行終點。
add_conditional_edges()添加條件邊,根據狀態動態選擇下一個節點。例如:根據用戶意圖跳轉到不同的處理節點。
compile()將圖編譯為可執行對象,支持調用、流式處理等功能。
條件邊的使用示例

假設需要根據用戶意圖選擇不同的處理路徑:

def decide_next_node(state: State) -> str:if state["query"] == "查詢天氣":return "query_weather"else:return "handle_other"graph_builder.add_conditional_edges("parse_intent", decide_next_node)

4. 實際應用示例

場景:用戶詢問訂單狀態,機器人需要驗證身份后查詢數據庫。

代碼實現

from langgraph.graph import StateGraph, START, ENDclass State(TypedDict):user_id: strorder_status: strdef verify_user(state: State) -> dict:# 模擬驗證用戶身份return {"user_id": "12345"}def query_order(state: State) -> dict:# 模擬查詢訂單狀態return {"order_status": "已發貨"}builder = StateGraph(State)
builder.add_node("verify_user", verify_user)
builder.add_node("query_order", query_order)
builder.add_edge(START, "verify_user")
builder.add_edge("verify_user", "query_order")
builder.add_edge("query_order", END)compiled = builder.compile()
result = compiled.invoke({"user_id": "", "order_status": ""})
print(result)  # 輸出: {'user_id': '12345', 'order_status': '已發貨'}

5. 狀態管理的關鍵技巧
  • 狀態更新:每個節點接收當前狀態,并返回更新后的狀態。例如,節點A修改 state["x"],節點B可以直接讀取新值。
  • 狀態持久化:通過 checkpointer 參數保存狀態,支持斷點續傳(例如用戶中斷對話后恢復上下文)。
  • 條件邏輯:利用條件邊(add_conditional_edges)動態決定下一步操作,比如根據用戶輸入選擇不同分支。

6. 常見問題與注意事項
  • 節點命名沖突:確保每個節點名稱唯一。
  • 狀態字段設計:狀態字段應包含所有必要的上下文,避免遺漏關鍵信息。
  • 調試技巧:啟用 debug=True 編譯圖,觀察節點執行過程和狀態變化。

總結

LangGraph 的 StateGraph 通過節點和邊的靈活組合,讓開發者能夠輕松構建復雜的工作流。無論是簡單的線性流程,還是帶條件分支、循環的復雜邏輯,StateGraph 都能提供清晰的結構和強大的狀態管理能力。通過合理設計狀態和節點,你可以快速實現對話系統、智能代理等應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87143.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87143.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87143.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

K8s Pod調度基礎——2

目錄 一、Deployment ?一、Deployment 原理? ?二、核心特性? ?三、意義與場景? ?四、示例與逐行解釋? ?五、總結? StatefulSet ?一、StatefulSet 原理? ?二、核心特性? ?三、意義與場景? ?四、示例與逐行解釋? ?五、總結? 彼此的區別 一、本質…

Java 大視界 -- Java 大數據在智能醫療健康管理中的慢性病風險預測與個性化干預(330)

Java 大視界 -- Java 大數據在智能醫療健康管理中的慢性病風險預測與個性化干預(330) 引言:正文:一、Java 構建的醫療數據融合平臺(多源數據安全打通)1.1 分布式醫療數據集成系統(符合 HIPAA 與…

beego打包發布到Centos系統及國產麒麟系統完整教程

1、先清除go緩存,用下面命令 go clean -cache go clean -modcache 2、更新庫文件 go mod tidy 3、安裝beego go install github.com/beego/bee/v2latest 4、查看bee版本 5、進行打包然后傳到Centos和麒麟服務器如下代碼 bee pack -be GOOSlinux -be GOARCHa…

Instagram和facebook廣告對比解析

一、平臺用戶畫像對比 用戶基礎數據 (1)活躍用戶規模 Instagram:20億MAU,以年輕群體為主力 Facebook:29億MAU,覆蓋全年齡段用戶 (2)核心用戶特征 Instagram: ? 25-3…

[MIA 2025]CLIP in medical imaging: A survey

論文網址:CLIP in medical imaging: A survey - ScienceDirect 項目頁面:github.com 英文是純手打的!論文原文的summarizing and paraphrasing。可能會出現難以避免的拼寫錯誤和語法錯誤,若有發現歡迎評論指正!文章偏…

Python通訊錄系統實戰教程

具體介紹見 通訊錄管理系統設計與實現(C)-CSDN博客 class Person:def __init__(self, name"", sex0, age0, phone"", addr""):self.m_name name # 姓名self.m_Sex sex # 性別(1-男,2-女…

蝦米壁紙分類頁面代碼

<template> <view class"wallpaper-category"> <custom-nav-bar title"分類列表"></custom-nav-bar> <!-- 分類展示 --> <scroll-view scroll-y class"category-scroll-view"> <view cl…

K8s-pod 調度基礎

目錄 Replication Controller&#xff08;RC&#xff09; 概念 關鍵字段 Replica Set&#xff08;RS&#xff09; 概念 關鍵字段 RC 與 RS 的區別 無狀態應用管理Deployment 無狀態應用&#xff08;Stateless Application&#xff09; 什么是無狀態&#xff1f; 無狀…

Vue + RuoYi 前后端分離入門手冊

Vue RuoYi 前后端分離技術棧是一個非常流行且成熟的企業級后臺管理系統開發方案&#xff0c;尤其在國內 Java 開發社區中廣泛應用。它結合了現代化的前端框架 Vue.js 和基于 Spring Boot 的后端框架 RuoYi&#xff0c;提供了開箱即用的權限管理、代碼生成、監控等功能&#xf…

JSON 安裝使用教程

一、JSON 簡介 JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;易于人閱讀和編寫&#xff0c;同時也易于機器解析和生成。它廣泛應用于前后端數據通信、配置文件、API 傳輸等場景。 二、JSON 是否需要安裝&#xff1f; 不需要…

十大網絡協議

十大網絡協議 標題1. HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;標題2. HTTPS&#xff08;Secure Hypertext Transfer Protocol&#xff0c;安全超文本傳輸協議&#xff09;標題3. HTTP/3標題4. TCP&#xff08;Transmission Control…

【語音告警】博靈智能語音報警燈Modbus TCP觸發告警實例-語音報警燈|聲光報警器|網絡信號燈

功能說明 本文將以Python代碼為例&#xff0c;講解如何通過Python代碼調用博靈語音通知終端A4實現聲光語音告警。 本代碼實現Python觸發Modbus寫多寄存器和寫單寄存器實現調用通知終端模板播報功能&#xff08;通知終端內置TTS語音合成技術&#xff0c;本案例不講解如何文本轉…

攝像頭 rtsp數據量 和正常數據流有什么區別

攝像頭RTSP數據流和正常數據流&#xff08;如HTTP傳輸的普通文件或網頁數據&#xff09;在多個方面存在顯著差異&#xff0c;主要體現在協議特性、數據量、實時性、應用場景等方面。以下是具體對比&#xff1a; 1. 協議與傳輸方式 RTSP流&#xff1a; 實時流協議&#xff08;R…

深入理解裝飾器模式:動態擴展對象功能的靈活設計模式

深入理解裝飾器模式&#xff1a;動態擴展對象功能的靈活設計模式 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界…

141.在 Vue 3 中使用 OpenLayers Link 交互:把地圖中心點 / 縮放級別 / 旋轉角度實時寫進 URL,并同步解析顯示

本文分享一個前端小技巧&#xff1a;借助 OpenLayers 的 Link 交互 在瀏覽器地址欄實時記錄地圖狀態&#xff0c;同時把這些參數解析出來展示在頁面上。 ? 雙向同步&#xff1a;拖動、縮放、旋轉地圖時&#xff0c;URL 自動更新&#xff1b;手動修改 URL 或后退 / 前進&#x…

數字人的形象與內容,虛擬形象背后的權益暗戰

&#xff08;首席數據官高鵬律師數字經濟團隊創作&#xff0c;AI輔助&#xff09; 當某科技公司的虛擬偶像在直播間收獲百萬打賞時&#xff0c;當某品牌的數字代言人形象被篡改成表情包全網傳播時&#xff0c;當網紅博主的AI分身開始替代真人直播帶貨時&#xff0c;一場關于數…

【python】pdf拆成圖片,加中文,再合成pdf

前期搞了個pdf加頁腳&#xff0c;但是搞了半天中文加不了&#xff0c;就換了個思路。 直接說結論&#xff0c;pdf拆成圖片&#xff0c;加中文&#xff0c;再合成pdf&#xff0c;會導致pdf模糊。 import os import fitz # PyMuPDF from PIL import Image, ImageDraw, ImageFon…

分布式爬蟲數據存儲開發實戰

分布式爬蟲存儲的核心矛盾在于&#xff1a;既要高吞吐又要強一致性&#xff0c;還要避免重復。比如Kafka雖然吞吐高但無法去重&#xff0c;Redis去重快但容量有限。所以我們可能低估了狀態同步的復雜度——比如暫停爬蟲時如何保證內存中的URL狀態不丟失。 分布式爬蟲的數據存儲…

探秘阿里云Alibaba Cloud Linux:云時代的操作系統新寵

引言&#xff1a;云時代的操作系統變革 在云計算技術蓬勃發展的當下&#xff0c;企業的數字化轉型進程被極大地加速&#xff0c;而作為云計算底層支撐的操作系統&#xff0c;也迎來了前所未有的變革與挑戰。傳統操作系統在應對云計算環境中的大規模資源調度、高彈性擴展以及安…

使用pyflink進行kafka實時數據消費

目錄 背景 代碼demo 踩坑記錄 1、kafka連接器&#xff0c;kafka客戶端jar包找不到 2、java模塊系統訪問限制 3、執行demo任務&#xff0c;一直報錯連接kafka topic超時 總結 背景 實際項目中經常遇到source是kafka&#xff0c;需要實時消費kafka某個topic中的數據&#x…