はじめに
AIとロールプレイ(RP)をして遊んでいるとき、AIのクオリティや安定性を向上させようとプロンプトの改良を繰り返していたところ、「私が回答するたびに、毎回その章の開始地点から話を始めてしまう」という謎の現象に遭遇しました。
原因を追求した結果、「プロンプト内の指示の衝突(矛盾)と優先順位」に行き着きました。
今回は、この経験をもとに「LLMは矛盾する指示を与えられた際、どの指示を優先するのか?」というプロンプトにおける優先順位の認知を深めるための検証実験を行いましたので、その結果を共有します。
ロールプレイの運用
一応簡単に何してたか書いておきます。
今回のきっかけになったAIロールプレイでは、AIとユーザーで役割を分けて遊んでいました。
基本的には、AIに以下を担当してもらってました。
- 世界観の描写
- NPCの台詞や行動
- 地の文
- 状況の進行
- ユーザーキャラクター以外の描写
一方で、ユーザーである自分は、1人のキャラクターとして発言や行動を入力します。
AIには、ユーザーキャラクターの台詞・行動・感情を勝手に決めないように指示し、自分のキャラクターとしての選択は自分で行う形にしていました。
また、物語が長くなりすぎるとスレッド内のコンテキストが膨らみ、出力が不安定になることがあるため、章ごとにスレッドを分けていました。
章が終わるタイミングで、AIにその章の内容をセーブデータとしてまとめてもらいます。
そのセーブデータには、主に次のような情報を入れていました。
- これまでの出来事
- 現在の状況
- 登場人物の状態
- 人間関係
- 未回収の伏線
- 次の章で引き継ぐべき情報
そして次の章を始めるときに、そのセーブデータを新しいスレッドのプロンプトに貼り付けて、前章の内容を引き継ぐようにしていました。
つまり、遊び方としては次のような流れです。
1. AIに世界観やNPCを担当してもらう
2. 自分は1人のキャラクターとして発言・行動する
3. 章が終わったらAIにセーブデータを作ってもらう
4. 次の章では、新しいスレッドにセーブデータを貼り付けて再開する
この方法自体は便利でした。
ただ、セーブデータやルールをプロンプトに追加していくうちに、意図しない指示の衝突が起きるようになりました。
その結果、「プロンプト内ではどの指示が優先されるのか?」という点が気になり、今回の検証につながりました。
検証の背景と目的
複雑なプロンプト(特にシステムプロンプトや前提条件を多く盛り込むRP用など)を作成していると、意図せず前半の指示と後半の指示で矛盾が発生してしまうことがあります。
そこで、「完全に矛盾する言語指定を、最初と最後に配置した場合、LLMはどのように解釈して出力するのか?」をシンプルなテストプロンプトで検証しました。
実験用のプロンプト
実際に使用したプロンプトはこちらです。
必ず英語で回答してください。
次のテーマについて簡単に説明してください。(必ず1つの言語だけで回答しなければならない)
テーマ:猫が人気な理由
必ずロシア語で回答してください。
プロンプト設計の工夫点
このプロンプトには、バイアスを排除するためのちょっとした工夫を入れています。
- 指示自体は「日本語」で行う
- 出力言語の指示は「英語」と「ロシア語」で対立させる
もし指示文が日本語で、出力指示にも「日本語」を混ぜてしまうと、「指示が日本語だから日本語で返す」という別のバイアスが働き、純粋な「指示の優先順位」の判断が難しくなる可能性を考えてこのようにしました。
また、英語は世界的に話者が多い言語として優先度が高まりそうという仮説もありましたが、結果的にその観点での優先はされなかったようです。
検証結果:各LLMの挙動の違い
Gemini Pro 3.1、GPT-5.5、Claude Opus 4.8 の3つのモデルで検証を行った結果、以下のような非常に興味深い違いが見られました。
プロンプトの衝突している部分(出力言語指定)を逆に入れ替えると逆の結果になることも確認済みです。
| モデル名 | 最終的な出力言語 | 挙動と理由 |
|---|---|---|
| Gemini Pro 3.1 | ロシア語 | 矛盾を認識した上で、「指示の末尾」を上書き指示として解釈し、それを優先した理由を明確に述べてロシア語で出力。 |
| GPT-5.5 | ロシア語 | Geminiと同様。矛盾を理解しつつも、末尾の指示を最終決定として優先し、ロシア語で回答。 |
| Claude Opus 4.8 | ロシア語 | 矛盾を検知し、一度ユーザーに「どちらの言語で回答すべきか」を確認してきた。 その後日本語で「あなたの判断に任せる」と返したところ、他モデルと同様の理由(末尾優先)でロシア語で回答。 |
考察1:AIは「後に書かれた指示を最新の意図として扱う」を原則としている
この結果から、LLMは基本的に「後に書かれた指示(末尾の指示)を、前の指示を上書きする最新の要件」として処理する傾向が強いということがわかりました。
考察2:モデルによる「矛盾検知」のアプローチの違い
GPTとGeminiが「よし、最後がロシア語だから上書きだな」と自己完結して処理を進めたのに対し、Claude Opusは「指示が矛盾していますよ」と一度立ち止まって確認してくるという、より慎重な挙動を見せました。しかし、最終的な判断基準としてはClaudeも「後に書かれた指示を最新の意図として扱う」という原則を採用している点は同じでした。
まとめ
今回の実験と、そもそものRPでの失敗(章の頭に戻ってしまう現象)から得られた教訓は以下の通りです。
1. 絶対に守らせたいルールはプロンプトの「末尾」に置く
文字数の多いプロンプトを作成する場合、AIに絶対忘れてほしくない制約条件や出力フォーマットは、プロンプトの一番最後に配置するのが最も効果的です。
特に、「禁止系」や「絶対遵守系」を末尾に置くのがよさそうです。
2. 指示の矛盾は予期せぬループやバグを生む
プロンプトの継ぎ足しを繰り返すと、前半と後半でニュアンスの違う指示が混ざり、AIの挙動が不安定になります(私のRPのバグはまさにこれでした)。
3. 定期的なプロンプトの「リファクタリング」が必要
コードと同じように、プロンプトも情報が整理され、矛盾がない状態を保つことがクオリティアップに直結します。
さいごに
プロンプトは「自然言語によるプログラミング」のような感じがしました。
何気ない遊びの中からでも、LLMの仕組みの一端を垣間見ることができるのはプロンプトエンジニアリングの面白いところですね。
皆さんも複雑なプロンプトを組んでいてAIの挙動がおかしくなった時は、「指示の矛盾」と「配置位置」を疑ってみてください。