ストーリー
田
田中VPoE
「プロンプトの品質を高めることは重要だ。でもビジネスではコストも無視できない。」
あなた
「NetShop社のチャットボットは月間10万件の問い合わせを処理する想定でしたよね。コストが積み上がりそうです。」
あ
田
田中VPoE
「そうだ。品質を維持しながらコストを下げる。これがプロンプトエンジニアの腕の見せどころだ。」
田
田中VPoE
「トークン削減、モデル選択、キャッシング。この3つの戦略を学ぼう。」
コスト構造の理解
LLM APIの料金体系
月間コスト = リクエスト数 × (入力トークン単価 × 平均入力トークン数
+ 出力トークン単価 × 平均出力トークン数)
モデル別コスト比較(参考価格)
| モデル | 入力(/1Mトークン) | 出力(/1Mトークン) | 性能 |
|---|
| GPT-4o | $2.50 | $10.00 | 高 |
| GPT-4o mini | $0.15 | $0.60 | 中 |
| Claude 3.5 Sonnet | $3.00 | $15.00 | 高 |
| Claude 3.5 Haiku | $0.80 | $4.00 | 中 |
コスト試算例
NetShop社チャットボット:
- 月間リクエスト: 100,000件
- 平均入力トークン: 1,000(システムプロンプト + 会話履歴 + 質問)
- 平均出力トークン: 300
GPT-4oの場合:
入力: 100,000 × 1,000 / 1,000,000 × $2.50 = $250
出力: 100,000 × 300 / 1,000,000 × $10.00 = $300
月額合計: $550
GPT-4o miniの場合:
入力: 100,000 × 1,000 / 1,000,000 × $0.15 = $15
出力: 100,000 × 300 / 1,000,000 × $0.60 = $18
月額合計: $33
戦略1: トークン削減
システムプロンプトの圧縮
# Before(320トークン相当)
あなたはNetShop社のカスタマーサポートスタッフです。
お客様に対して常に丁寧な言葉遣いで対応してください。
質問に対しては正確な情報を提供することを心がけてください。
分からないことがあれば、正直に分からないと伝えてください。
商品の価格については、必ずデータベースの情報を確認してから回答してください。
在庫状況については推測で回答せず、システムで確認してください。
# After(150トークン相当)
Role: NetShop社サポートAI
Tone: 丁寧語
Rules:
- 参照データ[REF]のみ使用
- 不明→「確認します」
- 価格/在庫は推測禁止
不要な情報の削除
削減チェックリスト:
□ 重複する指示はないか
□ 自明な指示(「正確に回答」等)はないか
□ 使用頻度の低いルールを別管理にできないか
□ Few-shot例を必要最小限にしているか
□ 会話履歴の要約は適切か
出力トークンの制限
出力制約:
- 回答は3文以内(最大150文字)
- 表形式の出力は最大10行
- コード例は20行以内
- 説明文を省き、結論のみ出力
戦略2: モデル選択
タスク別モデル選択ガイド
| タスク | 推奨モデル | 理由 |
|---|
| 単純な分類(感情分析等) | 軽量モデル | 高度な推論が不要 |
| FAQ回答 | 軽量モデル | パターンマッチで十分 |
| コードレビュー | 高性能モデル | 複雑な推論が必要 |
| 技術文書生成 | 高性能モデル | 正確性と一貫性が重要 |
| データ抽出・変換 | 軽量モデル | 構造的な処理 |
ルーティング戦略
リクエストの複雑さに応じてモデルを自動選択:
function selectModel(request: Request): Model {
// Step 1: 簡易分類器で複雑さを判定
const complexity = classifyComplexity(request);
// Step 2: 複雑さに応じてモデルを選択
switch (complexity) {
case "simple": // FAQ、簡単な質問
return "gpt-4o-mini";
case "medium": // 商品比較、手続き案内
return "gpt-4o-mini";
case "complex": // クレーム対応、技術的な質問
return "gpt-4o";
}
}
戦略3: キャッシング
レスポンスキャッシュ
同じ質問に対する回答をキャッシュし、API呼び出しを削減する。
interface PromptCache {
get(key: string): CachedResponse | null;
set(key: string, response: CachedResponse, ttl: number): void;
}
async function handleRequest(prompt: string): Promise<string> {
// キャッシュキーの生成(プロンプトのハッシュ)
const cacheKey = generateHash(prompt);
// キャッシュチェック
const cached = cache.get(cacheKey);
if (cached && !isExpired(cached)) {
return cached.response; // キャッシュヒット → API呼び出し不要
}
// キャッシュミス → API呼び出し
const response = await callLLM(prompt);
cache.set(cacheKey, { response, timestamp: Date.now() }, TTL_1H);
return response;
}
キャッシュ戦略
| 戦略 | 適用場面 | TTL |
|---|
| 完全一致キャッシュ | FAQ回答、定型質問 | 24時間 |
| セマンティックキャッシュ | 類似質問の検出 | 1時間 |
| プロンプトキャッシュ(API機能) | システムプロンプトの再利用 | セッション中 |
プロンプトキャッシュ(API提供)
一部のLLM APIは、システムプロンプト部分のキャッシュ機能を提供している。
通常: システムプロンプト(1,000トークン)+ ユーザー入力 → 毎回全トークン課金
キャッシュ: システムプロンプト(キャッシュ済み)+ ユーザー入力 → 入力分のみ課金
削減効果: システムプロンプト分のトークンコストが大幅削減
コスト最適化の実践例
NetShop社での最適化結果
最適化前:
モデル: GPT-4o(全リクエスト)
月間コスト: $550
平均入力トークン: 1,000
平均出力トークン: 300
最適化後:
Step 1: プロンプト圧縮(入力トークン 1,000→600)
Step 2: 出力制限(出力トークン 300→150)
Step 3: モデルルーティング(70%を軽量モデルに)
Step 4: FAQキャッシュ(20%のリクエストがキャッシュヒット)
月間コスト: $85(85%削減)
品質: 正確性 91% → 89%(許容範囲内)
コスト最適化の注意点
| 注意点 | 対策 |
|---|
| 品質の低下 | 最適化前後で品質指標を比較 |
| キャッシュの陳腐化 | 適切なTTL設定と無効化の仕組み |
| 軽量モデルの限界 | 複雑なタスクでは品質が大幅低下 |
| 過度な圧縮 | 重要な指示まで削除しないよう注意 |
まとめ
| 項目 | ポイント |
|---|
| トークン削減 | プロンプト圧縮と出力制限 |
| モデル選択 | タスク複雑度に応じたモデルルーティング |
| キャッシング | FAQ/定型回答のキャッシュでAPI呼び出し削減 |
| バランス | コスト削減と品質維持のトレードオフを管理 |
チェックリスト
次のステップへ
次は演習として、プロンプトの評価と最適化を実践してみよう。
推定読了時間: 30分