大地遊戲啟示:深入理解LangGraph狀態的工作機制

許恆修 | Heng-Shiou Sheu
7 min readAug 9, 2024

你是否曾想過,大學校園裡常見的大地遊戲與最前沿的 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__狀態。

這邊 thread_id 用 1 區別。

與圖互動後,可以看到在每個節點時的 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. 你能想到哪些實際應用場景中,類似的狀態管理系統會發揮重要作用?

參考資料:

checking-historyhttps://langchain-ai.github.io/langgraph/how-tos/human_in_the_loop/time-travel/#checking-history

--

--

許恆修 | Heng-Shiou Sheu
許恆修 | Heng-Shiou Sheu

Written by 許恆修 | Heng-Shiou Sheu

AI研究員 @喬泰科技,軟體工程師@微光國際,業界講師 @FCU 創能學院,Co-Founder @圖靈文本。專注將科技應用於改善生活中,持續性分享軟體架構設計、前沿人工智慧研究、公司治理等觀念。整合科技、人文思維於一體。聯絡 📪 hengshiousheu@gmail.com

No responses yet