AIに「分からないことを質問して」と頼むと、良い質問をするか
遊びをつくる執筆にClaudeを使用しています。

ゲームの一行仕様をAIに渡し、「作る前に、分からないことを質問してください」と添える場面を考えてみます。返ってきた質問が10個あったとき、その10個は本当に作る前に聞くべきことだったのでしょうか。仕様に書いてあることを聞き返していないか、答えが何でも実装が変わらない質問が混ざっていないか、そして肝心の抜けを見落としていないか。読み流すと「丁寧に聞いてくれた」で終わってしまいます。 この記事は、その質問の質を測る実験の設計書です。結果は載せていません。載せているのは、読者が自分の手元で答えを出すための問いの立て方、準備、手順、記録の取り方、結果の読み方です。質問の質を測る物差しができれば、仕様の抜けを先に見つける道具としてAIを使えるかどうかを、自分のお題で判断できます。
「良い質問」を先に決める
実験を始める前に、「良い質問」の定義を固定します。結果を見てから基準を決めると、どんな質問でも良く見えてしまうためです。ここでは次の4つを物差しにします。
- 分岐するか:答えによって、作るものが実際に変わる質問です。「色は綺麗にしますか」のように、どう答えても同じ実装になる質問は分岐しません。
- 未記載か:仕様文にすでに書いてあることを聞いていない質問です。
- 答えやすいか:選択肢や推奨の既定値がついていて、一言で返せる質問です。
- 重要な抜けに届くか:作り直しになりやすい根本的な抜けを、早い順番で聞けているかどうかです。
4つ目が、この実験でいちばん見たい点です。細かい質問を10個並べても、「何をもって終わりとするか」を聞いていなければ、仕様の穴は埋まっていません。
準備するもの
仕様文と「穴リスト」
AIに渡す仕様文を1本用意します。そのうえで、その仕様のどこが決まっていないかを、AIに見せる前に自分で書き出しておきます。これが穴リストです。
仕様文の例として、次の文を使ってみます。
同じ色を3つそろえると消える、1回3分ほどの落ちものパズルを作ってください。単独のHTMLで動かします。
この文に対する穴リストを、重要度つきで書き出してみます。重要度は、決まっていないと作り直しになる度合いで3段階に分けます。
- 1、穴:そろえる方向(縦横のみか、斜めも含むか)、重要度:3
- 2、穴:3分の意味(時間切れで終わるのか、ゲームオーバーと併用か)、重要度:3
- 3、穴:操作デバイス(キーボード、タッチ、両方)、重要度:3
- 4、穴:連鎖の有無、重要度:2
- 5、穴:スコアや記録を残すか、重要度:2
- 6、穴:盤面の大きさ、重要度:2
- 7、穴:色の見分け(色以外の手がかりが必要か)、重要度:2
- 8、穴:音の有無、重要度:1
- 9、穴:一時停止、重要度:1
「単独のHTMLで動かす」はすでに書かれているので穴ではありません。これを聞き返したら「未記載ではない質問」として減点対象にします。自分のお題で行う場合も、穴は9〜10個ほど、重要度3を3つ前後にすると集計しやすくなります。
指示文の条件
質問の出方を比べるために、指示文を3条件用意します。
- 条件A:「作る前に、分からないことを質問してください。コードはまだ書かないでください。」
- 条件B:「作る前に、質問は最大5つまで。答えによって実装が変わるものだけを、推奨の既定値つきで聞いてください。コードはまだ書かないでください。」
- 条件C(比較用):質問の指示を付けず、「作ってください」とだけ頼みます。質問が出ない場合は、AIが置いた仮定を記録します。
条件Cは「質問させる意味があるのか」を判断する基準になります。
回答表と実施回数
AIの質問に自分で答えるとき、その場の気分で答えが変わると評価がぶれます。穴ごとの答えを事前に決めた回答表を作ります。たとえば「方向は縦横のみ」「3分で時間切れ」「キーボードとタッチ両対応」のように、全部の穴に答えを用意します。回答表にない質問には「任せます」とだけ返すと決めておきます。
実施は各条件3回、毎回新しい会話で行います。同じ会話で続けると、前の質問の影響を受けるためです。使ったモデルの名前と実施日も記録します。
手順
- 仕様文、穴リスト、回答表を書き、保存します。この3点は実験中に直しません。
- 新しい会話で、条件Aの指示文と仕様文を渡します。
- 返ってきた質問をそのままコピーし、質問ごとに番号を振ります。
- 質問を穴リストと突き合わせます。質問ごとに、対応する穴の番号(なければ「なし」)、重複または既記載かどうか、分岐するか、選択肢つきかを記入します。
- 回答表に従って機械的に答えます。回答表にない質問には「任せます」と返します。
- 実装させ、穴の箇所が回答どおりになっているかを動かして確かめます。たとえば方向を縦横のみと答えたのに斜めでも消えるなら、質問の質ではなく回答の反映に問題があります。
- 条件B、条件Cも同じ手順で行い、各条件を3回ずつ繰り返します。
条件Cでは、手順2で質問を求めず、AIが出した前提や仮定の宣言があればコピーします。質問が出ない場合は、仮定が穴リストのどこに当たるかを同様に記録します。
記録の取り方と集計
質問ごとに1行、条件と回ごとにまとめて記録します。最低限、次の項目を残します。
- 質問の順番
- 質問文
- 対応する穴の番号(なければ空)
- 重複・既記載の印
- 分岐するか
- 選択肢や既定値があるか
そこから出す指標は4つです。
- 重要穴カバー率:重要度3の穴のうち、質問で触れられたものの割合です。
- 無駄質問率:穴に対応しない質問と、重複・既記載の質問が全体に占める割合です。
- 初出順位:重要度3の穴に最初に当たった質問が、何番目だったかです。
- 質問数:総数です。
採点を手計算するとミスが入りやすいので、ブラウザで開くだけで動く集計用の最小コードを置いておきます。hole に穴の番号(なければ null)、dup に重複・既記載かどうかを入れます。
<!doctype html>
<meta charset="utf-8">
<textarea id="q" rows="8" cols="60">
[{"hole":1,"dup":false},{"hole":null,"dup":true},{"hole":3,"dup":false}]
</textarea>
<br><button id="go">集計</button>
<pre id="out"></pre>
<script>
// 穴番号 → 重要度(3=必須、2=あると良い、1=任せてよい)
const holes = {1:3, 2:3, 3:3, 4:2, 5:2, 6:2, 7:2, 8:1, 9:1};
document.getElementById("go").onclick = () => {
const qs = JSON.parse(document.getElementById("q").value);
const hit = new Set(qs.filter(x => x.hole && !x.dup).map(x => x.hole));
const must = Object.keys(holes).filter(k => holes[k] === 3).map(Number);
const found = must.filter(k => hit.has(k));
const waste = qs.filter(x => !x.hole || x.dup).length;
const first = qs.findIndex(x => x.hole && !x.dup && holes[x.hole] === 3) + 1;
document.getElementById("out").textContent =
"質問数: " + qs.length + "\n" +
"重要穴カバー率: " + found.length + " / " + must.length + "\n" +
"無駄質問率: " + (qs.length ? Math.round(waste / qs.length * 100) : 0) + "%\n" +
"重要穴の初出順位: " + (first || "なし");
};
</script>回ごとの値を条件別に並べ、3回の幅も一緒に書き留めてください。平均だけを見ると、「毎回そこそこ」なのか「当たりと外れの差が大きい」のかが分からなくなります。
結果の読み方と誤りやすい点
数字の読み方
指標の組み合わせごとに、次のように判断します。
- カバー率が高く、無駄質問率が低い:その指示文は仕様の抜け出しに使えます。標準の頼み方として採用する価値があります。
- 質問数は多いが、カバー率が低い:数で稼いでいるだけです。質問の件数ではなく、質問が抜けに届いたかで評価してください。
- 条件Bのほうが条件Aより無駄質問率が低い:制約を付けた指示が効いています。その場合は、上限数や「推奨の既定値つき」といった制約のどれが効いたのかを、一つずつ外して確かめる価値があります。
- 条件Cでも仮定の宣言が穴にほぼ当たる:質問させなくても抜けは見える可能性があります。質問を待つ時間のほうが重いかもしれません。
- 3回のばらつきが大きい:1回の質問に頼らず、2回聞いて重なりを見る使い方を検討してください。
特に注目したいのは、穴リストにない質問のうち、聞かれてみて「確かに決めていなかった」と気づくものです。それは AI の質問が自分の見落としを突いた証拠です。そうした質問が複数回出るなら、穴リストに追加し、次のお題からの標準チェック項目にします。
誤りやすい点
- 穴リストを後から直す:質問を見てから穴を足すと、すべての質問が当たって見えます。追加するなら、追加したことと日付を残し、集計は元の穴リストでも出し直してください。
- 仕様が穴だらけ:穴が多すぎると、何を聞いても当たります。お題の難しさは条件間で揃えてください。
- 回答が毎回違う:答え方で次の質問や実装が変わります。回答表を固定する理由です。
- 質問の数を良さと混同する:多く聞いたからといって、重要な抜けに届いたとは限りません。
- 答えやすさだけで評価する:選択肢がついて答えやすい質問でも、分岐しなければ価値はありません。
- 会話を使い回す:同じ会話で条件を切り替えると、前の質問の影響が残ります。
次の行動
自分の次のゲームの一行仕様を使い、穴リストを先に10個ほど書き出してください。そのうえで条件Aと条件Bを各3回ずつ、新しい会話で試し、上の集計コードで重要穴カバー率と無駄質問率を並べてみます。完成した作品はアソバースのHTML投稿に合う形に整えて公開できるので、質問で決めた仕様がプレイ感にどう効いたかも、動かして確かめてください。

