発端は、たった一行のツイートだった
2026年7月18日の未明(00:34 UTC)、OpenClaw の作者であり現在はOpenAIに在籍する Peter Steinberger が、短い問いを投げました。「まだループの話をしてる? それとも、もうグラフに移った?」
それだけです。にもかかわらず、数時間のうちに解説と図解が大量に流れ、4時間半後には「ループエンジニアリング死亡記事」まで書かれていました。 投稿は数時間で57万インプレッション、48時間で260〜290万(集計により差あり)に達したと報じられています。 そして「グラフエンジニアリング(Graph Engineering)」という語が、 AI駆動開発の次の合言葉として定着しはじめました。
ここで正直に言っておくと、この騒ぎ方は過剰です。 後述するように、技術そのものは1年以上前から存在します。 それでも、この問いが指した課題自体は本物でした。「エージェントを1体、賢く回し続けること」は、もう難しい部分ではなくなった—— 複数のエージェントが同時に動きはじめた瞬間、難所は別の場所へ移っていたのです。
用語の系譜 — なぜ「グラフ」まで来たのか
グラフエンジニアリングは突然生まれたわけではなく、AI駆動開発の設計単位が段階的に大きくなってきた結果として現れた語です。 流れを追うと、この語が何を指しているかが一気に見通せます。
プロンプトエンジニアリング
設計単位は「1回の入出力」。モデルの応答をどう制御するかが主戦場だった。指示の書き方・Few-shot・思考の誘導が中心。
コンテキストエンジニアリング
設計単位は「1回の推論に何を載せるか」。RAG・要約・圧縮・メモリなど、限られた窓に何を入れ何を捨てるかの設計へ移行。
ハーネスエンジニアリング
設計単位は「LLMの周辺装置」。ツール・権限・フック・フィードバックの返し方といったスキャフォールディングが性能を決めると認識された。
ループエンジニアリング
設計単位は「1体のエージェントの行動サイクル」。探索→計画→実行→検証→反復と、その終了条件・検証器の設計が焦点になった。
グラフエンジニアリング
設計単位は「ループの集合(=エージェント組織)」。ループのネットワークをどう配線するかが問題に。Steinbergerの一行が引き金となり一気に拡散。
注目すべきは、ループエンジニアリングという語自体、名付けられたのは約6週間前だったという点です。 用語の消費速度が異常に速い。だからこそ、言葉のブームと技術的実体を切り分けて読む必要があります。
定義 — 3つの設計面(ノード / エッジ / 状態)
もう少し厳密な定義を置きます。グラフエンジニアリングの設計面は3つです。
ノード:処理の単位
ノードは「エージェント」だけではありません。ここが誤解されやすいところです。決定的なコード(普通の関数)、ツール呼び出し、人間の承認、評価器(LLM-as-a-judge)も、すべて等格のノードです。 「全部エージェントにする」のは設計ではなく、単なる放棄です。
エッジ:遷移の条件
エッジは単なる矢印ではなく、「どういう条件でここへ進むのか」という宣言です。 条件分岐、リトライの戻り先、失敗時のフォールバック、エスカレーション先。 失敗経路を描いていないグラフは、本番では必ず詰まります。
状態:ノード間を流れる成果物
そして最も見落とされるのが状態です。グラフではコンテキストは自動的に伝播しません。 「何を次のノードへ渡すか」をスキーマとして明示的に定義する必要があります。 ここが単一エージェントとの決定的な違いです。
flowchart TD
IN["入力タスク"] --> PLAN["計画ノード<br/>(エージェント)"]
PLAN --> R1["調査ノード A<br/>(ループ)"]
PLAN --> R2["調査ノード B<br/>(ループ)"]
PLAN --> R3["調査ノード C<br/>(ループ)"]
R1 --> MERGE["統合ノード<br/>(決定的コード)"]
R2 --> MERGE
R3 --> MERGE
MERGE --> WRITE["生成ノード<br/>(構造化ノートのみ受領)"]
WRITE --> EVAL["評価ノード<br/>(新しいコンテキスト)"]
EVAL -->|基準未達| WRITE
EVAL -->|基準達成| HUMAN["人間の承認ノード"]
HUMAN -->|差し戻し| PLAN
HUMAN -->|承認| OUT["成果物"]
この図で効いているのは「生成ノードが構造化ノートしか受け取らない」点と「評価ノードが新しいコンテキストを持つ」点です。 前者は生ログの汚染を防ぎ、後者は書いた本人が自分の仕事に太鼓判を押すという 単一エージェント最大の弱点を構造的に潰します。
ループとグラフの関係 — 置換ではなく内包
「ループエンジニアリングは死んだ」という煽りは、論理として成立していません。正しい理解はこうです。
| 観点 | ループエンジニアリング | グラフエンジニアリング |
|---|---|---|
| 設計単位 | 1体のエージェントの行動サイクル | ループ群の配線(組織構造) |
| 主要な設計物 | 終了条件・検証器・ツール | ノード分割・エッジ条件・状態スキーマ |
| コンテキスト | 1本の文脈に蓄積されていく | ノードごとに分離。エッジで意図的に渡す |
| 並列実行 | 基本的に不可(逐次) | fan-out / fan-in が第一級の機能 |
| 可観測性 | 1本のトランスクリプトを追える | 経路が図として事前に読める |
| デバッグ | モデルの判断ミスを追う | 経路選択・マージ時の状態欠落を追う |
| 向くケース | 文脈が1つで収まる、速度と単純さが欲しい | 専門役割が分かれる、並列と監査が必要 |
| 主な失敗モード | 無限ループ、検証器の甘さ | 経路の暴走、状態のリーク、構造の膨張 |
昇格すべきか:4つの問い
では、いつグラフにすべきか。次の4問で判定できます。
- 別コンテキストが本当に必要か? ノードごとに別プロンプト・別ツールが要るのか。1体が役割を切り替えるだけで足りないか。
- 本物の fan-out / fan-in があるか? 並列に走らせて結果を合流させる必要があるのか。ただ順番に呼ぶだけではないか。
- 制御フローを図として先に固定したいか? 経路を事前に定義して検証・監査したいのか。走らせた後にログから復元すれば済むのか。
- 専門役割が実在するか? 調査者・執筆者・レビュアーが本当に別責務なのか。名前だけ分けていないか。
3種類のグラフ — 組織 / 作業 / 改善
「グラフ」と一口に言っても、寿命と役割の異なる3層が重なっています。この区別をしないと議論が噛み合いません。
| グラフの種類 | 寿命 | ノードは何か | 設計の焦点 |
|---|---|---|---|
| Org Graph(組織グラフ) | 長寿命・安定 | 名前付きの役割を持つ常設エージェント | 担当領域(ゾーン)の所有権と依存関係 |
| Work Graph(作業グラフ) | 短命・実行時に生成 | タスク・サブタスク・ツール・ファイル | 成果物の流れと並列度。証拠に応じて生成・統合・消滅する |
| Improvement Graph(改善グラフ) | 超長寿命 | メトリクス・評価・監査・ポリシー | エージェント自身がどう変わっていくか。ケイデンスの分離 |
Org Graph:ゾーンディフェンス
代表的なパターンがゾーンディフェンスです。 セキュリティ担当・データ担当・API担当・フロントエンド担当がそれぞれ安定した領域を持ち、自分の領域についての文脈を持ち続ける。人間の組織図に近い発想です。
もうひとつ広く紹介されているのがアドバイザ=オーケストレータ構成で、 計画役に強いモデル(例: Fable 5)を1体置き、実作業を安価なワーカー(例: Sonnet 5)へ振り分けます。 ある解説記事は「単一の高性能モデルで解く場合の92%の品質を、63%のコストで達成した」と報告しています (第三者ブログの主張であり、公式ベンチマークではない点は留意してください)。
Improvement Graph:アンカーを置く
最も見落とされ、かつ最も事故を生むのが改善グラフです。 複数のフィードバックループ(運用・品質・ガバナンス・監査)を接続していくと、グラフは自己一貫性を保ったまま、現実から任意に遠く離れていけるようになります。 全メトリクスが良好なのに、事業実態は悪化している——という状態です。
設計の勘所
ノード設計の3ルール
- 単一責務。調査者は情報源を探す、執筆者は書く、レビュアーは検査する。1ノードに3役をやらせない。
- クリーンな入力。そのノードが必要とするものだけを渡す。前段の思考過程や生HTMLは渡さない。
- エージェントである必要がないなら、コードにする。マージ・整形・スキーマ検証は決定的コードのほうが速く、安く、壊れにくい。
エッジ設計の3ルール
- 明示的な経路。「レビュー不合格→執筆者へ戻す」「合格→出力へ」を先に書く。LLMの気分で決めさせるほど経路は不安定になる。
- 状態ベースの分岐。分岐条件は共有状態の値で判定する。自然言語の判断に賭ける箇所は最小限に。
- 上限を必ず置く。リトライ回数・ループ回数・総ステップ数に硬い上限を入れる。上限なしのグラフはコストの穴。
コードで見る:LangGraph の StateGraph
実装イメージを掴むために、最も普及している LangGraph の形を見ておきます。状態スキーマを定義し、ノードを追加し、エッジで配線する——というだけの構造です。
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
# ① 状態スキーマ:ノード間を流れるものを明示的に定義する
class BriefState(TypedDict):
topic: str
notes: list[dict] # 調査ノードの構造化出力(生HTMLは載せない)
draft: str
review_passed: bool
revisions: int # 無限ループ防止のカウンタ
# ② ノード:エージェントでもよいし、ただの関数でもよい
def research(state: BriefState) -> dict:
return {"notes": search_and_summarize(state["topic"])}
def write(state: BriefState) -> dict:
# notes だけを見る。前段の思考過程は渡っていない
return {"draft": compose(state["notes"]), "revisions": state["revisions"] + 1}
def review(state: BriefState) -> dict:
# 新しいコンテキストで評価する(自己採点を構造的に禁止する)
return {"review_passed": judge(state["draft"], criteria=ACCEPTANCE)}
# ③ エッジ条件:状態の値で分岐し、必ず上限を置く
def route(state: BriefState) -> str:
if state["review_passed"] or state["revisions"] >= 3: # 上限なしのループは作らない
return "done"
return "revise"
g = StateGraph(BriefState)
g.add_node("research", research)
g.add_node("write", write)
g.add_node("review", review)
g.add_edge(START, "research")
g.add_edge("research", "write")
g.add_edge("write", "review")
g.add_conditional_edges(
"review",
route,
{"revise": "write", "done": END}, # 失敗経路もグラフに明示的に書く
)
app = g.compile()失敗モード — 複雑さは進歩ではない
グラフには、単一ループには存在しなかった固有の壊れ方があります。 導入前に把握しておく価値があります。
| 失敗モード | 何が起きるか | 対策 |
|---|---|---|
| 構造の膨張 | ノードとエッジが増え続け、どの経路が効いているのか誰も説明できなくなる | 境界のある決定的な骨格から始め、必要性を実証してから足す |
| 経路の不安定化 | LLMが判断するエッジが誤った経路を選び、実行ごとに挙動が変わる | 分岐は状態の値で。自然言語判断は最小限に |
| 実行制御の破綻 | 無限リトライ、競合、同じ副作用の二重実行 | 硬い上限+外部API呼び出しに冪等キーを持たせる |
| 状態の非互換 | スキーマ変更で、中断中の実行が再開できなくなる | 状態スキーマをバージョニングし、移行を用意する |
| 状態のリーク / 欠落 | 本来渡すべきでない情報が流れる、マージ時に静かにデータが落ちる | エッジごとに渡す項目を宣言し、マージ後に検証ノードを置く |
| 運用コストの増加 | 経路が増えるほどテスト・レイテンシ・トークン消費が増える | 「グラフに昇格する4つの問い」で入口を絞る |
冷静な評価 — 新しいのは技術ではなく「名前」
ここまで読んで「これ、ワークフローエンジンやDAGの話とどこが違うの?」と思った人は、正しく読めています。
| 項目 | 実態 |
|---|---|
| 技術として新しいか | 新しくない。LangGraph・AutoGen・Google ADK は2026年7月より前にグラフワークフローを実装済み。Anthropicも2024年に合成パターンを文書化しており、DAGベースのオーケストレーション研究はさらに前から存在する |
| では何が新しいのか | 「複数ループにまたがる制御層」を単一の設計対象として名付けたこと。焦点が個々のエージェントの自律性から、協調・状態の受け渡し・失敗境界へ移った |
| ループは死んだのか | 死んでいない。グラフはループを内包する。各ノードの中身はループのまま |
| 流行語なのか | 語の流行はマーケティングイベント。ただし語が指した課題(並列時の配線設計)は実在する |
一方で、名前が付いたこと自体には実用的な価値があります。設計対象として名前がついていないものは、レビューもテストも引き継ぎもできないからです。 「うちのエージェント配線」が「Work Graph」と呼べるようになると、 図に描き、差分をレビューし、失敗経路の抜けを指摘できるようになります。
実務でどう始めるか
最後に、明日から手を動かすための順序を置きます。ポイントは大きく始めないことです。
- まずループを固める。検証器と終了条件が甘いループを何個並べても、失敗が並列化するだけ。ここが土台。
- 4つの問いに答える。YESが2個未満なら、グラフ化しない。これが最も費用対効果の高い判断。
- 境界のある決定的な骨格を描く。3〜5ノードから。動的にノードを生成する設計は最初に選ぶものではない。
- 状態スキーマを先に書く。ノードの実装より前に「何が流れるか」を型で定義する。ここを後回しにすると必ず崩れる。
- 失敗経路を図に入れる。リトライ・フォールバック・人間へのエスカレーション。ハッピーパスだけの図は未完成。
- 上限と冪等性を入れる。リトライ上限、総ステップ上限、副作用ノードの冪等キー。
- アンカーを繋ぐ。ホールドアウト評価セットと人間の判断を、最適化ループの外側に固定する。
- 必要性を実証してから足す。ノードを増やすときは「どの失敗を防ぐためか」を書けること。
まとめ
- ① グラフエンジニアリングは「ループの配線」の設計分野。エージェント・コード・人間・評価器をノードに、実行条件・依存・状態遷移・並列・リトライ・権限をエッジと共有状態に落とす。設計面はノード / エッジ / 状態の3つ。
- ② ループを置き換えるのではなく内包する。ループはグラフの1ノード。だから順序は「ループを固めてからグラフへ昇格」。昇格判定は4つの問いで、YESが0〜1個なら「グラフの絵を着たループ」にすぎない。
- ③ 新しいのは技術ではなく名前。LangGraph・AutoGen・ADKは以前から同じことを実装済み。ただし「制御層に名前が付いた」ことでレビュー可能になった価値は本物。構造の膨張・経路の不安定化・状態のリーク・二重実行という固有の失敗モードを踏まえ、小さな決定的骨格から始め、アンカーを外側に固定する。
理解度チェック
グラフエンジニアリングとループエンジニアリングの関係を最も正確に述べているものはどれですか?
キーボード: 1〜4 で選択、Enter で回答