プロンプトの管理方法は、少人数なら管理表、変更が多くなったらGitでのファイル管理、という2段階で考えると決めやすくなります。 どちらの場合も、ID・版・変更理由・確認者を残すことが共通の土台です。

この記事では、表計算ソフトにそのまま貼れる管理表のテンプレートと記入例、版番号の付け方、Gitで管理するときのディレクトリ構成とプロンプトファイルの形式、変数を埋め込んで読み込むPythonのコードを、実行結果と一緒に載せます。

確認環境:Ubuntu 24.04 / Python 3.11.15 / PyYAML 6.0.3 / Git 2.43.0 / LibreOffice Calc 24.2.7(管理表の貼り付け確認)。確認日 2026-10-06。モデルの呼び出しは行わず、プロンプトの読み込みと変数の埋め込みまでを実行しています。モデル名は「モデルA」「モデルB」と書いているので、使うときは実際のモデルIDに置き換えてください。

この記事の結論

  • 3人くらいまで・変更が月に数回なら、表計算ソフトの管理表で足りる。
  • 変更が週に何度もある、またはプログラムから読み込むなら、1プロンプト1ファイルにしてGitで管理する。
  • 版番号は3つの数字で付け、文言修正と出力が変わる修正を分ける。
  • 変更するときは、理由・確認した入力・確認者を必ず残す。

管理方法の早見表

観点 管理表(表計算ソフト) Gitでのファイル管理 専用ツール
向く人数 1〜3人くらい 開発者を含むチーム 複数のチーム、開発者以外も編集する体制
向く変更頻度 月に数回 週に何度も 日々
履歴の残り方 行を足して残す(手作業) コミットごとに自動で残る ツールの機能による
差分の確認 目で見比べる git diff で文字単位まで見られる ツールの機能による
レビュー 確認者の列に名前を書く プルリクエストで行う ツールの機能による
プログラムからの読み込み 手で貼り付ける ファイルを読み込む ツールのAPIによる
始めるまでの手間 すぐ リポジトリと決まりごとの用意 選定と導入が必要

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「プロンプトの管理方法|バージョン管理と共有の管理表テンプレート」

専用ツールは製品ごとに機能が異なるため、この記事では管理表とGitの2つを詳しく扱います。

どれを選ぶかの判断基準

条件 選ぶもの
使う人が自分だけ、または2〜3人 管理表
プロンプトをチャット画面に貼って使う 管理表
プロンプトをプログラムから読み込む Git
同じプロンプトを同時に2人以上が直す Git
変更前の版にすぐ戻したい Git
変更のたびに別の人の確認を必ず通したい Git(プルリクエスト)
開発者以外が日々編集し、実行記録も一緒に見たい 専用ツールを検討

管理表から始めて、IDと版の付け方をそのままGitへ持っていけるように、最初から同じ項目名で記録しておくのがおすすめです。

管理表テンプレート(タブ区切り)

見出し行だけのタブ区切りテキストです。ファイルに保存して表計算ソフトで開くか、A1セルに貼り付けて使います。

ID  用途  本文  変数  対応モデル   版   変更理由    確認者 更新日 状態
列 書く内容 記入の決まり
ID プロンプトを一意に指す記号 種類の略号+連番(SUM-001)。一度付けたら変えない
用途 何のために使うか 「何から何を作るか」を1行で
本文 プロンプトの全文 差し替える部分は {{変数名}} と書く
変数 本文で差し替える項目 本文の {{ }} と同じ名前をカンマ区切りで
対応モデル 動作を確かめたモデル 確かめたものだけを書く
版 版番号 3つの数字(1.2.0)。付け方は次の章
変更理由 なぜ変えたか 何を変えたか+理由+修正の種類
確認者 出力を確かめた人 書いた本人以外の名前
更新日 その版にした日 YYYY-MM-DD
状態 使ってよいか 利用中/確認中/終了

記入例

ID 用途 変数 対応モデル 版 変更理由 確認者 更新日 状態
SUM-001 会議メモの要約 meeting_title, transcript モデルA、モデルB 1.1.0 宿題に担当と期限を付けるようにした(出力が変わる修正) 鈴木 2026-09-20 利用中
REV-001 SQLレビュー dialect, sql モデルA 1.0.0 新規作成 佐藤 2026-10-06 利用中
MAIL-001 問い合わせへの返信の下書き inquiry モデルB 1.0.1 「200字程度」を「200字以内」に修正(文言修正) 佐藤 2026-10-01 利用中

