先月、うちのチーム(5人のフルスタックチーム)のAIツール統合を任された。毎月のAPIコストが$800を超えていて、「本当にこれだけの価値があるのか」という話になったのがきっかけだ。それでClaude、GPT-4o、Gemini 2.0を2週間ガチで比較することにした。
フェアに言う。3つとも2年前の水準からすれば信じられないくらい良くなっている。でも「どれでもいい」は嘘だ。用途によって向き不向きがはっきりある。
テスト方法と使った環境
比較は雑にやっても意味がないのでルールを決めた。同じプロンプトを3モデルに投げて出力を並べる。タスクは実際の業務から取ってきた——TypeScriptのコードレビュー、Rustのデバッグ、技術仕様書の要約、それから大きめのコードベース(約15,000トークン)を渡しての分析。モデルのバージョンは Claude claude-sonnet-4-6、GPT-4o(2025-11版)、Gemini 2.0 Pro。温度パラメータは全部0.2に揃えた。コードタスクでは再現性が欲しかったから。
コード生成とデバッグ: 「ちゃんと動くコード」が出るのはどれか
正直に言うと、最初はGPT-4oに期待していた。使い慣れているし、周りのエンジニアの評判もいい。でも2週間後の結論は違う。
コードタスクではClaudeが一番信頼できる、というのが今のところの感想だ。
具体的に何が違ったかというと——複雑なTypeScriptのジェネリクス絡みのバグを調べてもらったとき、GPT-4oは「ここが怪しいですね」という推測で終わった。Claudeは問題のある型推論のパスを追跡して、なぜコンパイラがそこで詰まるかを説明した上で修正コードを出した。実際にテストしたコードはこんな感じ:
// 問題のあったコード — コンパイラが循環参照でエラーを出していた
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
function mergeConfig<T extends object>(
base: T,
override: DeepPartial<T>
): T {
return Object.keys(override).reduce((acc, key) => {
const k = key as keyof T;
if (typeof override[k] === "object" && override[k] !== null) {
// ここでDeepPartialの条件型が再帰的に展開されてTypeScriptが詰まる
acc[k] = mergeConfig(acc[k] as any, override[k] as any);
} else {
acc[k] = override[k] as T[keyof T];
}
return acc;
}, { ...base });
}
Claudeの回答は、DeepPartialが条件型の制約で循環参照を起こす可能性を指摘した上で、extends objectをextends Record<string, unknown>に変える修正案を出してきた。GPT-4oも近い答えを出したが、なぜその修正が必要かの説明が浅かった。
Gemini 2.0については——コードの文脈理解がまだ他の2つに追いついていない印象。一般的な解決策を出すのは上手いが、こういう「微妙なTypeScriptの型システムの挙動」みたいな話になると的外れな回答が増えた。今の時点でGemini 2.0 Proをコードタスクの第一選択にする理由が、私には見つからなかった。
実践的なポイント: コードレビューとデバッグにはClaude。シンプルなスニペット生成ならGPT-4oも十分。
長文コンテキスト: 大きなファイルを渡したときの挙動の差
これは一番驚いた結果だった。
うちのプロジェクトには、長年のコードベースに散らばった複雑な状態管理ロジックがある。そのファイル群(合計約18,000トークン)を渡して「バグの原因になりそうな箇所を特定して」と頼んだ。
Claudeはファイルの冒頭で定義されているパターンと、後半で違う書き方になっている箇所を突き合わせて指摘してきた。具体的には、useStoreフックの使い方が3パターン混在していて、それが非同期処理のタイミングバグの原因になる可能性があると。実際にそのバグは存在していた。
GPT-4oも悪くない。でも長文になるとコンテキストの後半が薄くなる傾向がある。これはGPT-4oの既知の問題で(GitHubのissueにも何件も上がってる)、まだ完全には解消されていない印象。
Gemini 2.0はコンテキスト長自体は業界トップクラスで、1Mトークンまで対応している。でも「長く入力できる」と「長い入力を正しく処理できる」は別の話だと気づかされた——ここで私はやらかした。
最初、Geminiのコンテキスト長の大きさに引っ張られて「ドキュメント要約タスクはGeminiで一括処理しよう」と思って実装した。100ページのPDF技術仕様書を渡して要約させたら、表面的には流暢な要約が出てくる。でも後でオリジナルと照合したら、重要な数値や制約条件がいくつか抜けていた。長い入力でも精度が維持されると思い込んでいたのが間違いだった。重要なドキュメントは分割してチャンクごとに処理する方が結果が安定する。これはモデルに関係なく言えることだけど、Geminiへの過信が判断を鈍らせた。
実践的なポイント: コンテキストの後半まで精度が必要な長文処理なら今はClaudeが一番安定している。ただし必ず自分のユースケースで検証すること。
APIコストとレート制限の現実
ここが「理想と現実のギャップ」を一番感じたところ。
現時点の参考価格(入力/出力 per 1Mトークン、2026年2月時点):
| モデル | 入力 | 出力 |
|---|---|---|
| Claude claude-sonnet-4-6 | $3 | $15 |
| GPT-4o | $2.50 | $10 |
| Gemini 2.0 Pro | $1.25 | $5 |
| Gemini 2.0 Flash | $0.10 | $0.40 |
コスト単体で見るとGeminiが安い。うちのチームの月次使用量(約200Mトークン)で計算すると、Gemini 2.0 Flashに全部移行すれば月$400以上節約できる計算になる。でもそうしなかった。
理由は単純で、安いモデルで出力の質が落ちると、エンジニアがそれを検証・修正する時間が増える。その人件費を考えると、APIコストの節約分が消える。ここはチームによって大きく違うので、自分たちのワークフローで実際に測ってほしい。
レート制限の話もしておく。GPT-4oはTier 4まで上げても高トラフィック時に詰まることがあった(特に夕方のアメリカ東部時間帯)。Claudeは今年に入ってから安定性が改善されていて、うちのチームで問題が出たのは1月の一度だけ。Geminiはその点では安定している印象。
複数モデルを使い分けるアーキテクチャ
So、全タスクを一つのモデルに統一しようとするのは間違いだと気づいた。タスクの性質でルーティングする方が、コストと品質のバランスが取りやすい。こういう構成にしておくと、後でモデルを変えるときにルーティングテーブルだけ修正すれば済む(実際うちはこの3ヶ月で2回モデルを変更した):
# model_router.py — タスク種別でモデルを振り分ける
from enum import Enum
from dataclasses import dataclass
class TaskType(Enum):
CODE_REVIEW = "code_review" # Claude優先: 精度が重要
LONG_DOC = "long_doc" # Claude優先: コンテキスト保持
SIMPLE_DRAFT = "simple_draft" # GPT-4o: チームが慣れている
QUICK_SUMMARY = "quick_summary" # Gemini Flash: コスト削減
@dataclass
class ModelConfig:
provider: str
model_id: str
max_tokens: int
temperature: float
ROUTING_TABLE: dict[TaskType, ModelConfig] = {
TaskType.CODE_REVIEW: ModelConfig(
provider="anthropic",
model_id="claude-sonnet-4-6",
max_tokens=8192,
temperature=0.2,
),
TaskType.QUICK_SUMMARY: ModelConfig(
provider="google",
model_id="gemini-2.0-flash",
max_tokens=4096,
temperature=0.3,
),
TaskType.SIMPLE_DRAFT: ModelConfig(
provider="openai",
model_id="gpt-4o",
max_tokens=4096,
temperature=0.5,
),
}
def get_model_config(task: TaskType) -> ModelConfig:
return ROUTING_TABLE[task]
このアプローチで、GPT-4o一本だった頃と比べて月次コストが約15%下がった。チームのコードレビュー時間は週あたり3時間くらい減った感覚がある——体感だけど。
結局どれを使うべきか
この記事を読んでいる人が「どれから始めればいいか」と聞いてくるなら——Claude claude-sonnet-4-6から始めて、コスト最適化の段階でGemini 2.0 Flashを組み合わせるのが今のところ私のおすすめだ。
GPT-4oは悪くない。でも2026年時点では以前ほどの差別化要素がなくなってきた印象で、コードタスクでClaudeに負け、コストでGeminiに負けている。チームへの導入コスト(みんな使い慣れてる)という点では今でも有利だが、それだけの理由で第一選択にするのはもったいないと思う。
Gemini 2.0については、私のユースケースがコードとドキュメント分析に偏っているので過小評価している可能性はある——マルチモーダルや大量データ処理では評価が変わるかもしれない。100%確信を持って言えるのは私のチームの特定のワークフローについてだけだ。
One thing I want to emphasize: 「どのモデルが最強か」という議論はあまり意味がない。半年前に最強だったモデルが今は2番手になっていることもある。大事なのは自分のワークフローに組み込めるか、切り替えやすいアーキテクチャになっているか、だ。モデルのコモディティ化は続いているので、ベンダーロックインを避ける設計が長期的に効いてくる。