複数モデルを活用したAIエージェント構築:実践的アーキテクチャガイド
ほとんどのAIエージェントはすべての処理に単一のモデルを使っています。計画ステップ、ツール呼び出し、要約、エラー回復などです。これはデモには適していますが、本番環境では非効率です。
深い推論を必要とする計画ステップに、JSON抽出ステップと同じモデルは不要です。コード生成タスクは分類タスクとは異なる要件を持ちます。Claude Opus 4.6($25/100万出力トークン)を使って日付文字列をフォーマットするのは、壁を塗るためにシニアアーキテクトを雇うようなものです。
ここでは、各ステップを最適なモデルにルーティングするエージェントの構築方法を紹介します。
マルチモデルエージェントアーキテクチャ
User Request
│
▼
┌─────────────┐
│ Router │ ← タスクの複雑さを分類
│ (fast model)│
└──────┬──────┘
│
┌───┴───┐
▼ ▼
┌──────┐ ┌──────┐
│Simple│ │Complex│
│Model │ │Model │
└──┬───┘ └──┬───┘
│ │
▼ ▼
┌─────────────┐
│ Aggregator │ ← 結果を統合
│ (fast model)│
└─────────────┘
3つのコンポーネント:
- タスクの複雑さを分類するルーター
- 異なるタスクタイプに対応するモデルプール
- 必要に応じて結果を統合するアグリゲーター
OpenAI SDKによる実装
アグリゲーターを通じて単一のAPIキーを使うことで、複数のSDKを管理せずにすべてのモデルにアクセスできます:
from openai import OpenAI
client = OpenAI(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
# コスト/性能階層に基づくモデルプール
MODELS = {
"router": "gpt-4.1-mini", # $0.40/100万入力トークン - 高速分類用
"simple": "gpt-4.1-mini", # $0.40/100万入力トークン - 抽出、フォーマット用
"reasoning": "claude-sonnet-4-6", # $3.00/100万入力トークン - 計画、分析用
"complex": "gpt-4.1", # $2.00/100万入力トークン - コード生成、多段階処理用
"budget": "deepseek-chat", # $0.28/100万入力トークン - 大量処理用
}
def route_task(task: str) -> str:
"""安価なモデルでタスクの複雑さを分類する。"""
response = client.chat.completions.create(
model=MODELS["router"],
messages=[
{"role": "system", "content": """このタスクを以下のカテゴリに分類してください:
- simple: データ抽出、フォーマット、翻訳
- reasoning: 分析、計画、比較
- complex: コード生成、多段階問題解決
- budget: 大量処理、非重要タスク
カテゴリ名のみで回答してください。"""},
{"role": "user", "content": task}
],
max_tokens=10
)
category = response.choices[0].message.content.strip().lower()
return MODELS.get(category, MODELS["simple"])
def execute_task(task: str, context: str = "") -> str:
"""適切なモデルにタスクをルーティングして実行する。"""
model = route_task(task)
messages = []
if context:
messages.append({"role": "system", "content": context})
messages.append({"role": "user", "content": task})
response = client.chat.completions.create(
model=model,
messages=messages
)
return response.choices[0].message.content
実用的なエージェント:コードレビューのパイプライン
プルリクエストをレビューする実践的なマルチモデルエージェントの例:
def review_pr(diff: str) -> dict:
"""マルチモデルPRレビューのパイプライン。"""
# ステップ1: 変更内容の分類(安価なモデル)
classification = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[{
"role": "user",
"content": f"このコード変更を分類してください: {diff[:2000]}\n"
"カテゴリ: bugfix, feature, refactor, docs, test"
}],
max_tokens=20
).choices[0].message.content
# ステップ2: セキュリティスキャン(推論モデル)
security = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{
"role": "system",
"content": "あなたはセキュリティレビュアーです。以下をチェックしてください:"
"SQLインジェクション、XSS、認証バイパス、コード内のシークレット、"
"安全でないデシリアライズ。行番号を具体的に示してください。"
}, {
"role": "user",
"content": f"この差分をセキュリティ問題についてレビューしてください:\n{diff}"
}]
).choices[0].message.content
# ステップ3: コード品質(一般モデル)
quality = client.chat.completions.create(
model="gpt-4.1",
messages=[{
"role": "user",
"content": f"コード品質をレビューしてください:命名、構造、"
f"エラーハンドリング、テストカバレッジ。\n{diff}"
}]
).choices[0].message.content
# ステップ4: 要約(安価なモデル)
summary = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[{
"role": "user",
"content": f"このPRレビューを3つの箇条書きで要約してください:\n"
f"タイプ: {classification}\n"
f"セキュリティ: {security[:500]}\n"
f"品質: {quality[:500]}"
}]
).choices[0].message.content
return {
"classification": classification,
"security": security,
"quality": quality,
"summary": summary
}
典型的なPRレビュー(2Kトークン差分)のコスト内訳:
| ステップ | モデル | 入力トークン数 | コスト |
|---|---|---|---|
| 分類 | GPT-4.1-mini | 約2,100 | $0.0008 |
| セキュリティ | Claude Sonnet 4.6 | 約2,500 | $0.0075 |
| 品質 | GPT-4.1 | 約2,500 | $0.0050 |
| 要約 | GPT-4.1-mini | 約1,200 | $0.0005 |
| 合計 | 約$0.014 |
すべてのステップをClaude Sonnet 4.6で行うと約$0.028かかります。マルチモデル方式はコストを50%削減しつつ、最も重要なセキュリティレビューには最強モデルを使えます。
LangChainとの統合
from langchain_openai import ChatOpenAI
# 異なる設定のモデルインスタンスを作成
fast = ChatOpenAI(
model="gpt-4.1-mini",
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
reasoning = ChatOpenAI(
model="claude-sonnet-4-6",
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
# LangChainのチェーンで使用
from langchain_core.prompts import ChatPromptTemplate
classify_chain = ChatPromptTemplate.from_template(
"Classify: {input}"
) | fast
analyze_chain = ChatPromptTemplate.from_template(
"Analyze in depth: {input}"
) | reasoning
マルチモデルエージェントを使うべきタイミング
マルチモデルルーティングは複雑さを増します。以下の場合に価値があります:
- エージェントが多様なタスクタイプを扱う(単なるチャットではない)
- 月間APIコストが100ドルを超える(節約効果が大きくなる)
- 特定のモデルの強みが必要(コードにはClaude、長文コンテキストにはGemini、速度重視にはGPTなど)
- 一部のステップではレイテンシが重要だが、他はそうでない場合
単純なチャットボットや単一目的のエージェントには単一モデルで十分です。すべてのリクエストに同じ能力が必要な場合、ルーティングのオーバーヘッドは正当化されません。
重要なポイント
- 各ステップに最も安価で適したモデルを使う
- 本当に必要なタスクには高価なモデルを使い分ける
- 分類・ルーティングステップは常に最も安価なモデルを使う
- トークン単価だけでなく、エージェント1回あたりの実コストを測定する
- 単一APIキーのアグリゲーターを使うとマルチモデルアクセスが大幅に簡単になる
1つのAPIで全モデルにアクセス:lemondata.ccは300以上のモデルを単一APIキーで提供。複数のプロバイダーアカウント管理なしでマルチモデルエージェントを構築できます。
