Skip to content
記事一覧に戻る
AI/AGI12 min

LangGraph 0.4 の状態マシン設計: 永続化・分岐・人介入の実装パターン

LangGraph 0.4 State Machines: Persistence, Branching, Human-in-Loop

Kenji WatanabeAI Engineer
2026-04-2212 min
LangGraphState MachinePersistenceHuman-in-LoopBranching

LangGraph の位置づけ

LangGraph は LangChain チームによる「明示的な状態マシンを書くための DSL」で、エージェントを「ノード(処理) + エッジ(遷移) + ステート(共有メモリ)」として表現する。Claude/OpenAI の SDK が比較的「単一エージェントの中に閉じる」のに対し、LangGraph は「複数の判断点と再開ポイントを伴うワークフロー」に向いている。

状態定義

```python from typing import TypedDict, Annotated from langgraph.graph import StateGraph, END

class State(TypedDict): request: str plan: list[str] results: list[dict] needs_human: bool ```

ノードと条件分岐

```python def planner(state): ... def executor(state): ... def reviewer(state): return {"needs_human": is_high_risk(state)}

graph = StateGraph(State) graph.add_node("planner", planner) graph.add_node("executor", executor) graph.add_node("reviewer", reviewer) graph.add_node("human", human_node)

graph.add_edge("planner", "executor") graph.add_edge("executor", "reviewer") graph.add_conditional_edges( "reviewer", lambda s: "human" if s["needs_human"] else END, {"human": "human", END: END} ) ```

永続化と再開

```python from langgraph.checkpoint.postgres import PostgresSaver saver = PostgresSaver.from_conn_string("postgresql://...") app = graph.compile(checkpointer=saver) ```

`thread_id` ごとに状態が永続化されるので、HITL ノードで人を待っている間も安全にプロセス再起動・再デプロイができる。

人介入ノード

`interrupt` を呼び出すと、その時点で実行が停止し、外部からの `Command(resume=...)` で再開できる。Slack や社内ポータル UI と連携して、承認・修正・棄却の 3 アクションを返す設計が定石。

タイムアウトと SLA

人介入ノードに 24 時間返答がない場合は自動的に「保留」とし、別ルートでエスカレーションする。`thread_id` に `expected_complete_at` をメタとして付け、別 worker から監視するのがシンプル。

観測

LangSmith / Langfuse を入れて trace 単位でグラフの遷移を可視化する。デバッグ時に「どのノードでループしたか」「どのツールが時間を食ったか」が一目でわかる。

まとめ

LangGraph は「永続化された状態マシン」というシンプルな抽象を、エージェント実装に持ち込むツール。複数 LLM プロバイダの混用、複数日にわたる業務フロー、人間承認を含むワークフローにとって、現時点でもっとも素直な選択肢である。

まずは無料相談から

お客様のIT課題をお聞かせください。最適なソリューションをご提案いたします。

お問い合わせはこちら