マガジン

「これは最終版です」と伝えると、AIは慎重になるか

遊びをつくる

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

一枚の紙の四つの欄に、画面、操作、目的、終わり方を絵で整理する机。
記事のテーマをもとに制作したAI生成の写真風イメージ。

公開前夜のゲームを、AIに少しだけ直してもらう場面を考えてみます。依頼は「ジャンプが重く感じるので、操作感を良くしてください」の一文です。ここに「これは最終版です」と一行足しただけで、返ってくるコードの変更量は変わるのでしょうか。 直感では、最終版と言われたら慎重になり、最小限しか触らないように思えます。ただ、「最終なら仕上げを丁寧に」と受け取って、かえって手を入れる範囲が広がることもありえます。どちらに振れるのか、それとも変わらないのかは、測らないと分かりません。この記事は結果を示すものではなく、自分の作品と自分のAI環境で答えを出すための設計書です。

この記事の目次
  1. 測るのは「慎重な口ぶり」ではなく「変更の大きさ」
  2. 準備するもの
  3. 手順
  4. 記録の取り方
  5. 結果の読み方と起こりやすい誤り
  6. 次の行動

測るのは「慎重な口ぶり」ではなく「変更の大きさ」

「慎重になるか」は曖昧な問いなので、先に測る対象を分けます。AIの返答には、次の2種類の変化が混ざりうるからです。

  • 変更の大きさ:コードのどれだけの行が、実際に書き換わったか。
  • 慎重さの表現:「念のため確認してください」「元の動作を保つようにしました」といった説明文の量や調子。

後者は増えても、コードの書き換え量は変わらないことがあります。逆に、説明は淡々としているのに、実際には広い範囲を書き換えていることもあります。この実験の主役は前者です。後者は副次的な観察として別枠で記録します。

もう一つ、状況の説明と指示は分けます。「最終版です。余計なところは触らないでください」と書くと、状況ではなく指示を足したことになります。今回確かめたいのは、指示を足さず、状況を一行伝えただけで変更の大きさが動くかどうかです。

準備するもの

  • 動作する小さなゲーム1本(単独のHTMLで、50〜150行程度が扱いやすい量です)。ジャンプ、移動、得点など、「調整の余地」がある要素を含めます。
  • 同じAIサービス、同じモデル、同じ設定。カスタム指示や記憶機能が使えるなら、オフにするか全試行で揃えます。
  • 試行ごとに新しい会話を開く手間。前の会話が残っていると、状況の説明が前の試行の影響を受けます。
  • 変更前後を比べる道具。下のコードは、2つのテキストの「増えた行」と「消えた行」を数える最小のものです。
html
<!doctype html>
<meta charset="utf-8">
<textarea id="before" rows="8" cols="36" placeholder="変更前"></textarea>
<textarea id="after" rows="8" cols="36" placeholder="変更後"></textarea>
<p><button id="go">数える</button></p>
<pre id="out"></pre>
<script>
const lines = s => s.split("\n").map(l => l.trim()).filter(l => l);
function onlyIn(x, y) {
  const pool = new Map();
  for (const l of y) pool.set(l, (pool.get(l) || 0) + 1);
  let n = 0;
  for (const l of x) {
    if (pool.get(l) > 0) pool.set(l, pool.get(l) - 1);
    else n++;
  }
  return n;
}
document.getElementById("go").onclick = () => {
  const a = lines(document.getElementById("before").value);
  const b = lines(document.getElementById("after").value);
  const removed = onlyIn(a, b), added = onlyIn(b, a);
  document.getElementById("out").textContent =
    `消えた行: ${removed}\n増えた行: ${added}\n合計: ${removed + added}`;
};
</script>

この道具は行の順序を見ないため、行を並べ替えただけの変更は数えません。インデントや空行の違いは無視します。厳密な差分が必要なら、エディタのdiff機能やGitの差分表示を使ってかまいません。ただし、全試行で同じ道具を使ってください。

手順

