◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-04-21上級

Gemini のプロンプトを壊さない — Pytest で組むプロンプト回帰テストの実践パターン

プロンプトを1行直しただけで本番出力が別物になった経験はありませんか。 Gemini API のプロンプトを Pytest でテストし、スナップショットと LLM-as-Judge を組み合わせて回帰を自動検出する実装パターンを、個人開発者の実運用目線で解説します。

gemini-api288prompt-engineering14pytest3regression-testingllm-as-judge5cipython107

✦ プレミアム記事

プロンプトは、ちょっとした一行修正から壊れる

個人開発で Gemini API を使い始めて一番怖いのは、モデルが落ちることでも、API キーの漏洩でもなく、「昨日までちゃんと動いていた処理が、今日の修正で静かに品質だけ下がる」瞬間だと私は思っています。

つい先日も、自分のアプリのレビュー要約プロンプトに「箇条書きで 5 点」と一行足しただけで、それまで自然に出ていた締めの一文が消え、事実と違う要約が混じるようになりました。テストらしいテストを書いていなかったので、気づいたのはリリース翌日、ユーザーから「最近の要約、なんか雑になった?」と問い合わせが来てからです。小さな修正だったので、Git の履歴を遡る時間より、そもそも「どのあたりが変わったのか」を特定する方に時間がかかりました。

この記事は、そういう事故を次からちゃんと止めたい人のためのガイドです。Pytest を使って Gemini API のプロンプトを回帰テストし、スナップショットと LLM-as-Judge の二段構えで「静かな劣化」を検知する仕組みを、実装コードとあわせて紹介していきます。対象は、Python で Gemini API を触り始めて数週間〜数ヶ月、CI で品質を守る段階に入りたい個人開発者の方を想定しています。チーム開発の方でも、最小構成の出発点として読んでいただけると思います。

この二段構えが大事な理由は、プロンプトが壊れるパターンに 2 種類あるからです。一つは「そもそも出力の形が変わった」タイプ。JSON を返すはずが自然文を返し始める、必須キーが抜ける、といった即死級の障害です。もう一つは「形は合っているけど内容が知らぬ間に下がった」タイプ。要約がユーザーの不満点を拾わなくなる、トーンが攻撃的になる、事実と違う情報を混ぜ始める、といった忍び寄る劣化です。前者は単純な型チェックで十分ですが、後者は人間の目や別の LLM の目で読まないと気づけません。

個人開発で一人で運用していると、特に後者に気づくのが遅れます。ユーザーからの問い合わせ経由で判明した時にはリリース後数日が経っていて、原因特定にさらに数日かかる、というサイクルに何度か嵌まりました。そこを短縮したい、というのがこの記事の一番の動機です。

プロンプト評価の総論として幅広くカバーしている Gemini API プロンプト評価・最適化パイプライン構築ガイド も併せて読んでいただけると、今日の話がその中のどの位置にあるか分かりやすくなるはずです。今日は「書いた後の変更を壊さないための継続的な仕組み」に絞って、深さを重視して進めていきます。

プロンプト回帰テストは、ユニットテストの拡張ではなく別物

「プロンプトもコードなんだから、ユニットテストと同じ発想で書けばいい」と最初は思いがちです。私もそう思っていました。ただ、実際にやってみると、従来のテストとは性質が違うと痛感します。

まず、出力が決定的ではありません。Temperature を 0 にしても、モデル側のバージョン更新や内部の丸め誤差で、厳密な一致はほぼ得られません。文字列 assertEqual は早々に破綻します。

次に、「正しい出力」は一意ではありません。要約記事の冒頭を「本稿は〜」で始めるか「今回は〜」で始めるかは、どちらも合格です。人間が書いても表記揺れは起きるので、そこをテストで締め付けるとほとんどの実行が赤になります。

そして、テストが落ちた時の原因がモデル側にもプロンプト側にもユーザー入力側にもあり得ます。Pytest の失敗メッセージだけ見ても、自分が直すべき箇所が分かりません。スタックトレースの代わりに、LLM の出力そのものを読み込むスキルが地味に要求されます。

ここから出てくる結論は、プロンプト回帰テストには「構造レベルの契約」と「意味レベルの合格基準」を分けて持つ必要がある、ということです。前者はスナップショットや JSON スキーマで縛り、後者は LLM-as-Judge で柔らかく見ます。この二段構えが、私が数ヶ月運用してきた中で一番落ち着いた形になりました。

言い換えると、ユニットテスト的な「関数の入出力を固定する」発想から、契約テスト(Consumer-Driven Contract)的な「期待する形と許容範囲を合意する」発想に頭を切り替える必要があります。ここがまず、最初の山かもしれません。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦プロンプト修正で本番出力が壊れた経験がある人が、Pytest で安心して改善を繰り返せる土台を手に入れられる
✦スナップショットテストと LLM-as-Judge を組み合わせた、動く Python コード一式をコピペから育てていける
✦CI で回帰を検知するパイプラインと、テスト失敗時のノイズとの付き合い方まで、個人運用に必要な判断軸が身につく
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ API / SDK2026-10-16
models は 200 なのに generateContent だけ 403 になる日 — 切り分けの順番を先に決めておく
モデル一覧の取得は 200 で通るのに、生成リクエストだけが 403 permission_denied で止まるときの切り分け手順です。キー・プロジェクト・請求の順に確かめる小さな診断スクリプトと、リトライしてはいけない理由、サポートへ渡す材料の揃え方をまとめました。
◈ API / SDK2026-09-04
ループ音源のプチノイズは、Gemini に聴かせる前に波形の端で切り分けられます
環境音のループ再生で折り返しだけがプチッと鳴る。音声理解に丸ごと投げる前に、波形の端の段差を内部の変化量で正規化してふるい分ける手順と、配布形式への変換で継ぎ目が作り直される落とし穴をまとめました。
◈ API / SDK2026-08-20
ANR のスレッドダンプをそのまま Gemini に投げない
ANR ダンプは 96 スレッドで 33,616 文字ありました。main だけを抜けば 98% 減りますが、原因のスレッドは消えます。待ちの連鎖だけを残す前処理を実測しながら組み立てます。