LESSON 30分

ストーリー

田中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呼び出し削減
バランスコスト削減と品質維持のトレードオフを管理

チェックリスト

  • LLM APIのコスト構造を理解した
  • トークン削減のテクニックを3つ以上実践できる
  • タスク別のモデル選択判断ができる
  • キャッシング戦略を設計できる
  • コスト最適化と品質のトレードオフを管理できる

次のステップへ

次は演習として、プロンプトの評価と最適化を実践してみよう。


推定読了時間: 30分