LangGraph 重要注意事項和常見問題

01. 數據狀態與歸納函數

在前面的課時中,我們說過在 LangGraph 中?節點?在默認情況下返回的字典數據會將原始數據覆蓋,例如下面的代碼最終返回結果是?{"messages": [4]}?而不是?[1,2,3,4],如下

class MyState(TypedDict):

????messages: list

def fn1(state: MyState):

????return {"messages": [4]}

# ... (ignore codes of start->fn1->end, blah blah)

r = graph.invoke({"messages": [1, 2, 3]})

如果就是想要?[1, 2, 3, 4]?呢?第一種方法就是拿到?原始狀態?的值,更新新數據,然后返回def fn1(state: MyState):

????old = state.get("messages", [])

return {"messages": old + [4]}

除此之外,在 LangGraph 中,還針對?Annotated?進行了封裝,在 Python 中?Annotated?只是另外一種形態的?注釋,對類型的聲明+使用并沒有任何影響,例如

不過這樣聲明有一個好處,在程序中,我們可以通過?.__metadata__?元數據屬性拿到這個值,如下

cn_salary.__metadata__

于是在 LangGraph 中就針對?注釋+元數據?進行了封裝,使用?Annotated?外掛需要處理數據的?歸納函數,如果外掛了則使用,不外掛也沒有任何影響,這就是利用?歸納函數?來更新狀態的核心。

代碼經過更新后,就可以正常對數據執行相應操作了:

def concat_lists(original: list, new: list) -> list:

????return original + new

class MyState(TypedDict):

????# messages: list

????messages: Annotated[list, concat_lists]

def fn1(state: MyState):

????return {"messages": [4]}

r = graph.invoke({"messages": [1, 2, 3]})

print(r)

# 輸出是 {'messages': [1, 2, 3, 4]}

使用?歸納函數?的優點也非常明顯,可以讓每個?節點?獨立執行,不用理會別人在做啥,不需要花額外的功夫去處理 state 里的其他數據,而且在更新 state 結構時,也不需要逐個節點更新,但是添加?歸納函數?后要想執行一些特殊的操作也非常麻煩,要額外花很多功夫,例如在?add_messages()?中的?RemoveMessage?和?更新消息,就進行了額外的判斷與處理

02. 多節點并行同時執行

在 LangGraph 中,END?節點非常特殊,并不是?圖結構?程序走到?END?節點就終止了,只是?當前路線結束?了, 也就是說?END?是結束當前?路線,并不是結束?圖,理解好這個概念才能處理好?多節點并行執行?的情況。

例如如下并行路線

在上述的節點中,如果將圖結構轉換成帶有層級的圖,則?左1?和?右1?處于同一層級上,所以這兩個節點是并行執行的,但是順序不一定能保證,雖然在 LangGraph 中會按照連接的順序來執行,最終輸出就是:START->左1->右1->合并。

如果是以下的并行路線

在這個?圖結構?中,合并?雖然屬于?END?節點,并且在?左1?執行完成之后就會執行?合并,但是?合并節點?并不會終止整個圖的執行,而是會和?右2?作為同一層一起執行(并行執行,順序不確定),所以最終輸出:START->左1->右1->合并->右2->右3->合并。

如果想讓?合并?節點只執行一次,只要把?左1?和?右3?合并同時連接到?合并?節點上即可,這樣這兩個節點就處于同一層,更新代碼如下

graph.add_edge(["left1", "right3"], "merge")

03. 檢查點 CheckPoint

檢查點的概念因為它的名字,初次使用理解起來可能會比較吃力,其實只需要把?檢查點?看成是一個?存儲介質,用來記錄這些資料,就好比游戲存檔、不同玩家不同場次、可以存起來,然后載入,甚至篡改更新

所以在 LangGraph 圖程序中加入?檢查點?就等同于加入了一個?外部存儲介質,會將每一個節點的?狀態?都存儲起來(StateSnapshot),變成一個歷史的 list,所以對于?圖程序?必須配置檢查點才可以拿到?snapshot游戲存檔:

  • graph.get_state(config):拿到?檢查點?的最后一次存檔(最后一個節點更新后的狀態)。
  • graph.get_state_history(config):拿到檢查點的所有存檔(每個節點更新后的狀態列表)。

在前面的課時中,我們傳遞的?config?里只有?thread_id,但是在?get_state_history(config)?拿到的所有存檔列表中,還存在另外一個字段?thread_ts?代表線程的執行時間,通過該字段就可以唯一定位檢查點中的某個存檔,例如