本文の列も含めた、貼り付け用のタブ区切りです。1行目の本文のように改行を含むセルは、全体を二重引用符で囲みます。

ID  用途  本文  変数  対応モデル   版   変更理由    確認者 更新日 状態
SUM-001 会議メモの要約 "あなたは議事録の作成担当です。次の会議の文字起こしを読み、決定事項と宿題を取り出してください。
# 会議名
{{meeting_title}}
# 文字起こし
{{transcript}}" meeting_title, transcript   モデルA、モデルB   1.1.0   宿題に担当と期限を付けるようにした(出力が変わる修正) 鈴木  2026-09-20  利用中
REV-001 SQLレビュー 次の {{dialect}} のSQLをレビューしてください。指摘は重要度(高・中・低)つきの表で出してください。{{sql}}    dialect, sql    モデルA    1.0.0   新規作成    佐藤  2026-10-06  利用中
MAIL-001    問い合わせへの返信の下書き   次の問い合わせに対する返信の下書きを、です・ます調で200字以内で書いてください。{{inquiry}}    inquiry モデルB    1.0.1   「200字程度」を「200字以内」に修正(文言修正)  佐藤  2026-10-01  利用中

このブロックをファイルに保存して LibreOffice Calc 24.2 で開き、見出しを含めて4行×10列に分かれること、改行入りの本文が1つのセルに収まることを確かめました。

履歴の残し方(管理表の場合)

管理表では、版を上げるときに行を上書きせず、同じIDで新しい行を足します。 以前の行は状態を「終了」に変えます。こうすると、同じIDで並べ替えるだけで変更の流れを追えます。

版番号の付け方:文言修正と出力が変わる修正を分ける

版番号は「1.2.0」のように3つの数字で付けます。ソフトウェアで広く使われているセマンティック バージョニング 2.0.0 は、互換性のない変更でメジャー、後方互換性のある機能追加でマイナー、後方互換性のあるバグ修正でパッチを上げる、と定めています。これをプロンプトに当てはめると次のようになります。

上げる数字 修正の種類 例 使う側への影響
3つ目(1.2.0 → 1.2.1) 文言修正 誤字の修正、言い回しの調整、補足の追加 出力の形も内容のねらいも変わらない
2つ目(1.2.1 → 1.3.0) 出力が変わる修正 条件の追加、例の差し替え、出力の項目を増やす 出力の内容が変わる。呼び出し方は同じ
1つ目(1.3.0 → 2.0.0) 呼び出し方が変わる修正 変数の追加・削除・改名、出力形式の変更 呼び出し側のコードや手順の直しが必要

迷ったときの判断基準は次のとおりです。

確認すること 答え 上げる数字
変数の名前や数、出力の形式が変わるか はい 1つ目
同じ入力に対する出力の内容を変えるつもりか はい 2つ目
どちらでもない — 3つ目

文言修正のつもりでも出力が変わることがあります。3つ目を上げる場合も、決めた入力で出力を見比べてから版を確定します。

Gitで管理する:ディレクトリ構成

1プロンプトを1ファイルにし、用途ごとのフォルダに分けます。

prompt-library/
├── CHANGELOG.md                  変更履歴
├── prompts/
│   ├── summary/
│   │   └── meeting-minutes.md    SUM-001 会議メモの要約
│   └── review/
│       └── sql-review.md         REV-001 SQLレビュー
└── tools/
    ├── render.py                 読み込みと変数の埋め込み
    └── check_all.py              全ファイルの点検
決めること この例での決まり
ファイル名 英小文字とハイフン。版番号や日付は入れない(版はファイルの中とGitで持つ)
フォルダ 用途ごと(summary、review など)。IDの略号と対応させる
1ファイルの中身 先頭にメタ情報、その下に本文
版の印 ID/v版番号 のタグ(SUM-001/v1.2.0)

YAMLのメタ情報つきプロンプトファイル

ファイルの先頭を --- で囲み、管理表と同じ項目をYAMLで書きます。その下が本文です。

---
id: SUM-001
name: 会議メモの要約
purpose: 会議の文字起こしから決定事項と宿題を取り出す
version: "1.2.0"
models: [モデルA, モデルB]
variables:
  - meeting_title
  - transcript
  - max_items
