iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
生成式 AI

2024 年用 LangGraph 從零開始實現 Agentic AI System系列 第 8

【Day 8】- 深入理解 LangGraph 狀態的工作機制

  • 分享至 

  • xImage
  •  

摘要
這篇文章以大家熟悉的「大地遊戲」為比喻,深入淺出地解說了 LangGraph 的狀態管理機制,並強調其在 AI 對話系統中的重要性。文章首先說明 LangGraph 的基本概念,將節點 (Node) 比喻為大地遊戲中的關卡,狀態 (State) 則如同參賽者的積分卡。接著,文章詳細介紹了 LangGraph 狀態的組成、如何追蹤對話歷史紀錄、狀態操作以及可視化狀態轉移等功能,並用程式碼範例和圖表清晰地展示這些功能的應用。最後,文章還提出了一些思考問題,引導讀者思考 LangGraph 的應用場景以及狀態管理在實際應用中的重要性。

簡介

你是否曾想過,大學校園裡常見的大地遊戲與最前沿的 AI 對話系統有何關聯?深入解析了LangGraph的運作機制,並透過大地遊戲的比喻,讓讀者輕鬆理解AI對話系統的工作原理。文章包含詳細的狀態管理示例、實作範例、歷史記錄查閱、狀態操作和可視化狀態轉移等多個主題,是對於想要學習或優化AI對話系統的開發者必讀的指南。通過這些內容,讀者能夠掌握LangGraph如何在複雜的對話場景中靈活應對各種挑戰。

首圖

大地遊戲:理解LangGraph的基本概念

想像一個設置在大學校園的大地遊戲。在這個遊戲中,校園的各個關卡就如同LangGraph中的節點(Node),而每一位參賽者就是要闖關達成目標的主角。參賽者手上都會有積分卡來記錄遊戲進度,不管過程如何,最終都會完成闖關。遊玩過程中,參賽者每到一關挑戰成功後得到分數,然後關主會指引前往下一個關卡。

大地遊戲是一種在特定場地進行的團康活動,透過多樣的遊戲形式和角色分工,促進團隊合作和參與者之間的互動,常見於台灣大學營隊中。這種遊戲形式與LangGraph的運作方式有許多相似之處,有助於我們理解AI對話系統的工作原理。

LangGraph中的狀態管理

在LangGraph世界中,每次與圖進行互動時,系統都會生成一個新的state(狀態)。這個狀態記錄著當前的情況、thread_id(線程ID)、checkpoint_id(檢查點ID)等重要信息。讓我們看一個具體的State範例:

## 此為一個 State 範例內容
StateSnapshot(
    values={'lnode': 'node_2', 'scratch': 'hi', 'count': 2},
    next=('Node1',),
    config={
        'configurable': {
            'thread_id': '1',
            'checkpoint_ns': '',
            'checkpoint_id': '1ef5603e-03f5-687a-8002-c289cfaa5499'
        }
    },
    metadata={'source': 'loop', 'writes': {'Node2': {'lnode': 'node_2', 'count': 1}}, 'step': 2},
    created_at='2024-08-09T04:00:11.891264+00:00',
    parent_config={
        'configurable': {
            'thread_id': '1',
            'checkpoint_ns': '',
            'checkpoint_id': '1ef5603e-03d8-6216-8001-75db3daef60e'
        }
    }
)

這就是有趣的部分了,在這個結構中:

  • values 表達當前節點的狀態
  • config 記錄時間戳和其他配置信息
  • parent_config 記錄前一個節點的信息

將其比喻回大地遊戲,values就像是參賽者的積分卡,config則記錄抵達每個關卡的時間,而thread_id則用來識別不同的參賽者。

有些文件是寫說 thread_ts, parent_ts,根據官方文件 LangGraph v0.2,已經分別改名為 checkpoint_id 以及 parent_checkpoint_id

實作 Graph:扒開運作機制

