低コストAI推論のためのClaude Haiku活用:競馬予測システムから見えるパターン

Dev.to / 2026/4/28

💬 オピニオンTools & Practical UsageModels & Research

要点

  • この記事は、「安いから」という理由だけでClaude Haikuを使うのではなく、タスクに深い理解が必要かどうかでモデルを選ぶべきだと主張しています。
  • 具体的な判断ルールとして、11個の数値スコア要因から予測文を作るだけならClaude Haikuで十分だが、11要因のスコアリング設計(構築や改善)にはSonnet以上が必要だと述べています。
  • 競馬予測のワークフローでは、データ品質などのシグナルを使ってHaikuとSonnetを振り分け、データが信頼できるときは高速・低コストの推論を最適化できることを示します。
  • 低コスト推論から最大価値を引き出すための実務的なパターン(バッチ処理や定型処理、追加の推論や設計が必要な場合のみアップグレード)に焦点を当てています。

Claude Haiku for Low-Cost AI Inference: 馬の競馬予測システムから得られるパターン

俳句は速くて安い。しかし「安いからそれを使う」では設計戦略になりません。ここでは、11のスコアリング要因で競馬の予測システムを構築した際の実際のパターンを紹介します。俳句から最大限の価値を引き出す方法と、いつアップグレードすべきかを解説します。

モデル選定の原則

Claude Opus 4.7:   最高品質、最高コスト → アーキテクチャの意思決定、複雑な設計
Claude Sonnet 4.6: バランスが良い                     → コードレビュー、中程度の推論
Claude Haiku 4.5: 速い、安い                   → 定型推論、大量処理

判断ルール:このタスクには 深い理解 が必要ですか?

  • 11個の数値スコアを受け取り、予測文を生成する → 俳句で十分
  • 11因子のスコアリングシステムを設計する → Sonnet以上が必要

競馬AIにおける俳句

const CLAUDE_MODELS = {
  haiku: 'claude-haiku-4-5-20251001',
  sonnet: 'claude-sonnet-4-6',
};

async function predictRace(raceData: RaceInput): Promise<string> {
  // データ品質が高い = 単純な数値分析 → 俳句
  const model = raceData.dataQualityScore >= 7
    ? CLAUDE_MODELS.haiku
    : CLAUDE_MODELS.sonnet;  // 品質が低い = 追加の推論が必要

  const response = await anthropic.messages.create({
    model,
    max_tokens: 800,
    messages: [{
      role: 'user',
      content: buildPredictionPrompt(raceData),
    }],
  });

  return response.content[0].text;
}

俳句のためのプロンプト設計

俳句は短く、構造化され、明示的な入力で最も良い性能を発揮します:

function buildPredictionPrompt(data: RaceInput): string {
  return `
あなたは競馬予測の専門家です。以下のデータを分析し、順位付けされた予測を出力してください。

<<<RACE_DATA>>>
レース: ${data.raceName}
出走頭数: ${data.horseCount}

馬(11因子スコア):
${data.horses.map(h => `
  ${h.name}: 合計 ${h.totalScore}
  - 最終ラップ: ${h.finalLapScore} | 前回順位: ${h.prevRankScore}
  - 騎手: ${h.jockeyScore} | 斤量の変化: ${h.weightScore}
  - オッズ: ${h.oddsScore} | タイム: ${h.timeScore}
  - 人気: ${h.popularityScore} | 差: ${h.marginScore}
  - 休養日数: ${h.freshnessScore} | 年齢による減点: ${h.agePenaltyScore}
  - データ品質: ${h.dataQualityScore}/17
`).join('')}
<<<END>>>

出力:各1文の根拠付きで、上位3頭の予想着順を出してください。150語未満。
`;
}

<<<RACE_DATA>>>...<<<END>>> ブロックは、外部データによるプロンプトインジェクションを防ぎます。明示的な出力形式(「150語未満」)は、俳句(haiku)の出力を一貫させます。

バッチ並列処理

async function predictAllRaces(races: RaceInput[]): Promise<PredictionResult[]> {
  const batchSize = 5;
  const results: PredictionResult[] = [];

  for (let i = 0; i < races.length; i += batchSize) {
    const batch = races.slice(i, i + batchSize);
    const batchResults = await Promise.all(
      batch.map(race => predictRace(race).catch(e => ({ error: String(e) })))
    );
    results.push(...batchResults as PredictionResult[]);

    if (i + batchSize < races.length) {
      await new Promise(r => setTimeout(r, 200));
    }
  }

  return results;
}

俳句(haiku)はソネット/オプス(sonnet/opus)よりレイテンシが低く、レート制限も緩いので、並列バッチがうまく機能します。

コスト計算:Haiku vs Sonnet

予測あたり(約800入力トークン / 約200出力トークン):

Haiku:   $0.25/M in + $1.25/M out
  = $0.00045 per prediction

Sonnet:  $3.00/M in + $15.00/M out
  = $0.00540 per prediction

→ Haikuの方がSonnetの約1/12のコスト

1日50レース:
  Haiku:   $0.0225/day = $0.68/month
  Sonnet:  $0.2700/day = $8.10/month

月あたりの差は$7.40。今は小さく見えても、規模が大きくなると意味のある差になります。

DQSによる動的なモデル選択

function selectModel(dqs: number, factorCount: number): 'haiku' | 'sonnet' {
  if (dqs >= 12 && factorCount >= 10) return 'haiku';
  return 'sonnet';
}

高いDQS = 完全なデータ = 数値分析 = haikuで十分です。

低いDQS = 不足したデータ = 文脈に基づく推論が必要 = sonnetにアップグレード。

まとめ

haikuで価値を得るための5つのルール:

  1. ルーティンで構造化されたタスクだけ。 創造性や深い推論が必要な場面では使わないでください。
  2. プロンプトは短く構造化する。 入力トークンが少ないほど、コストが下がりレスポンスも速くなります。
  3. 出力形式を明示的に指定する。 「150語未満」があると、haikuの出力が一貫します。
  4. 文脈の品質に応じて動的にモデルを切り替える。 すべてをhaikuに固定しないでください。
  5. バッチを並列化する。 レイテンシが低く、レート制限が緩いほど、効率的なバッチ処理になります。

得られる洞察は「haikuが安い」です。そうではなく、「このタスクはhaiku以上は不要」ということです。その判断こそが設計上の意思決定です。