owner: 佐藤
reviewer: 鈴木
updated: "2026-10-06"
---
あなたは議事録の作成担当です。次の会議の文字起こしを読み、決定事項と宿題を取り出してください。

# 会議名
{{meeting_title}}

# 文字起こし
{{transcript}}

# 出力形式
次のJSONだけを出力してください。各配列は最大 {{max_items}} 件です。
{"decisions": ["..."], "todos": [{"who": "...", "what": "...", "due": "..."}]}

# 条件
- 文字起こしに無い内容は書かないでください。
- 担当や期限が読み取れない場合は "不明" と書いてください。

version と updated を引用符で囲んでいるのには理由があります(「確かめて分かったこと」で実行結果を示します)。

変数を埋め込んで読み込むPythonコード

プロンプトファイルを読み、メタ情報を確かめ、{{変数名}} を値に置き換えます。宣言した変数・本文の変数・渡した変数の3つが一致しないときはエラーにするのが要点です。

# tools/render.py
"""プロンプトファイルを読み込み、変数を埋め込んで返す"""
import re
import sys
from pathlib import Path

import yaml

PLACEHOLDER = re.compile(r"\{\{\s*([a-z_][a-z0-9_]*)\s*\}\}")
REQUIRED = ["id", "name", "purpose", "version", "models", "variables", "owner", "reviewer", "updated"]


def load(path: str | Path) -> tuple[dict, str]:
    """先頭のメタ情報(--- で囲んだYAML)と本文に分けて返す"""
    text = Path(path).read_text(encoding="utf-8")
    if not text.startswith("---\n"):
        raise ValueError(f"{path}: 先頭に --- がありません")
    _, front, body = text.split("---\n", 2)
    meta = yaml.safe_load(front)
    missing = [k for k in REQUIRED if k not in meta]
    if missing:
        raise ValueError(f"{path}: メタ情報に不足があります {missing}")
    if not isinstance(meta["version"], str):
        raise ValueError(f"{path}: version は引用符で囲んでください(読み込んだ値: {meta['version']!r})")
    used = set(PLACEHOLDER.findall(body))
    declared = set(meta["variables"])
    if used != declared:
        raise ValueError(
            f"{path}: 変数の宣言と本文が合いません "
            f"本文だけにある={sorted(used - declared)} 宣言だけにある={sorted(declared - used)}"
        )
    return meta, body.strip() + "\n"


def render(path: str | Path, **values: str) -> str:
    meta, body = load(path)
    declared = set(meta["variables"])
    given = set(values)
    if given != declared:
        raise ValueError(
            f"{meta['id']} v{meta['version']}: 渡した変数が合いません "
            f"不足={sorted(declared - given)} 余分={sorted(given - declared)}"
        )
    return PLACEHOLDER.sub(lambda m: str(values[m.group(1)]), body)


if __name__ == "__main__":
    path = sys.argv[1]
    meta, _ = load(path)
    print(f"# {meta['id']} {meta['name']} v{meta['version']} 変数={meta['variables']}")
    print(render(
        path,
        meeting_title="備品予約システム 定例",
        transcript="佐藤:予約の上限は1人3件にします。鈴木:画面の修正は私が金曜までに行います。",
        max_items=5,
    ))
$ python3 tools/render.py prompts/summary/meeting-minutes.md
# SUM-001 会議メモの要約 v1.2.0 変数=['meeting_title', 'transcript', 'max_items']
あなたは議事録の作成担当です。次の会議の文字起こしを読み、決定事項と宿題を取り出してください。

# 会議名
備品予約システム 定例

# 文字起こし
佐藤:予約の上限は1人3件にします。鈴木:画面の修正は私が金曜までに行います。

# 出力形式
次のJSONだけを出力してください。各配列は最大 5 件です。
{"decisions": ["..."], "todos": [{"who": "...", "what": "...", "due": "..."}]}

# 条件
- 文字起こしに無い内容は書かないでください。
- 担当や期限が読み取れない場合は "不明" と書いてください。

変数を1つ渡し忘れた場合は、IDと版つきで知らせます。

>>> render('prompts/summary/meeting-minutes.md', meeting_title='定例', transcript='...')
ValueError: SUM-001 v1.2.0: 渡した変数が合いません 不足=['max_items'] 余分=[]

全ファイルをまとめて点検する

# tools/check_all.py
"""prompts/ 以下のすべてのプロンプトファイルを点検し、一覧を出す"""
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent))
from render import load

ok = True
ids: dict[str, Path] = {}
for path in sorted(Path("prompts").rglob("*.md")):
    try:
        meta, body = load(path)
        if meta["id"] in ids:
            raise ValueError(f"{path}: id {meta['id']} が {ids[meta['id']]} と重複しています")
        ids[meta["id"]] = path
        print(f"OK  {meta['id']}  v{meta['version']}  {len(body)}字  {path}")
    except ValueError as e:
        ok = False
        print(f"NG  {e}")
sys.exit(0 if ok else 1)
$ python3 tools/check_all.py
OK  REV-001  v1.0.0  67字  prompts/review/sql-review.md
OK  SUM-001  v1.2.0  291字  prompts/summary/meeting-minutes.md

本文に {{meeting_date}} を足して、メタ情報の variables に書き忘れた状態で実行すると、次のように知らせて終了コード1で終わります。コミット前や自動チェックで流すと、宣言の書き忘れに気づけます。

$ python3 tools/check_all.py
OK  REV-001  v1.0.0  67字  prompts/review/sql-review.md
NG  prompts/summary/meeting-minutes.md: 変数の宣言と本文が合いません 本文だけにある=['meeting_date'] 宣言だけにある=[]

Gitでの変更手順と差分の見方

文言修正(1.2.0 → 1.2.1)を例にした手順です。

# 1. 本文と version を直す
# 2. 点検する
python3 tools/check_all.py
# 3. 差分を文字単位で確かめる
git diff --word-diff-regex=. -U0
# 4. コミットして、版のタグを付ける
git commit -am "SUM-001 v1.2.1: 「宿題」に補足を追加(文言修正)"
git tag SUM-001/v1.2.1

手順3の出力です。足した文字は {+ +}、消した文字は [- -] で示されます。

@@ -5 +5 @@ purpose: 会議の文字起こしから決定事項と宿題を取り出す
version: "1.2.[-0-]{+1+}"
@@ -15 +15 @@ updated: "2026-10-06"
あなたは議事録の作成担当です。次の会議の文字起こしを読み、決定事項と宿題{+(次にやること)+}を取り出してください。

よく使うコマンドをまとめます。いずれも上のリポジトリで実行して確かめました。

やりたいこと コマンド
あるプロンプトの変更の一覧を見る git log --oneline -- prompts/summary/meeting-minutes.md
2つの版の差分を文字単位で見る git diff --word-diff-regex=. SUM-001/v1.2.0 SUM-001/v1.2.1 -- prompts/
以前の版の全文を表示する git show SUM-001/v1.2.0:prompts/summary/meeting-minutes.md
版のタグを一覧する git tag -l
$ git log --oneline -- prompts/summary/meeting-minutes.md
5bf86c7 SUM-001 v1.2.1: 「宿題」に補足を追加(文言修正)
bc339b1 SUM-001 v1.2.0, REV-001 v1.0.0 を登録

変更履歴の書き方

コミットメッセージは1行で「ID・版・何をしたか・修正の種類」を書き、理由と確認の内容は CHANGELOG.md に残します。

# 変更履歴

## SUM-001 会議メモの要約

### 1.2.0 - 2026-10-06
- 種類: 出力が変わる修正
- 変更: 各配列の上限を変数 max_items で指定できるようにした
- 理由: 長い会議で宿題が20件を超え、画面に収まらなかったため
- 確認: テスト用の文字起こし3本で、件数が上限以内になることを確認(確認者: 鈴木)
項目 書く内容 書き方の例
種類 文言修正/出力が変わる修正/呼び出し方が変わる修正 出力が変わる修正
変更 何をどう変えたか 上限を変数で指定できるようにした
理由 変える前に起きていたこと 宿題が20件を超え、画面に収まらなかった
確認 どの入力で、何を見て、誰が確かめたか 文字起こし3本で件数を確認(鈴木)

「改善」「調整」だけでは後から読んで分からないため、変える前に起きていたことを1つ具体的に書きます。

差分レビューの確認項目