讓我們通過一個簡單的實例來了解LangGraph的運作機制。完整的程式碼可以在這裡找到,但我們將重點關注核心概念。
在這個例子中,我們定義了兩個節點Node1Node2。每經過一個節點時,系統會進行count計算。只有當count達到或超過3時,對話才會進入__end__狀態。

首圖

與圖互動後,可以看到在每個節點時的 count 數值。

首圖

查看歷史紀錄:追蹤對話進程

LangGraph提供了強大的歷史記錄功能。使用graph.get_state_history()方法,我們可以獲取整個對話過程的所有狀態。以下是一個狀態快照的示例:

StateSnapshot(
    values={'lnode': 'node_1', 'scratch': 'hi', 'count': 3},
    next=('Node2',),
    config={
        'configurable': {
            'thread_id': '1',
            'checkpoint_ns': '',
            'checkpoint_id': '1ef5603e-0410-65a5-8003-6c2a9c7a1b42'
        }
    },
    metadata={'source': 'loop', 'writes': {'Node1': {'lnode': 'node_1', 'count': 1}}, 'step': 3},
    created_at='2024-08-09T04:00:11.902254+00:00',
    parent_config={
        'configurable': {
            'thread_id': '1',
            'checkpoint_ns': '',
            'checkpoint_id': '1ef5603e-03f5-687a-8002-c289cfaa5499'
        }
    }
)

為了方便分析,我們可以將歷史記錄存儲在一個列表中:

states = []
for state in graph.get_state_history(thread):
    states.append(state.config)
    print(state.config, state.values['count'])

狀態操作:靈活控制對話流程

LangGraph不僅允許我們查看完整的歷史記錄,還提供了獲取特定時間點狀態的功能。例如,使用graph.get_state(states[-3])可以獲取倒數第三個狀態。
此外,LangGraph還支持更多細緻的操作,如更改狀態信息等。這些進階功能在官方教材《AI Agents in LangGraph》的Human-in-loop章節中有詳細說明。

可視化狀態轉移:一目了然的對話進程

為了更直觀地理解對話的進展,我們可以將圖中的狀態轉移以圖表形式展現。這樣可以清楚地看到當前節點位置以及各項計算數值的變化

首圖

在這個可視化中,我們可以注意到:

  • 每個步驟都有一個唯一的「checkpoint_id」,用於精確追蹤對話進程。
  • 「count」值隨著每個步驟遞增,直觀地展示了迭代次數。

碎碎念時間
LangGraph 當下已經來到 v0.2 版本,有些函數可能或多或少有變化,請實作時留意版本號。官方教材中是擺放在 Human-in-loop 當中,沒有獨立概念跟機制來說明狀態轉移過程。摸了一段時間之後才找到相關的內容。對新手來說滿有挑戰的。

結論

本文通過將 LangGraph 與大地遊戲進行類比,生動地解釋了 LangGraph 中的節點、狀態管理、運作機制,以及如何通過歷史紀錄與可視化工具來追蹤對話進程。這種比喻幫助我們更好地理解 AI 對話系統的運作方式,特別是在節點互動和狀態管理方面。

反思

  1. LangGraph 透過節點互動和計算進行對話管理。你覺得在這種互動過程中,最具挑戰性的是什麼?如何克服這些挑戰?
  2. 使用歷史紀錄功能可以回溯對話進程。這種能力在日常生活或技術開發中有何應用價值?
  3. 你能想到哪些實際應用場景中,類似的狀態管理系統會發揮重要作用?

本篇教學程式碼位於比賽用 Repo,記得多多操作

參考資料:
checking-history:https://langchain-ai.github.io/langgraph/how-tos/human_in_the_loop/time-travel/#checking-history


上一篇
【Day 7】 - LangGraph 深入探索:Function Calling 機制與進階應用
下一篇
【Day 9】- 從 Redux 到 LangGraph:AI 時代下的狀態管理新思維
系列文
2024 年用 LangGraph 從零開始實現 Agentic AI System9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言