StateSnapshot(..., config={'configurable': {'thread_id': '1', 'thread_ts': '1ef2985c-bed5-6dee-8003-6037939ae5aa'}}, ...)

和游戲存檔回退一樣,如果我們想回退到指定的存檔,只需調用?invoke()?玩游戲,并載入指定存檔的配置即可

for s in graph.stream(

????????input=None,

????????config=past_config, ?# <--

????????stream_mode="values"

):

????print(s)

甚至是我們想篡改?存檔?的數據也是可以的,還記得?update_state()?這個函數么,同樣可以傳入對應的?config,只需要在修改時,傳遞需要更改的?存檔配置?即可,例如

graph.update_state(

????config=past_config,

????values={"crew": [66, 77], "v": "BAD GUY"}

)

不過因為回退機制用得比較少,所以該功能在 LangGraph 的官網藏得也比較深,也沒有過多文章做出詳細的講解

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

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

相關文章

避坑指南!解決Navicat運行SQL成功但沒有表的問題

在運行轉儲的SQL文件時&#xff0c;成功運行&#xff0c;試了很多辦法都不顯示出表。原因&#xff1a;當從一個高版本的 MySQL 數據庫導入數據到低版本的 MySQL 數據庫時&#xff0c;可能會遇到兼容性問題。因為高版本的 MySQL 可能支持 utf8mb4_0900_ai_ci&#xff0c;而低版本…

在 Elasticsearch 中使用用戶行為分析:使用 UBI 和 search-ui 創建一個應用程序

作者&#xff1a;來自 Elastic Eduard Martin 及 Alexander Dvila 通過一個實際示例學習如何在 Elasticsearch 中使用 UBI。我們將創建一個在搜索和點擊結果時生成 UBI 事件的應用程序。 想要獲得 Elastic 認證嗎&#xff1f;看看下一次 Elasticsearch Engineer 培訓什么時候開…

SpringBoot3中使用Caffeine緩存組件

SpringBoot3已經把EhCache從框架中刪除了&#xff0c;SpringBoot3默認的緩存組件為Caffeine&#xff0c;那么我們在SpringBoot3中如何去使用它了&#xff1f; 1.添加依賴 <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>ca…

正則表達式與grep文本過濾詳解

文章目錄前言一、正則表達式概述1.1 定義1.2 主要用途1.3 Linux 中的正則表達式分類1.3.1 基礎正則表達式&#xff08;BRE&#xff09;1.3.2 擴展正則表達式&#xff08;ERE&#xff09;二、正則表達式的基本組成2.1 普通字符2.2 元字符2.2.1 基本元字符2.2.2 重復次數相關2.2.…

Dify 集成 Milvus 配置指南

&#x1f9e9; Dify 集成 Milvus 配置指南 &#x1f527; 詳細配置步驟 1. 環境準備與克隆倉庫 首先確保你的系統已安裝 Git、Docker 和 Docker Compose。然后克隆 Dify 的代碼倉庫&#xff1a; git clone https://github.com/langgenius/dify.git cd dify/docker2. 配置環境變…

為不平,不止于此

口碑可以成就一個人&#xff0c;也可以毀掉一個人&#xff0c; 所以我們選擇用實力去創造兩種無聲的口碑。 要么讓期待的你張口而呼&#xff0c; 要么讓挑剔的你啞口無言。瑪哈特科技創始人 #為不平&#xff0c;不止于此#

0902 C++類的匿名對象

Part 1.梳理思維導圖一.匿名對象1.概念沒有對象名的類對象2.格式類名();3.作用1.給有名對象初始化2.給對象數組初始化3.作為函數的參數傳遞給形參4.例子#include <iostream>using namespace std;class Dog {friend void Dogfriend(Dog &b); private:string name;int …

在 PySpark 中解鎖窗口函數的力量,實現高級數據轉換

本篇文章Mastering PySpark Window Functions: A Practical Guide to Time-Based Analytics適合數據分析和工程師入門了解PySpark的窗口函數。文章的亮點在于詳細介紹了窗口函數的基本概念及其在銷售數據分析中的實際應用&#xff0c;幫助讀者理解如何進行復雜的數據計算而無需…

從理念到實踐:三層解耦架構與“無系統”論

在上一篇中&#xff0c;我們揭示了“五層雙閉環”治理模型如何像骨骼一樣&#xff0c;為數字化轉型提供支撐和定型。但再宏偉的藍圖也需要堅實的施工來實現。今天&#xff0c;我們將深入最具體的實施層面&#xff0c;將“業務重塑”和“以人為本”的理念&#xff0c;轉化為可落…

