設定

言語

複数モデルを活用したAIエージェント構築:実践的アーキテクチャガイド

L
LemonData
·2026年2月26日·13 回表示
#AIエージェント#マルチモデル#アーキテクチャ#チュートリアル#LangChain
複数モデルを活用したAIエージェント構築:実践的アーキテクチャガイド

複数モデルを活用したAIエージェント構築:実践的アーキテクチャガイド

ほとんどのAIエージェントはすべての処理に単一のモデルを使っています。計画ステップ、ツール呼び出し、要約、エラー回復などです。これはデモには適していますが、本番環境では非効率です。

深い推論を必要とする計画ステップに、JSON抽出ステップと同じモデルは不要です。コード生成タスクは分類タスクとは異なる要件を持ちます。Claude Opus 4.6($25/100万出力トークン)を使って日付文字列をフォーマットするのは、壁を塗るためにシニアアーキテクトを雇うようなものです。

ここでは、各ステップを最適なモデルにルーティングするエージェントの構築方法を紹介します。

マルチモデルエージェントアーキテクチャ

User Request
    │
    ▼
┌─────────────┐
│   Router     │  ← タスクの複雑さを分類
│  (fast model)│
└──────┬──────┘
       │
   ┌───┴───┐
   ▼       ▼
┌──────┐ ┌──────┐
│Simple│ │Complex│
│Model │ │Model  │
└──┬───┘ └──┬───┘
   │        │
   ▼        ▼
┌─────────────┐
│  Aggregator  │  ← 結果を統合
│  (fast model)│
└─────────────┘

3つのコンポーネント:

  1. タスクの複雑さを分類するルーター
  2. 異なるタスクタイプに対応するモデルプール
  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. 各ステップに最も安価で適したモデルを使う
  2. 本当に必要なタスクには高価なモデルを使い分ける
  3. 分類・ルーティングステップは常に最も安価なモデルを使う
  4. トークン単価だけでなく、エージェント1回あたりの実コストを測定する
  5. 単一APIキーのアグリゲーターを使うとマルチモデルアクセスが大幅に簡単になる

1つのAPIで全モデルにアクセス:lemondata.ccは300以上のモデルを単一APIキーで提供。複数のプロバイダーアカウント管理なしでマルチモデルエージェントを構築できます。

Share: