マガジン

同じプロンプトを一か月後に実行する:結果は変わるか

遊びをつくる

執筆にClaudeを使用しています。

同じ小さなゲームを異なる方法で描いた三枚のスケッチと鉛筆。
記事のテーマをもとに制作したAI生成イメージ。実際のゲーム画面ではありません。

ゲームのキャラクター設定や回復アイテムの名前を生成AIに考えてもらい、気に入った出力を採用して、プロンプトも保存しておく場面を考えてみます。一か月後に続編のための素材が必要になり、同じプロンプトをそのまま実行します。ここで返ってきた文章が前回と違っていたとき、それはモデルが更新されたからでしょうか。それとも、そもそも毎回違う出力が返るものだからでしょうか。 この問いに答えるには、二つの「違い」を分けて測る必要があります。一つは、同じ日に同じプロンプトを何度か実行しても出力が揺れる、生成そのものの確率的なばらつき(ここでは「ノイズ」と呼びます)です。もう一つは、時間を空けたことで生じる差(ここでは「ドリフト」と呼びます)です。ドリフトの原因にはモデルの更新が考えられますが、サービス側の設定変更など、ほかの要因も混ざります。 この記事は結果を報告するものではなく、読者が自分で実行して答えを出すための実験の設計書です。準備、手順、記録の取り方、結果の読み方、誤りやすい点の順に進みます。

この記事の目次
  1. 準備:ノイズとドリフトを分ける設計
  2. 手順:Day0と一か月後に同じことをする
  3. 記録の取り方と、重なり具合を測る小さなコード
  4. 結果の読み方
  5. 誤りやすい点
  6. 次の行動

準備:ノイズとドリフトを分ける設計

最初に決めるのは、「一か月後の差が、同じ日のばらつきより大きいか」という比べ方です。一か月後に1回だけ実行して前回と比べても、その差がノイズなのかドリフトなのかは区別できません。同じ日に複数回実行して、ばらつきの幅を先に知っておくことが、この実験の土台です。

準備するものは次のとおりです。

  • プロンプト3種:用途の違うものを用意します。たとえば次のような組み合わせです。
  • A(自由度が高い):「森の村を守る少女の主人公について、設定を書いてください」
  • B(制約が明確):「ファンタジーRPGの回復アイテムの名前を10個、各8文字以内で、説明を1行ずつ付けて、番号付きリストで出してください」
  • C(構造の指定):「主人公の名前、年齢、口癖、弱点を、見出しなしの4行で出してください」
  • 使うサービスとモデルを一つに固定:複数を比べたくなりますが、まず一つに絞ります。
  • まっさらな実行環境:新しい会話から始め、カスタム指示や記憶機能、ウェブ検索、ファイル添付など、出力に影響しうる機能は可能なかぎりオフにします。オフにできない場合は、その状態を記録しておきます。
  • 記録の置き場所:表計算ソフトでもテキストファイルでも構いません。出力の全文を保存できることが条件です。

プロンプトはファイルに保存し、一字一句変えずに使います。改行や空白、句読点の違いも別のプロンプトになります。

画像生成で同じ実験をしたい場合も、考え方は同じです。ただし見た目の比較は主観が入りやすいので、後述する盲検の手順を併用してください。

手順:Day0と一か月後に同じことをする

実験は二回の実施日で構成します。

Day0(今日)

  1. 実行前に、サービス名、画面に表示されているモデル名、選べる設定(温度などの項目があればその値)を記録します。
  2. プロンプトA・B・Cをそれぞれ5回ずつ、毎回新しい会話で実行します。合計15回です。
  3. 出力は編集せず全文を保存します。気に入った出力があっても、手を加えずそのまま保存します。
  4. サービスの公式の案内(更新履歴やリリースノートなど)を確認し、今日時点の記載内容を控えておきます。モデル名が固定されるのか、同じ名前のまま中身が更新されることがあるのかは、サービスごとに異なります。この点は現在の公式案内で確認してください。

Day30前後

  1. Day0とできるだけ同じ条件を整えます。同じアカウント、同じ機能のオン・オフ、同じ設定です。
  2. 手順2〜3をまったく同じように繰り返し、再び15回分を保存します。
  3. 表示されているモデル名と、公式案内の更新情報を再び記録します。

ここまでが実験の本体です。間の一か月に、プロンプトを「少し直したくなる」ことがあります。直すと実験が成立しなくなるので、改良案は別のファイルに書いて、この実験とは切り離してください。

記録の取り方と、重なり具合を測る小さなコード

1回の実行ごとに、次の項目を1行にまとめます。

  • 実行ID、記録する内容:例:A-0-1(プロンプトA、Day0、1回目)
  • 日時、記録する内容:実行した日付と時刻
  • モデル表示名・設定、記録する内容:画面に出ている表示のまま
  • 出力全文、記録する内容:編集せずそのまま
  • 文字数、記録する内容:数えた値
  • 制約の遵守、記録する内容:Bなら「10個か」「8文字以内か」を○×で、Cなら「4行か」を○×で
  • 気づいたこと、記録する内容:口調、定型句、固有名詞の傾向など自由記述

数値で比べやすい指標として、文字数と制約の遵守率があります。一方、「文章がどれだけ似ているか」は目で見るだけだと印象に左右されます。そこで、2つの文章の重なり具合を簡易的に測るコードを用意しました。ブラウザの開発者ツールのコンソールに貼り付けると動きます。外部ライブラリは使いません。

js
// 2文字ずつ区切った集合の重なり(0〜1)。1に近いほど似ています。
const grams = (s) => {
  const t = s.replace(/\s+/g, "");
  const set = new Set();
  for (let i = 0; i < t.length - 1; i++) set.add(t.slice(i, i + 2));
  return set;
};
const sim = (a, b) => {
  const A = grams(a), B = grams(b);
  let inter = 0;
  for (const g of A) if (B.has(g)) inter++;
  const union = A.size + B.size - inter;
  return union === 0 ? 1 : inter / union;
};
// 同じ配列の中の全ペア / 2つの配列の総当たり
const within = (xs) => xs.flatMap((x, i) => xs.slice(i + 1).map((y) => sim(x, y)));
const across = (xs, ys) => xs.flatMap((x) => ys.map((y) => sim(x, y)));
const mean = (r) => r.reduce((a, b) => a + b, 0) / r.length;

使い方は、プロンプトごとにDay0の5つの出力を配列day0に、Day30の5つの出力を配列day30に文字列として入れます。そしてwithin(day0)、within(day30)、across(day0, day30)を計算します。5回ずつなら、withinは各10ペア、acrossは25ペアの値が得られます。

このコードは「同じ2文字の並びがどれだけ共有されているか」を見るだけで、意味の近さは判定しません。数値は目安として使い、必ず出力そのものを読んで確かめてください。

結果の読み方

プロンプトごとに、三つの数値の集まりを並べます。

  1. Day0の同日ペア(within(day0))の最小値〜最大値
  2. Day30の同日ペア(within(day30))の最小値〜最大値
  3. 日をまたぐペア(across(day0, day30))の平均と分布

判断の目安は次のとおりです。

  • 日をまたぐペアの値が、Day0の同日ペアの範囲に収まっている:この規模の実験では、一か月の差はノイズと区別できません。「変わらなかった」と断定するのではなく、「この回数・この指標では差が見えなかった」と読みます。
  • 日をまたぐペアの値が、同日ペアの範囲より明らかに低い:ドリフトがある可能性があります。ただし5回では偏りが出やすいので、回数を増やして再確認するのが確実です。
  • Day0とDay30で同日ペアの範囲そのものが違う:出力の多様性が変化した可能性があります。以前は毎回似ていたのに、今回はばらつくといったケースです。
  • 類似度は変わらないが、制約の遵守率や口調が違う:文字の重なりでは見えない変化です。ゲーム素材として使う場合は、むしろこちらの方が実用上は重要です。Bの「8文字以内」を守る割合が変わったかどうかは、ぜひ集計してください。

ここで示した数値の閾値はありません。自分のDay0のばらつきを物差しにして、「その外に出ているか」で判断する設計です。

見た目や文体の違いを人が評価する場合は、盲検にします。Day0とDay30の出力をすべて混ぜて番号を振り、日付が分からない状態で、似ているもの同士に分類します。分類したあとで日付を開き、Day0とDay30がきれいに分かれていれば、人の目にも分かる違いがあることになります。

誤りやすい点

条件のずれを見落とす。 カスタム指示、記憶機能、ウェブ検索の有無が変わっていると、モデル更新とは別の理由で出力が変わります。Day0の条件を必ず記録し、Day30に照合してください。

プロンプトに日付や時事を含める。 「今年の」「最近の」といった語は、実行日によって答えが変わります。この実験では含めません。

会話を引き継ぐ。 同じ会話の中で続けて実行すると、前の出力が文脈として影響します。毎回新しい会話にしてください。

原因をモデル更新と決めつける。 差が出ても、その理由がモデル更新だと特定できるわけではありません。サービス側の周辺機能の変更や、実行時の混雑状況など、外から見えない要因もあります。更新履歴に該当する記載があるかを確認したうえで、「更新の可能性がある」までにとどめてください。

記憶で比較する。 「前はもっと良かった」という感覚は、保存した全文がなければ検証できません。Day0の全文保存が、この実験の最も重要な作業です。

気に入った出力だけ残す。 都合のよい出力だけを残すとばらつきの幅が小さく見え、日をまたぐ差が大きく見えてしまいます。全件を保存してください。

次の行動

まず今日のうちにプロンプトA・B・Cを保存し、Day0の15回分を実行して全文を記録してください。カレンダーに30日後の日付を入れておけば、あとは同じ手順を繰り返すだけです。

結果がどうであれ、ゲーム制作への示唆は一つあります。採用した生成物は、プロンプトではなく出力そのものをファイルとして保存し、素材として固定しておくことです。プロンプトは再現の保証ではなくレシピだと考え、日付とモデル名を添えて制作メモに残してください。アソバースに作品を投稿する場合も、採用した画像や文章をindex.htmlから相対パスで読み込める素材として同梱しておけば、あとから生成結果が変わる心配はありません。