詳細介紹Linux 內存管理struct page數據結構中的_count和_mapcount有什么區別?

在Linux內核的struct page中&#xff0c;_count&#xff08;或_refcount&#xff09;和_mapcount是兩個關鍵的引用計數成員&#xff0c;它們各自承擔不同的職責。以下是深度解析和代碼案例&#xff1a;1. _count vs _mapcount 區別詳解_count&#xff08;或_refcount&#xff0…

面陣 vs 線陣相機:怎么選不踩坑?選型公式直接套用

面陣vs線陣相機&#xff1a;怎么選不踩坑&#xff1f;選型公式直接套用&#x1f3af;面陣vs線陣相機怎么選不踩坑&#xff1f;&#x1f3af;一、面陣相機&#xff1a;工業檢測的“萬能選手”&#xff0c;拍全圖靠它&#x1f3af;二、線陣相機&#xff1a;大視野/高精度的“專屬…

Spring Security 如何使用@PreAuthorize注解

&#x1f9f1; 第一步&#xff1a;環境準備? 1. 創建數據庫&#xff08;MySQL&#xff09;-- 創建數據庫&#xff0c;使用 utf8mb4 字符集支持 emoji 和多語言 CREATE DATABASE security_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 使用該數據庫 USE security…

JVM中產生OOM(內存溢出)的8種典型情況及解決方案

Java中的OutOfMemoryError&#xff08;OOM&#xff09;是當JVM內存不足時拋出的錯誤。本文將全面剖析JVM中產生OOM的各種情況&#xff0c;包括堆內存溢出、方法區溢出、棧溢出等&#xff0c;并提供詳細的診斷方法和解決方案。 一、OOM基礎概念 1.1 OOM錯誤類型 Java中的OOM是…

【IEEE出版、EI檢索、往屆會后3個月檢索】第四屆信號處理、計算機網絡與通信國際學術會議(SPCNC 2025)

第四屆信號處理、計算機網絡與通信國際學術會議&#xff08;SPCNC 2025&#xff09;將于2025年12月5-7日于中國武漢召開&#xff08;線上同步&#xff09;。為本次會議旨在齊聚海內外信號處理、計算機網絡與通信等計算機領域的專家學者&#xff0c;為相關領域研究和從業人員提供…

Spring boot注解介紹

1. Spring 核心注解Spring Boot 是基于 Spring 框架的&#xff0c;所以核心注解依然適用。? 常見核心注解Component表示一個通用組件&#xff0c;Spring 會自動掃描并注入到容器中。Component public class MyComponent {public void sayHello() {System.out.println("He…

撤銷回退 情況?:已經 add ,但沒有 commit

撤銷回退 情況?&#xff1a;已經 add &#xff0c;但沒有 commit add 后還是保存到了暫存區呢&#xff1f;怎么撤銷呢&#xff1f; 1 # 向ReadMe中新增??代碼 2 hyb139-159-150-152:~/gitcode$ vim ReadMe 3 hyb139-159-150-152:~/gitcode$ cat ReadMe 4 hello bit 5 hell…

【Linux筆記】命令行與vim基礎

一、Linux命令行基礎 1. 基本語法命令空格參數&#xff08;可寫可不寫&#xff09;空格文件&#xff0c;文件夾&#xff08;可寫可不寫&#xff09;ls列出文件夾中的內容/opt 根目錄下的opt文件夾ls-a all顯示出所有文件以及隱藏文件/optls-a如果不寫則輸出一個點&#xff0c;當…

Redis 的整數集合:像分類收納盒一樣的整數專屬存儲

目錄 一、先懂定位&#xff1a;為什么需要整數集合&#xff1f;&#xff08;銜接哈希表&#xff09; 二、整數集合的結構&#xff1a;像 “貼了規格標簽的收納盒” 1. encoding&#xff1a;收納盒的 “規格標簽”&#xff08;核心&#xff1a;決定格子大小&#xff09; 2. …

Linux 進程狀態 — 僵尸進程

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄進…

React 中 key 的作用

React 中 key 的作用是什么&#xff1f; Date: August 31, 2025 Area: 原理key 概念 在 React 中&#xff0c;key 用于識別哪些元素是變化、添加或刪除的。 在列表渲染中&#xff0c;key 尤其重要&#xff0c;因為它能提高渲染性能和確保組件狀態的一致性。key 的作用 1&#x…