ストーリー
田
田中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-4o | 100% | $1,000 | 最高品質だが高コスト |
| 全件GPT-4o-mini | 85% | $60 | 低コストだが一部品質不足 |
| カスケード | 98% | $250 | 80%は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分