GEMINI LABEN
MODEL — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestの実体になりましたAPI — Interactions APIが一般提供となり、Geminiモデルとエージェントを扱う主要APIになりましたAGENT — Managed Agentsが公開プレビューで提供され、隔離Linux環境で自律エージェントを動かせますAPI — バックグラウンド実行が加わり、長時間処理を投げて結果を後から受け取れますSEARCH — File Searchがgemini-embedding-2で画像もそのまま検索できるようになりましたNOTICE — 6/19以降、未制限APIキーからのリクエストが遮断されるようになりましたMODEL — Gemini 3.5 Flashが一般提供となり、gemini-flash-latestの実体になりましたAPI — Interactions APIが一般提供となり、Geminiモデルとエージェントを扱う主要APIになりましたAGENT — Managed Agentsが公開プレビューで提供され、隔離Linux環境で自律エージェントを動かせますAPI — バックグラウンド実行が加わり、長時間処理を投げて結果を後から受け取れますSEARCH — File Searchがgemini-embedding-2で画像もそのまま検索できるようになりましたNOTICE — 6/19以降、未制限APIキーからのリクエストが遮断されるようになりました
記事一覧/開発ツール
開発ツール/2026-06-30上級

どのプロンプト改訂で品質が動いたかを後から辿る — Gemini 生成パイプラインにプロンプト版管理を入れる

プロンプトをその場で書き換えると、品質が動いたときに原因がモデル側なのかプロンプト側なのか辿れなくなります。プロンプトを内容ハッシュで固定し、生成のたびにモデルIDと一緒に刻んで、品質が落ちた区間を改訂境界へ二分探索で寄せる小さな仕組みを、コピペで動く Python で残します。

gemini93gemini-devprompt-managementproduction99pipeline7

プレミアム記事

毎日 Gemini で記事の下書きを生成している自分のパイプラインで、ある朝だけ日本語版の語尾が妙に硬くなりました。前日にプロンプトの一文をその場で書き換えていたのですが、では硬くなったのはその編集のせいなのか、それとも gemini-flash-latest の実体が静かに上がったせいなのか、ログを見返しても切り分けられませんでした。プロンプトを直接上書きしていたので、何をどう変えたのかが履歴のどこにも残っていなかったのです。

個人開発で生成パイプラインを長く回していると、この「原因が辿れない」感覚は地味に効いてきます。モデルは勝手に動き、プロンプトも自分の手で動く。両方が同時に動く前提で、せめてプロンプト側だけは「いつ・何が変わったか」を確実に残しておきたい。そのための、できるだけ小さい仕組みを紹介します。

なぜ「その場で書き換える」と原因が消えるのか

プロンプトをコードの中の f-string に直書きして編集する運用には、二つの穴があります。

ひとつは履歴の不在です。git diff を見れば文面の変化はわかりますが、ある日の生成物が「どの文面で」作られたかは、生成ログ側に何も残っていません。出力と文面が紐づいていないので、後から突き合わせられません。

もうひとつは交絡です。モデルの既定(-latest 系)は予告なく実体が変わります。プロンプトも自分で変えます。片方を固定しないまま品質が動くと、どちらが効いたのかは原理的に分離できません。原因の切り分けは、まず「片方を動かないように固定する」ことから始まります。

私自身はここを軽く見ていて、しばらく勘で対処していました。けれど勘で戻したプロンプトがまた別の劣化を生む、という遠回りを何度かして、ようやく「文面を版として固定する」という当たり前に行き着きました。

プロンプトを内容ハッシュで固定する小さなレジストリ

大げさなプロンプト管理基盤は要りません。プロンプトを1ファイル1版として置き、内容のハッシュを版IDにするだけで足ります。

# prompt_registry.py
import hashlib
import json
from pathlib import Path
 
PROMPT_DIR = Path("prompts")
 
def _content_hash(text: str) -> str:
    # 改行コードの揺れを正規化してからハッシュする(CRLF/LF差で版が割れないように)
    normalized = text.replace("\r\n", "\n").strip()
    return hashlib.sha256(normalized.encode("utf-8")).hexdigest()[:12]
 
def load_prompt(prompt_id: str) -> dict:
    """prompts/<prompt_id>.txt を読み、内容ハッシュ付きで返す。"""
    path = PROMPT_DIR / f"{prompt_id}.txt"
    if not path.exists():
        raise FileNotFoundError(f"prompt not found: {prompt_id}")
    text = path.read_text(encoding="utf-8")
    return {
        "id": prompt_id,
        "revision": _content_hash(text),
        "text": text,
    }

ポイントは、版IDを連番ではなく内容ハッシュにしていることです。連番だと「番号を上げ忘れて中身だけ変わる」事故が起きますが、内容ハッシュなら文面が1文字でも変われば版が必ず変わります。逆に、戻して全く同じ文面になれば版も元に戻るので、「実質同じ文面なのに別版扱い」になりません。

文面はコードから切り離してテキストに置く

prompts/article_ja_draft.txt のように、プロンプトをコードの外のテキストファイルに置きます。こうしておくと git log -- prompts/article_ja_draft.txt でその文面だけの改訂履歴が読めますし、後述のロールバックも「ファイルを前の版に戻す」だけで済みます。

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

この記事の続きを読む

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

この記事で得られること
プロンプトをファイルとして内容ハッシュで固定し、生成ログにモデルIDと改訂ハッシュを同時に刻むことで、品質変動の原因をモデル側か文面側かに切り分けられるようになります
品質スコアの時系列から「いつ落ちたか」を二分探索で改訂境界に寄せる bisect ヘルパーを、コピペで動く Python として手に入れられます
壊れた改訂を即座にピン留めして前の版へ戻す、軽量なロールバック運用の組み立て方がわかります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-06-17
Gemini API のチャット履歴を Redis で運用する — 本番で会話状態を失わない実装メモ
Gemini のチャット履歴をプロセスメモリに置いたまま本番に出すと、再デプロイやスケールのたびに会話が消えます。Redis を受け皿にしつつ、トークン予算・同時送信・SDK 依存・障害時の縮退まで、実運用で踏んだ箇所を実装とともにまとめました。
開発ツール2026-06-17
廃止予定の Gemini モデルを CI で検知する ― 連続するデッドラインを取りこぼさない仕組み
廃止・停止が重なる時期に、リポジトリ内の古い Gemini モデル指定を CI で機械的に検知する仕組みの作り方を、廃止レジストリ・走査スクリプト・残り日数による段階警告まで実装ベースでまとめます。
開発ツール2026-06-15
Firestore × Gemini Embeddings の RAG が静かに劣化する — 埋め込み世代交代に耐える再埋め込み設計
Firestore のネイティブベクトル検索と Gemini Embeddings で組んだ RAG は、埋め込みモデルの世代交代でベクトル空間がずれ、検索品質が静かに落ちます。ドリフトの検知、無停止の再埋め込み移行、取得コストの抑え方を実装で詰めます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →