LangGraph アーキテクチャ総览
一言で
LangGraph は Channel + Pregel ループ をカーネルとするステートマシン式エージェントオーケストレーションフレームワークです。StateGraph は構築レイヤでノード/エッジを Pregel の実行可能体へコンパイルし、実行時は PregelLoop.tick が「channel を読む → タスクを调度する → channel へ書く → checkpoint」を収束まで繰り返します。その間 StreamMux でマルチモードのストリーミング出力を行い、interrupt/Command でヒューマンインザループを実現し、BaseCheckpointSaver 系がスレッド単位の永続化を担い、@entrypoint/@task が関数型の等価 API を提供します。
レイヤ構成
各レイヤを一言で
- 起動と設定:RunnableConfig が thread_id/store/checkpointer を運び、StateSnapshot は get_state が返す不変スナップショットです。
- Graph 構築:StateGraph がユーザ入口で、add_node/add_edge/add_conditional_edges がトポロジを定義し、compile が CompiledStateGraph(Pregel インスタンス)を産出します。
- Pregel エンジン:Pregel がコンパイル産物で、stream/invoke/astream が入口。PregelLoop.tick が単ステップを実行し、PregelRunner がタスクを並列実行し、_algo がタスク準備/書き戻し/中断判定を担います。
- Channel:BaseChannel が update/consume/checkpoint セマンティクスを抽象化し、LastValue はデフォルトの上書き、Topic は pub/sub、Binop は二項演算子の集約です。
- Checkpoint:BaseCheckpointSaver インターフェースが put/get/list を定義し、InMemory/Sqlite/Postgres の三実装が同期/非同期をサポートします。
- ストリーミング:StreamMux がマルチモード mux/demux を行い、各 transformer(values/updates/messages/debug/lifecycle/subgraph/checkpoints/tasks)が異なるビューを産出します。
- 機能 API:@entrypoint が関数を Pregel 実行可能体に変え、@task が並列可能なサブタスクを宣言します。
- 中断とサブグラフ:interrupt() がヒューマンインザループ中断を起こし、Command(resume/goto/update) がリカバリと遷移を駆動し、Send が fan-out を実現します。
レイヤ分離の動機
LangGraph は「グラフをどう定義するか」(graph 構築)、「どう実行するか」(Pregel)、「状態をどう更新するか」(channel)、「どう永続化するか」(checkpoint)、「どう見るか」(stream)、「関数型でどう等価にするか」(func)、「人とどうやり取りするか」(interrupt)、「どう编排するか」(subgraph) を完全に疎結合にしています。これにより checkpoint バックエンドを変えても実行ロジックに影響せず、stream モードを変えてもグラフ定義に影響せず、中断を追加しても channel を変えずに済みます。Pregel は唯一の中枢で、すべての実行パスは最終的に PregelLoop.tick を経由します。
よくある誤読
- 「LangGraph は LangChain のグラフラッパー」——違います。独立した Pregel 実行エンジンを持ち、LangChain の chain/agent 抽象に依存せず単独で使えます。
- 「channel は state のこと」——channel は状態の更新セマンティクス層です。異なる channel 型(LastValue/Topic/Binop)が状態のマージ方法を決める点が、普通のステートマシンより強力です。
- 「@entrypoint は StateGraph の糖衣構文」——機能は等価ですが実装は異なります。func API は FunctionalAPI パスを経由し最終的に Pregel にコンパイルされますが、並列と join のセマンティクスは通常の関数に近いです。
推薦読書順序
まず 起動と設定 を読み、次に StateGraph と Pregel エンジン を読み、その後 PregelLoop tick → Channel → Checkpoint → ストリーミング → 機能 API → 中断とリカバリ → サブグラフ编排 の順に下へ展開してください。
公式資料:LangGraph ドキュメント · GitHub