AIエージェント本番運用6ヶ月で火を噴いた話|マルチエージェント設計の失敗と今の構成
「エージェントが無限ループする」「コストが読めない」——本番投入から6ヶ月、痛い目を見続けて気づいたLangGraph・AutoGen・CrewAIの選び方と設計の落とし穴をまとめました。
先日、うちのチームでAIエージェントを本番投入してから約6ヶ月が経った。正直に言うと、最初の2ヶ月はほぼ毎週何かしら火を噴いていた。「エージェントが無限ループする」「コストが予測できない」「ツール呼び出しの順序がおかしい」……挙げればキリがない。でも今は、徐々にではあるけれど、安定して動くようになってきた。
6ヶ月で痛い目を見ながら学んだこと——特にマルチエージェント設計の落とし穴と、2026年時点で自分が「これが正解に近いかな」と思っている構成を、ここにまとめておく。以前 AIエージェント開発で痛い目を見た話 でも初期の失敗を書いたので、あわせて読んでもらえると経緯がわかりやすいと思う。
2026年のAIエージェントフレームワーク、結局どれを使うべきか
まず現在の選択肢を整理しておく。2026年に入ってフレームワーク戦国時代がある程度収束してきた印象がある。
| フレームワーク | 最新バージョン | 特徴 | 向いているユースケース |
|---|---|---|---|
| LangGraph | 0.3.x | ステートマシンベース、グラフ構造のエージェント制御 | 複雑なワークフロー、ヒューマンインザループ |
| AutoGen | 0.4.x | マルチエージェント会話フレームワーク、Actor Modelベース | エージェント間会話、役割分担型タスク |
| CrewAI | 0.9.x | 役割ベースのチーム型エージェント、設定が簡単 | 中規模タスク、チームメンバー型設計 |
| Semantic Kernel | 1.x (GA) | Microsoftが主導、.NET/Python両対応 | エンタープライズ、Azure連携 |
| OpenAI Agents SDK | 2026.4.x | OpenAI公式、シンプルなAPI設計 | OpenAIエコシステム完結、小〜中規模 |
うちのチームではLangGraphをメインに採用している。理由は単純で、「エージェントの実行状態をグラフとして可視化・制御できる」という設計思想が、本番運用のデバッグにめちゃくちゃ助かるからだ。最初はCrewAIのシンプルさに惹かれたんだけど、本番で複雑なロールバックが必要になったとき、状態管理の粒度が足りなくて詰んだ経験がある。
2026年4月にリリースされたOpenAI Agents SDK(旧Swarm)も検証中で、個人的にはHandoff機能のシンプルさが気に入っている。ただ、OpenAIモデル以外を使いたい場合の制約が正直しんどいので、本番メインには据えていない。ここは好み分かれるかも。
マルチエージェント設計パターンと実際の構成
うちのチームで運用しているのは、社内ドキュメント検索・要約・Slack通知を組み合わせた業務効率化エージェントだ。シンプルに聞こえるけど、実際は4つのエージェントが協調して動く結構複雑な構成になっている。
flowchart TB
User([ユーザー入力]) --> Orchestrator
subgraph AgentGraph["LangGraph マルチエージェント"]
Orchestrator[Orchestrator Agent\n意図解釈・ルーティング]
Retriever[Retrieval Agent\nRAG検索・ドキュメント取得]
Summarizer[Summarizer Agent\n要約・回答生成]
Notifier[Notifier Agent\nSlack/Teams通知]
Orchestrator -->|検索タスク| Retriever
Retriever -->|検索結果| Summarizer
Summarizer -->|要約完了| Orchestrator
Orchestrator -->|通知タスク| Notifier
Orchestrator -->|HITL確認| HumanCheckpoint
end
HumanCheckpoint([ヒューマンチェックポイント\n高リスク操作時]) --> Orchestrator
subgraph Tools["ツール群"]
VectorDB[(Vector DB\nPinecone)]
SlackAPI[Slack API]
InternalAPI[社内API]
end
Retriever --> VectorDB
Notifier --> SlackAPI
Orchestrator --> InternalAPI
この構成にたどり着くまでに、2つの大きな失敗があった。
失敗1: フラットなマルチエージェントにした
最初は全エージェントが対等に会話するフラット構成にしていた。AutoGenのGroupChatっぽいやつ。「みんなで議論して最適解を出す」みたいな夢のある設計だったんだけど、実際には会話が収束せず、エージェントが互いの発言を打ち消し合って無限ループになるケースが頻発した。コスト爆発もこのころに体験した。
今はOrchestratorを中心に置いた階層型にしている。意思決定は必ずOrchestratorを経由して、他のエージェントはそれぞれの専門タスクに集中する設計。これだけでループ問題は9割解消した。地味だけど、この一手が一番効いた改善だったと思う。
失敗2: ヒューマンインザループを後付けにした
最初は「エージェントに全部やらせたい」という気持ちが強くて、ヒューマンインザループ(HITL)を軽視していた。でも社内APIを操作するタスクでエージェントが誤った操作をしたとき、ロールバックに丸1日かかった。それ以来、高リスクな操作の前には必ずHITLチェックポイントを挟んでいる。
LangGraphのCheckpointは本当によくできていて、中断・再開がスムーズ。こういう経緯があるので、SLO設計とエージェントの可観測性は早めに整備しておくことを強くすすめる。
コスト管理、これが一番頭を悩ませた
AIエージェント開発でみんな最初に詰まるのがコスト管理だと思う。マルチエージェントはLLM呼び出しが多段になるので、シンプルなチャットと比べてコストが5〜10倍になることがざらにある。
うちの環境での実測値を共有する。タスクの種類によって使用モデルを切り替える戦略にしている。
xychart-beta
title "エージェントタスク種別ごとの月次APIコスト(万円)"
x-axis ["Orchestration", "Retrieval", "Summarization", "Notification", "合計"]
y-axis "コスト(万円)" 0 --> 50
bar [12, 8, 18, 3, 41]
Summarizationが一番高いのは、長文ドキュメントを扱うことが多いから。これをGPT-4oからGemini 1.5 Proに切り替えたことで、同品質でコストを約35%削減できた。正直まだ最適化の余地はあると思っているけど、品質とのトレードオフで今はここで落ち着いている。
実装側では、LangSmithのトレーシングとコスト追跡を組み合わせて、タスクごとの詳細なコスト可視化をしている。
from langchain_core.callbacks import LangChainTracer
from langsmith import Client
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
# ステート定義
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
task_type: str
cost_budget: float
current_cost: float
result: str
# コスト監視ノード
def cost_guard(state: AgentState) -> AgentState:
"""コスト上限チェック。超過したらエスカレーション"""
if state["current_cost"] > state["cost_budget"]:
raise ValueError(
f"Cost budget exceeded: {state['current_cost']:.4f} > {state['cost_budget']:.4f}"
)
return state
# Orchestratorノード(モデル選択ロジック含む)
def orchestrator_node(state: AgentState) -> AgentState:
"""
タスク種別に応じてモデルを動的選択。
高精度が必要なSummarizationはGPT-4o、
それ以外は軽量モデルで対応。
"""
task = state["task_type"]
model_map = {
"summarization": "gemini-1.5-pro", # コスト重視
"orchestration": "gpt-4o-mini", # 速度・コスト重視
"retrieval_query": "gpt-4o-mini", # 軽量タスク
"notification": "gpt-4o-mini", # 定型タスク
}
selected_model = model_map.get(task, "gpt-4o")
# 実際のLLM呼び出しはここで行う(省略)
return {
**state,
"messages": state["messages"] + [
{"role": "system", "content": f"Selected model: {selected_model} for task: {task}"}
]
}
# グラフ構築
def build_agent_graph() -> StateGraph:
graph = StateGraph(AgentState)
graph.add_node("cost_guard", cost_guard)
graph.add_node("orchestrator", orchestrator_node)
# 他のノードは省略
graph.set_entry_point("cost_guard")
graph.add_edge("cost_guard", "orchestrator")
return graph.compile()
コスト予算をStateに持たせてguardノードで監視するパターンは、最初からやっておけばよかった設計の筆頭。本番で予算超過アラートが飛んでから気づくのは、精神的にも体力的にもしんどい。
信頼性・可観測性の整備が本番品質を決める
エージェントのデバッグはLLMの非決定性があるので、通常のサービスより格段に難しい。「なぜこのツールを呼んだのか」「なぜここで止まったのか」がトレースなしだと全く追えない。
観測体制として今やっていることは3つある。LangSmith でトレーシング・コスト・レイテンシをタスク単位で可視化、Prometheus + Grafana でエージェント実行のメトリクスを外部監視、そして構造化ログでエージェントの各ノード実行をJSON形式で記録——この3点セットがないと、正直デバッグがギャンブルになる。
xychart-beta
title "エージェント応答品質スコア推移(月次平均)"
x-axis ["2025-11", "2025-12", "2026-01", "2026-02", "2026-03", "2026-04"]
y-axis "品質スコア(0-100)" 50 --> 100
line [62, 68, 74, 80, 85, 88]
最初の2ヶ月は品質スコアが60台で、ユーザーからのフィードバックもかなり厳しかった。改善が加速したのは、LangSmithでのトレース分析を週次レビューに組み込んでから。「このタスクパターンで精度が落ちる」が数値で見えるようになって、改善の優先順位が立てやすくなった。週次レビューに入れるまでは「なんか動いてるっぽいけど不安」みたいな状態が続いていたので、これは早めにやっておくべきだったと反省している。
プロンプト設計についても触れておきたい。うちのチームでは各エージェントのシステムプロンプトをバージョン管理して、A/Bテスト的に改善を重ねている。プロンプト設計の話は プロンプト設計はセンスじゃない——チーム運用2年で見えた構造化の話 に詳しく書いたので参照してほしい。
あと、RAGとエージェントを組み合わせる場合は、検索品質がエージェント全体の品質を左右する。RAG本番2年で「なんか惜しい」を乗り越えた話 で書いたチャンキング設計はエージェント文脈でも完全に当てはまる内容なので、こちらも合わせてどうぞ。
2026年の設計トレンドと今後の展望
最近気になっているのが、メモリ管理の標準化とAgent-to-Agent (A2A) プロトコルの動向だ。
Googleが2026年初頭に公開したA2Aプロトコルは、異なるフレームワーク間でエージェントが協調するための標準仕様で、OpenAI・Anthropicも追従する動きがある。うちではまだ本番投入していないけど、今後マルチベンダーでエージェントを組み合わせるなら無視できない仕様になりそう。個人的には「ようやくここに来たか」という感じで、早く成熟してほしい。
メモリ管理については、MemGPT系のアプローチが成熟してきた感がある。長期記憶・短期記憶・エピソード記憶を明示的に分けて管理する設計は、長期間のタスク継続が必要なエージェントには効果的だった。うちのユースケースだと短期記憶だけで事足りているので、まだ本番適用はしていないけど。
flowchart LR
subgraph MemoryLayer["メモリ管理レイヤー(検討中)"]
WM[ワーキングメモリ\n今のコンテキスト]
EM[エピソードメモリ\n過去タスク履歴]
SM[セマンティックメモリ\nナレッジベース]
end
subgraph AgentCore["エージェントコア"]
Agent[Orchestrator\nAgent]
end
subgraph Storage["ストレージ"]
Redis[(Redis\nWM用)]
VectorDB[(Vector DB\nEM/SM用)]
end
Agent <--> WM
Agent <--> EM
Agent <--> SM
WM --> Redis
EM --> VectorDB
SM --> VectorDB
この辺はまだ検証中で、本番でどう設計するかを絶賛悩んでいる段階。エージェント間の記憶共有をどこまでやるかは、セキュリティ(誰のメモリを誰が参照できるか)と品質のトレードオフがあって一筋縄ではいかない。
皆さんのチームではエージェントのメモリ管理をどう設計してます?XとかZennで知見を共有してくれると嬉しい。
まとめ
6ヶ月のマルチエージェント本番運用から得た知見を整理するとこうなる。
- フラット型より階層型オーケストレーション:Orchestratorを中心に置く設計がループ・コスト爆発の防止に直結した
- HITLは最初から設計に組み込む:高リスク操作の前にヒューマンチェックポイントを置くのは後付けでは本当に辛い
- コスト監視はStateレベルで実装する:タスク種別ごとのモデル選択とガード処理で想定外のコスト超過を防げる
- LangSmithなどのトレーシングは非交渉:LLMの非決定性によるデバッグにはトレースが命綱
- A2AプロトコルとMemGPTは今から追っておく価値あり:2026年後半〜2027年に向けてスタンダードになる可能性が高い
次に何から手をつければいいか迷っている人には、LangGraph + LangSmithでローカル環境に最小構成のエージェントを立てて、コストとトレースの可視化から始めるのをすすめる。OpenAI Agents SDKの公式チュートリアルとLangGraphのHandoffパターンを比較してみると、設計思想の違いが肌感覚でわかってくるので、両方触ってみるのも面白い。本番を想定するなら、最初から予算ガードとHITLチェックポイントを仕込んでおくと後で絶対後悔しない。
AIエージェントは「動かすこと」自体はすぐできるけど、「本番で安定させること」の難易度が段違いに高い。でもその分、うまくいったときの業務インパクトは大きくて、うちのチームでは月50時間くらいの手動作業が自動化できた。まだ道半ばだけど、一緒に試行錯誤していきましょう。