先週、ネストされたJSON構造で再帰制限に引っかかるPythonの再帰ファイルパーサーをデバッグしていたとき、同じトレースバックを45分も見つめていることに気づきました。ターミナルは失敗したprint文の墓場と化していました。スタックオーバーフローの断片をそのまま吐き出すだけでなく、コンテキスト全体を理解できるコーディングアシスタントが必要でした。そこで、Mistral AI(具体的にはmistral-large-2407、出力100万トークンあたり$8)とGoogle Gemini(Gemini 1.5 Pro、出力100万トークンあたり$10.50)を実際のコーディングタスクで10時間テストしました。驚いたのは、同じ問題に対してまったく異なるアプローチを取ったことです。
クイック比較表
| 機能 | Mistral AI (mistral-large-2407) | Google Gemini (1.5 Pro) |
|---|---|---|
| コンテキストウィンドウ | 128Kトークン | 1Mトークン (1,048,576) |
| 最大出力トークン | 4,096 | 8,192 |
| 料金(出力) | 100万トークンあたり$8 | 100万トークンあたり$10.50 |
| 無料枠 | あり(制限:20リクエスト/分) | あり(60リクエスト/分、1Mコンテキスト) |
| コード補完 | 単行+複数行 | 単行のみ |
| 複数ファイルリファクタリング | 対応(APIでプロジェクトコンテキストを渡す) | 対応(Google AI Studio経由) |
| オフラインモード | なし | なし |
| APIレイテンシ(平均) | 2.1秒初回トークン | 3.8秒初回トークン |
| 対応言語 | 30以上(Python, JS, Rust, Go等) | 40以上(同様、Dart, Kotlin追加) |
| デバッグアシスタント | スタックトレース解析機能内蔵 | 手動ペーストが必要 |
テスト方法
制御環境を構築:MacBook Pro M2、16GB RAM、Python 3.12、Node.js 20、Go 1.22を実行。各モデルの公式API(Web UI不使用)を使用し、再現性のためtemperature=0.2に設定。5つのカテゴリをテスト:仕様からのコード生成、壊れた関数のデバッグ、レガシースクリプトのリファクタリング、単体テスト生成、低速アルゴリズムの最適化。各タスクはモデルごとに15分の制限時間。初回成功出力、必要な反復回数、コードがエラーなく実行されたかどうかを記録。SQLインジェクションなどのセキュリティ欠陥もチェック。
ラウンドごとの比較
ラウンド1:自然言語仕様からのコード生成
両モデルに同じプロンプトを入力:「ファイルパスのリストを受け取り、各ファイルをJSONとして読み込み、すべてのJSONオブジェクトを再帰的にキーをマージして1つに結合し、ネストされた競合にはアンダースコアサフィックスを追加するPython関数を書け。マージされた辞書を返せ。」
Mistral AIは45行の関数を返却。適切な再帰、_サフィックスを使用した競合解決、不正なJSONに対するtry-exceptを含む。初回実行で成功。Gemini 1.5 Proは38行の関数を返却。collections.ChainMapを誤って使用し、浅いマージのみ実行。実行するとネストされたオブジェクトが失われた。Geminiに2回修正を依頼したが、2回目のバージョンでも1つのエッジケース(ネストされた辞書内のリスト値)を見逃した。Mistralの勝利。
ラウンド2:壊れた関数のデバッグ
両モデルに、API呼び出しをデバウンスするはずだがクロージャバグがあるJavaScript関数を意図的に渡した。timer変数が呼び出しごとに上書きされる問題。Mistral AIは即座に指摘:「timerがループ内でvarで宣言され、関数スコープの変数になっています。letまたはクロージャを使用してください。」さらにリーディングエッジオプションも提案。Gemini 1.5 Proは「関数は正しく見えます」と答え、バグを指摘した後に修正を提案したが、その修正はsetTimeout内でsetTimeoutを使用しており、メモリリークを引き起こす可能性があった。Mistralの方が速く正確。
ラウンド3:レガシーコードのリファクタリング
各モデルに、グローバル変数とos.system()呼び出しを使用する200行のPythonスクリプトを渡し、「クラスベースの構造にリファクタリングし、依存性注入を使用し、シェル呼び出しをsubprocess.run()に置き換え、型ヒントを追加せよ」と依頼。Mistral AIは設定オブジェクトを受け取る__init__、適切なエラーハンドリング、完全な型ヒントを持つクリーンなクラスを生成。Gemini 1.5 Proは依然として2つのグローバル変数を持つクラスを返し、1つのos.system()呼び出しを見逃し、型ヒントが誤っていた(例:Python 3.12ではList[str]ではなくlist[str])。Geminiの出力を手動で修正する必要があった。Mistralは10分節約してくれた。
ラウンド4:単体テスト生成
プロンプト:「CSVファイルを読み取り、'age'列が30より大きい行をフィルタリングし、結果を新しいファイルに書き込む関数の完全なpytestテストスイートを生成せよ。エッジケース:空ファイル、列欠落、無効な年齢値を含めよ。」
Mistral AIは12のテストケースを記述し、すべてのエッジケースをカバー。tmp_pathフィクスチャを正しく使用し、列欠落時にカスタム例外を発生させるテストを含む。Gemini 1.5 Proは8つのテストケースを記述し、無効な年齢のエッジケースを見逃し、pytestフィクスチャと併用すべきでないNamedTemporaryFileを使用。Geminiは生成コードでpytestのインポートを忘れた。Mistralのテストは初回実行でパス。
ラウンド5:アルゴリズム最適化
両モデルに、10万レコードのリスト内の重複項目を検索する低速なO(n²)アルゴリズムを渡し、「速度を最適化せよ。出力は同じまま」とプロンプト。
Mistral AIはO(n)アルゴリズムに置き換え、setで既出項目を記録、早期終了を追加、データが数値の場合numpyの使用を提案。ベンチマークコメントも含む。Gemini 1.5 Proは最初にソートするO(n log n)の解を生成し、大規模データセットでは低速。さらに最適化を依頼するとcollections.Counterを使用する解を返したが、2回のパスが必要。Mistralの解はベンチマークで3倍高速(10万レコードで0.02秒 vs 0.07秒)。
長所と短所
Mistral AI (mistral-large-2407)
長所:
- 初回トークンレイテンシが速い(2.1秒 vs 3.8秒)——高速イテレーションに重要
- 初回コード生成の精度が高い——修正すべきバグが少ない
- 再帰とネスト構造の理解に優れる
- トークン単価が安い($8 vs $10.50)
- スタックトレース解析機能を内蔵、コピーペーストの手間を削減
短所:
- コンテキストウィンドウが小さい(128K vs 1M)——50万行のコードベース全体を貼り付け不可
- 最大出力トークンが4,096に制限——長い関数は途中で切れる
- 無料枠のレート制限が20リクエスト/分(Geminiは60)
- 対応言語がGeminiより少ない(30 vs 40)
Google Gemini 1.5 Pro
長所:
- 巨大な1Mトークンコンテキスト——プロジェクト全体を投入可能
- 高い出力制限(8,192トークン)——非常に長い関数の生成に適する
- 無料枠が寛大:60リクエスト/分、同じ1Mコンテキスト
- 大規模コードベースや複数ファイルプロジェクトの理解に優れる
短所:
- 応答が遅い——平均3.8秒の初回トークンはもっさり感
- コード生成やデバッグでエッジケースを見逃すことが多い
- 微妙なバグを含むコードを生成しやすい(例:誤ったインポート、浅いロジック)
- トークン単価が高い、特に出力が多いタスクで顕著
- APIが不完全なコードを警告なしに返すことがある
最終評決
コーディングタスクにおいて、Mistral AI (mistral-large-2407) が明確な勝者です。10時間のテストで、初回試行で正しく実行可能なコードを生成したのは5回中4回に対し、Gemini 1.5 Proは5回中2回でした。Mistralの高速レイテンシと低コストは、実際の開発を定義する反復デバッグワークフローに適しています。Geminiの最大の強みである1Mトークンコンテキストはプロジェクト全体の分析に有用ですが、コードを1行ずつ書いたり修正したりする場合、Mistralの方が信頼性が高く安価です。私は日常のコーディングツールをMistralに切り替え、リポジトリ全体を一度に分析する必要がある場合のみGeminiを使用しています。正確性と速度を重視する開発者はMistralを選ぶべきです。数千ファイルにわたる大規模コードレビューを行う場合は、Geminiがわずかに優位かもしれません。
