メインコンテンツへスキップ
ブログ一覧

Claude Sonnet 4.6 vs Opus 4.6 実践比較 — コスト40%減でどこまで戦えるか、モデル選択の判断フロー

Claude CodeClaude APIモデル選択コスト最適化AI開発

Claude Sonnet 4.6 vs Opus 4.6 実践比較 — コスト40%減でどこまで戦えるか、モデル選択の判断フロー

SWE-benchスコア差わずか1.2pt(79.6% vs 80.8%)、価格差は40%。「もうSonnetで十分では?」——その判断、タスクによっては正解だが、落とし穴もある。

Claude CodeとAPI両面で実際にSonnet 4.6とOpus 4.6を使い分けた結果から、コストを最適化しつつ品質を落とさないモデル選択の判断フローを提示する。

注意: 2026年4月初旬に「Claude Sonnet 5(SWE-bench 92.4%)」を謳う記事がDEV Community等で拡散されましたが、これはエイプリルフール投稿です。2026年4月時点の最新SonnetはClaude Sonnet 4.6であり、本記事ではこの正式モデルを扱います。


スペック比較:数字だけでは見えない差分

ベンチマーク・価格・コンテキスト長の一覧表

項目 Sonnet 4.6 Opus 4.6
モデルID claude-sonnet-4-6 claude-opus-4-6
SWE-bench Verified 79.6% 80.8%
入力料金(/MTok) $3 $5
出力料金(/MTok) $15 $25
コンテキスト長 1Mトークン 1Mトークン
コスト差 入力+67% / 出力+67%

入力・出力ともにSonnetはOpus比で約40%安い。コンテキスト長は同一の1Mトークンなので、長い文脈を扱えるかどうかはモデル選択の判断材料にならない。

数字に現れない実務上の体感差

SWE-benchの1.2pt差は統計的には僅差だが、実務でのタスク種別によって体感は大きく変わる。単一ファイルの修正ではほぼ差を感じないが、複数ファイルにまたがる設計判断が必要な場面ではOpusの安定感が際立つ。この「どこで差が出るか」が、モデル選択の核心になる。


Sonnet 4.6が十分なケース・Opusが必要なケース

Sonnetで十分:単一ファイル修正・定型コード生成・テスト作成

  • 単一ファイルのバグ修正
  • ユニットテスト・E2Eテストの生成
  • 定型的なCRUD実装、型定義の追加
  • ドキュメントの生成・翻訳

これらのタスクではSonnetとOpusの出力品質にほぼ差がない。コスト40%減の恩恵をそのまま受けられる領域だ。

Opusが勝る:クロスファイルリファクタリング・複雑な設計判断

  • 10ファイル以上にまたがるリファクタリング
  • アーキテクチャ上のトレードオフ判断を含むタスク
  • 長い文脈を保持したまま整合性を維持する必要がある実装
  • あいまいな要件から設計方針を導き出す作業

正直、「Opusじゃないと無理」という場面は多くない。だが、複雑なタスクでSonnetがたまに見落とすエッジケースを、Opusは拾ってくれる——その安心感に40%のコスト差を払うかどうかが判断の分かれ目になる。

判断フローチャート

code
タスクの複雑さは?
├── 単一ファイル / 定型的 → Sonnet 4.6
├── 中程度(2〜5ファイル)→ まずSonnetで試す → 品質不足ならOpusに切り替え
└── 高難度(設計判断 / 大規模リファクタ)→ Opus 4.6

「迷ったらSonnetで試す → 品質不足ならOpusに切り替え」が最もコスト効率の良い戦略だ。


Claude Codeでのモデル切り替え設定

/model コマンドでの切り替え

Claude Code内でモデルを切り替えるには /model コマンドを使う。

code
# 現在のモデルを確認・変更
/model

# Sonnet 4.6に切り替え
/model sonnet

# Opus 4.6に切り替え
/model opus

日常の開発ではSonnetをデフォルトにしておき、複雑なリファクタリングや設計相談の場面だけOpusに切り替える運用がおすすめだ。

よくある誤解:/fast モードについて