番号 確認項目 見るところ
1 版の上げ方が修正の種類と合っている version の差分と変更履歴の「種類」
2 変数の宣言と本文が一致している check_all.py の結果
3 変数が増減した場合、呼び出し側も直してある 同じプルリクエスト内のコードの差分
4 指示どうしが食い違っていない 追加した条件と、もとからある条件
5 出力形式の指定が1か所にまとまっている 本文の「出力形式」
6 個人情報や社外に出せない情報が本文や例に入っていない 追加された行
7 決めた入力で、変更の前後の出力を見比べてある 変更履歴の「確認」
8 対応モデルの欄が、確かめたモデルだけになっている models の差分
9 変更理由が「何が起きていたか」で書かれている 変更履歴の「理由」
10 使われなくなったプロンプトは状態を変えてある 管理表の状態、またはファイルの移動

確かめて分かったこと

  • YAMLで version: 1.10 と書くと、数値の 1.1 として読み込まれた。 version: 1.2.0 は文字列になりましたが、数字が2つの版は小数として扱われます。版は引用符で囲み、render.py でも文字列でなければエラーにしています。
  • updated: 2026-10-06 は日付型(datetime.date)として読み込まれた。 文字列として扱いたい場合は引用符で囲みます。enabled: no は False になりました。
  • str.format は、JSONの例を含むプロンプトでエラーになる。 本文に {"decisions": ["..."]} があると KeyError: '"decisions"' が出ました。波かっこ2つの {{変数名}} を正規表現で置き換える方式なら、JSONの例をそのまま書けます。
  • string.Template は $ を含む文でつまずく。 「費用は $100 以内」を含む本文で substitute を使うと ValueError: Invalid placeholder in string になりました。
  • git diff --word-diff は、日本語の文では1文まるごとが1語として扱われた。 空白で区切られないためです。--word-diff-regex=. を付けると、足した「(次にやること)」だけが印つきで表示されました。
  • 埋め込んだ値の中の {{ }} は、もう一度は置き換えられない。 変数 sql に SELECT 1; -- {{dialect}} を渡しても、その部分はそのまま出力されました。置き換えを1回で済ませているためで、入力された文で別の変数が展開されることがありません。
  • 3つの数字の版(1.1.0)は、表計算ソフトに貼っても文字列のまま残った。 LibreOffice Calc で確かめました。更新日の列は日付として読み込まれます。

よくある質問

Q. プロンプトの管理方法でまず決めることは? A. IDと版の付け方です。この2つが決まれば、管理表でもGitでも同じ決まりで記録でき、後から移すときも項目をそのまま使えます。

Q. プロンプトのバージョン管理は、管理表とGitのどちらがよいですか? A. 少人数で変更が月に数回なら管理表、プログラムから読み込む場合や変更が多い場合はGitが向いています。同時に2人以上が直す、以前の版にすぐ戻したい、という条件があればGitを選びます。

Q. 文言を少し直しただけでも版を上げますか? A. はい、3つ目の数字を上げます。小さな修正でも出力が変わることがあるため、どの文面で得た出力かを後から特定できるようにしておきます。

Q. チームでプロンプトを共有するときに、変数名がそろわないときは? A. 変数の一覧をメタ情報に書き、本文と一致しなければエラーにする点検を入れます。この記事の check_all.py は、宣言と本文の食い違いを見つけて終了コード1で終わります。

Q. プロンプトの本文に改行がある場合、管理表にはどう入れますか? A. セル全体を二重引用符で囲んだタブ区切りにすると、1つのセルに入ります。本文が長くなってきたら、1プロンプト1ファイルでの管理に移す目安です。

まとめ

  • プロンプトの管理は少人数なら管理表、変更が多くなったらGitで行う。
  • 管理表の項目はID・用途・本文・変数・対応モデル・版・変更理由・確認者。履歴は行を足して残す。
  • 版番号は3つの数字。文言修正は3つ目、出力が変わる修正は2つ目、呼び出し方が変わる修正は1つ目を上げる。
  • Gitでは1プロンプト1ファイルにし、先頭にYAMLのメタ情報を置く。版は引用符で囲む。
  • 読み込みのコードでは、宣言・本文・渡した値の変数が一致しないときにエラーにする。
  • 日本語の差分は git diff --word-diff-regex=. で文字単位に見る。
  • 変更履歴には変える前に起きていたことと、確かめた入力・確認者を書く。

参考・出典

  • セマンティック バージョニング 2.0.0 https://semver.org/lang/ja/

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「プロンプトの管理方法|バージョン管理と共有の管理表テンプレート」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?