LESSON 30分

ストーリー

田中VPoE
キャッシュの次はモデル選択の最適化だ。NetShop社では全てのタスクにGPT-4oを使っているが、実は8割のタスクはGPT-4o-miniで十分な品質が出る
あなた
高性能モデルを使えば安心ですが、コストは大きく違いますよね
田中VPoE
GPT-4oとGPT-4o-miniでは価格が約17倍違う。タスクの複雑度に応じてモデルを使い分けるだけで、品質を維持しながら大幅なコスト削減が可能だ
あなた
タスクごとに最適なモデルを選定する基準を知りたいです

モデルルーティングの設計

タスク複雑度に応じたモデル選定

複雑度タスク例推奨モデルコスト
テキスト分類、感情分析、キーワード抽出GPT-4o-mini / Gemini Flash最低
要約、翻訳、定型文生成、FAQ回答GPT-4o-mini / Claude Haiku
複雑な推論、コード生成、文書分析GPT-4o / Claude Sonnet
最高高度な分析、創造的生成、マルチステップ推論GPT-4o / Claude Opus

インテリジェントルーティング

from enum import Enum

class TaskComplexity(Enum):
    LOW = "low"
    MEDIUM = "medium"
    HIGH = "high"
    CRITICAL = "critical"

class ModelRouter:
    """タスク複雑度に基づくモデルルーティング"""

    MODEL_MAP = {
        TaskComplexity.LOW: {
            "model": "gpt-4o-mini",
            "cost_per_1m_input": 0.15,
            "cost_per_1m_output": 0.60,
        },
        TaskComplexity.MEDIUM: {
            "model": "gpt-4o-mini",
            "cost_per_1m_input": 0.15,
            "cost_per_1m_output": 0.60,
        },
        TaskComplexity.HIGH: {
            "model": "gpt-4o",
            "cost_per_1m_input": 2.50,
            "cost_per_1m_output": 10.00,
        },
        TaskComplexity.CRITICAL: {
            "model": "gpt-4o",
            "cost_per_1m_input": 2.50,
            "cost_per_1m_output": 10.00,
        },
    }

    def classify_task(self, task_type: str, input_length: int, requires_reasoning: bool) -> TaskComplexity:
        """タスクの複雑度を判定"""
        if task_type in ["classification", "sentiment", "extraction"]:
            return TaskComplexity.LOW
        elif task_type in ["summary", "translation", "faq"]:
            return TaskComplexity.MEDIUM
        elif requires_reasoning or input_length > 10000:
            return TaskComplexity.HIGH
        else:
            return TaskComplexity.MEDIUM

    def route(self, task_type: str, input_length: int, requires_reasoning: bool = False) -> dict:
        """最適なモデルにルーティング"""
        complexity = self.classify_task(task_type, input_length, requires_reasoning)
        return self.MODEL_MAP[complexity]

カスケードパターン

段階的モデル呼び出し

コストの低いモデルで最初に処理し、品質が不十分な場合のみ高性能モデルにエスカレーションするパターンです。

class CascadeRouter:
    """カスケード型モデルルーティング"""

    def __init__(self, quality_threshold: float = 0.8):
        self.quality_threshold = quality_threshold

    async def process(self, prompt: str) -> dict:
        """カスケード処理"""
        # Stage 1: 低コストモデルで処理
        result = await self._call_model("gpt-4o-mini", prompt)
        quality = await self._evaluate_quality(result)

        if quality >= self.quality_threshold:
            return {
                "response": result,
                "model_used": "gpt-4o-mini",
                "quality_score": quality,
                "cascaded": False
            }

        # Stage 2: 品質不足の場合、高性能モデルにエスカレーション
        result = await self._call_model("gpt-4o", prompt)
        quality = await self._evaluate_quality(result)

        return {
            "response": result,
            "model_used": "gpt-4o",
            "quality_score": quality,
            "cascaded": True
        }

    async def _call_model(self, model: str, prompt: str) -> str:
        """モデルを呼び出す(実装は省略)"""
        pass

    async def _evaluate_quality(self, response: str) -> float:
        """品質を簡易評価(0-1)"""
        # 実装例: 応答長、構造、キーワードの有無でスコアリング
        pass

カスケードの効果

パターン品質コスト説明
全件GPT-4o100%$1,000最高品質だが高コスト
全件GPT-4o-mini85%$60低コストだが一部品質不足
カスケード98%$25080%はminiで処理、20%をエスカレーション

トークン最適化

プロンプト圧縮テクニック

テクニック削減率目安品質への影響
不要な例示の削除20-30%低(Few-shot→Zero-shot)
システムプロンプトの簡潔化10-20%
コンテキストの要約30-50%中(要約品質に依存)
出力フォーマットの制限10-30%低(JSON指定等)
RAGチャンクサイズの最適化20-40%

バッチ処理の活用

処理方式レイテンシコスト適用場面
リアルタイム即時通常価格ユーザー対話、即時性が必要
バッチ(Batch API)24時間以内50%割引レポート生成、一括処理
非同期キュー数分〜数時間通常価格メール回答、バックグラウンド処理

まとめ

最適化手法コスト削減効果品質影響
モデルルーティング50-70%最小限
カスケード60-75%ほぼなし
プロンプト圧縮10-30%低〜中
バッチ処理50%なし(レイテンシ増)

チェックリスト

  • タスク複雑度に応じたモデル選定基準を理解した
  • カスケードパターンの仕組みと効果を把握した
  • プロンプト圧縮テクニックを学んだ
  • バッチ処理の適用場面を理解した

次のステップへ

次はToken最適化とFinOpsの実践を学びます。


推定読了時間: 30分