Claude Codeの /fast モードは モデルを切り替えるものではない。Opus 4.6のまま出力速度を向上させるモードであり、Sonnetへのダウングレードではない。コスト削減目的で /fast を使っても意味がないので注意してほしい。


APIでのモデル移行:Opus → Sonnet切り替え手順

model パラメータの変更

基本的にはmodelフィールドを変更するだけで動作する。

python
import anthropic

client = anthropic.Anthropic()

# Before: Opus 4.6
- model="claude-opus-4-6",
# After: Sonnet 4.6
+ model="claude-sonnet-4-6",

response = client.messages.create(
    model="claude-sonnet-4-6",  # ここを変更するだけ
    max_tokens=4096,
    messages=[{"role": "user", "content": "..."}]
)

移行時の注意点

  • 長文出力の打ち切り: Sonnetは長い出力で途中打ち切りが起きやすい傾向がある。max_tokens を明示的に十分な値に設定しておくこと
  • budget_tokens: Extended Thinkingを使用している場合、budget_tokens の設定を見直す
  • 段階的移行: いきなり全トラフィックを切り替えるのではなく、一部をSonnetに振り向けてA/Bテストするのが安全
python
import random

def select_model(task_complexity: str) -> str:
    if task_complexity == "high":
        return "claude-opus-4-6"
    # 中程度のタスクは50%ずつA/Bテスト
    if task_complexity == "medium":
        return random.choice(["claude-sonnet-4-6", "claude-opus-4-6"])
    return "claude-sonnet-4-6"

コスト最適化:混合戦略で月額を最小化する

タスク分類 × モデル選択マトリクス

タスク難易度 割合(目安) 推奨モデル 入力+出力コスト
定型(テスト生成等) 40% Haiku 4.5 $0.25 + $1.25
中程度(一般実装) 40% Sonnet 4.6 $3 + $15
高難度(設計判断) 20% Opus 4.6 $5 + $25

Routerパターンの実装例

タスク難易度に応じてモデルを自動選択するRouterをTypeScriptで実装する例を示す。

typescript
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

type Complexity = "low" | "medium" | "high";

const MODEL_MAP: Record<Complexity, string> = {
  low: "claude-haiku-4-5-20251001",
  medium: "claude-sonnet-4-6",
  high: "claude-opus-4-6",
};

async function classifyComplexity(task: string): Promise<Complexity> {
  const res = await client.messages.create({
    model: "claude-haiku-4-5-20251001", // 分類自体は最安モデルで
    max_tokens: 16,
    messages: [
      {
        role: "user",
        content: `Classify this task's complexity as low/medium/high. Reply with one word only.\nTask: ${task}`,
      },
    ],
  });
  const label = (res.content[0] as { text: string }).text.trim().toLowerCase();
  if (label === "low" || label === "medium" || label === "high") return label;
  return "medium"; // フォールバック
}

async function routedRequest(task: string) {
  const complexity = await classifyComplexity(task);
  const model = MODEL_MAP[complexity];
  console.log(`Task complexity: ${complexity} → using ${model}`);

  return client.messages.create({
    model,
    max_tokens: 4096,
    messages: [{ role: "user", content: task }],
  });
}

月間コスト試算

月100万トークン処理(入出力同量)と仮定した場合の概算:

戦略 月間コスト
全Opus 約$30
全Sonnet 約$18
3層混合(Haiku 40% / Sonnet 40% / Opus 20%) 約$12〜14

3層混合戦略なら全Opus比で 50%以上のコスト削減 が見込める。さらに、リアルタイム性が不要な処理にはBatch API(50%割引)を併用すれば、追加で大幅な削減が可能だ。


まとめ

SWE-bench差1.2ptという数字が示す通り、多くの日常タスクでSonnet 4.6はOpus 4.6と遜色ない。だが「多くの場合」と「すべての場合」は違う。

本記事の判断フローに沿ってタスクを分類し、Sonnetをデフォルト・Opusを切り札 として使い分ければ、品質を維持しながらAPIコストを30〜50%削減できる。

まずは自分の典型タスク10件をSonnetで試し、体感品質を確かめるところから始めてみてほしい。

もっと読む他の技術記事も読む