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 プロバイダの混用、複数日にわたる業務フロー、人間承認を含むワークフローにとって、現時点でもっとも素直な選択肢である。