条件は3つです。依頼文は共通にして、先頭に置く一行だけを変えます。

  • A(対照)、先頭の一行:なし
  • B(最終版)、先頭の一行:「これは公開直前の最終版です。」
  • C(試作)、先頭の一行:「これは作り始めの試作です。」

共通の依頼文は次のとおりです。

ジャンプが少し重く感じるので、操作感を良くしてください。変更後のファイル全体を出力してください。

「良くしてください」は、あえて幅のある表現にしています。依頼が「ジャンプ速度を10%上げて」のように具体的だと、変更の大きさが依頼で決まってしまい、状況の影響が見えなくなります。

進め方は次のとおりです。

  1. ゲームのHTMLを同じ内容で用意し、原本として保存します。
  2. 条件ごとに新しい会話を開き、先頭の一行と共通の依頼文、ゲームのコード全文を貼ります。
  3. 返ってきたファイル全体を、試行ごとに別名で保存します。
  4. 各条件を5回ずつ、合計15回行います。回数が少ないと偶然のばらつきと区別できないためです。
  5. 実行順は条件ごとにまとめず、A→B→C→A→B→C…と混ぜます。時間帯やサービスの状態の偏りを避けるためです。

記録の取り方

1試行を1行として、次の項目を記録します。

  • 消えた行・増えた行・合計、記録の単位:上のコードで数えた行数
  • 触れた関数の数、記録の単位:変更が入った関数やブロックの数
  • 依頼外の変更、記録の単位:ジャンプの操作感と無関係な変更の有無と件数
  • 動作確認、記録の単位:原本と同じ操作で遊べるか(○/×)
  • 説明文の量、記録の単位:返答のコード以外の文章の、おおよその行数
  • 確認や警告の有無、記録の単位:「元に戻せるように」など慎重さを示す記述の有無

「依頼外の変更」の判定は、記録者の気分で揺れやすい項目です。可能なら、条件名を隠した状態で他の人に判定してもらいます。難しければ、判定基準を事前に書き出します。たとえば「得点計算、画面の色、変数名の整理は依頼外」と決めておきます。

返答に「最小限の変更にしました」と書かれていても、その言葉は信用せず、実際の行数で確かめてください。言葉と実測がずれていた場合、そのずれ自体が記録に値します。

結果の読み方と起こりやすい誤り

条件ごとに、合計行数の中央値と最小〜最大を並べます。平均より中央値のほうが、1回だけ極端に大きな書き換えが出た場合に左右されません。

読み方の目安は次のとおりです。

  • BがAより明らかに小さく、範囲が重ならない:最終版という状況が、変更を抑える方向に働いた可能性があります。依頼外の変更の件数も減っているか、あわせて見ます。
  • BがAより大きい、または依頼外の変更が増えている:最終版を「仕上げの機会」と受け取った可能性があります。当初の直感とは逆の結果です。
  • A・B・Cの範囲がほぼ重なる:この題材と依頼文では、状況の一行の影響は見えません。「影響がない」とまでは言えず、「この条件では検出できなかった」という結論になります。
  • 行数は同じで、説明や警告だけ増えた:口ぶりは変わっても、実際の変更は変わっていません。

誤りやすい点も挙げておきます。

  • 1回ずつの比較で結論を出すこと。同じ条件でも、返答の大きさは毎回ばらつきます。
  • 返答の途中で、AIが全体を整形し直し、行数が膨らむこと。インデントを揃える書き換えは、行の中身が変わるため差分として数えられます。整形が目立つ試行は、備考に残します。
  • 原本を試行ごとに少しずつ直してしまうこと。比較の土台が動きます。
  • 1つの題材だけで一般化すること。ジャンプの調整で出た傾向が、UIの修正や素材の追加でも出るとは限りません。

次の行動

まず、手元の小さなゲームを1本選び、原本として保存してください。次に、A・B・Cの各条件を新しい会話で1回ずつ試し、上のコードで行数を数えるところまで進めます。差が見えそうなら5回ずつに広げ、見えなければ依頼文の幅や題材を変えて、もう一度設計から見直してみてください。