AIを業務で使い込むほどぶつかるのが「指示を守ってくれない」問題だ。特にClaude Codeのようなエージェント型AIは、複雑な指示のセットを持つほど「どれを優先するか」で揺らぎが生じやすい。本記事では、Claudeが指示・スキル・ルールを無視するときの原因を整理し、国内外で実際に使われている対策を網羅する。
なぜClaudeは指示を無視するのか
根本を理解しておくことが対策の前提になる。
1. 優先順位の競合
Claudeには内部的な優先順位がある。Anthropicが公開しているModel Specificationによると、大きな順に「広い社会への安全性」「Anthropicの倫理ポリシー」「オペレーターの指示」「ユーザーの指示」という階層がある。ユーザーが与えたカスタム指示は最下位に位置するため、上位ルールと競合すると上書きされる。
2. コンテキストウィンドウの希薄化
会話が長くなると、最初に与えた指示がウィンドウの遠い位置に移動し、参照される頻度が下がる。これは「lost-in-the-middle」問題として学術的にも知られており、Stanfordの研究(Liu et al., 2023)では文脈の中央付近の情報が最も無視されやすいと示された。
3. スキル・指示の曖昧さ
「できるだけ簡潔に」「なるべく丁寧に」のような相対的な表現は、モデルが解釈を誤りやすい。特にスキル(/skill-name)の発動条件が曖昧だと、ユーザーが意図していない言い回しでは発動しない。
4. ロールプレイ・仮定による上書き
「もし〇〇だとしたら」「キャラクターとして答えて」など、仮定や役割設定を含む文脈では、Claudeがシステム指示よりもキャラクター設定を優先するケースがある。これはプロンプトインジェクション攻撃として悪用されることもある。
対策1: CLAUDE.mdで「絶対ルール」を宣言する
Claude Codeでは、プロジェクトルートまたはユーザーホームに置いた CLAUDE.md が常に読み込まれる。ここに書いたルールはシステムプロンプトに近い位置で参照されるため、最も強力な指示場所になる。
書き方のポイント
# プロジェクトルール
## 絶対に守るルール(MANDATORY)
- 出力テキストで「--」を使わない。代わりに読点・句点・改行を使う
- コード変更前に必ず影響範囲を提示してユーザー承認を得る
- ファイル編集はEdit/Writeツールのみ使用。Bashでのファイル操作は禁止
「MANDATORY」「NEVER」「IMPORTANT: This OVERRIDES default behavior」 といった強調ワードを使うことで、Claudeはそのルールを高優先度として扱いやすくなる。これはAnthropicの公式ドキュメントおよびプロンプトエンジニアリングのベストプラクティス(Anthropic Prompt Library参照)で推奨される表現だ。
国内事例
日本のClaude Codeユーザーコミュニティ(Zenn・Qiita)では、CLAUDE.mdに「敬語禁止」「箇条書き禁止」「コード外で絵文字禁止」などの文体ルールを書いて管理するケースが増えている。特定の表現を「出力テキストで使わない」と明記することで再現性が上がると報告されている。
対策2: フック(Hooks)で機械的に強制する
Claude Codeの Hooks機能 は、AIが特定のツールを呼ぼうとした瞬間にシェルコマンドを実行できる仕組みだ。「AIが守らなければシステムが止める」という機械的な強制力を持つ。
~/.claude/settings.json または .claude/settings.json に以下のように記述する。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "node check-protected-files.js"
}
]
}
]
}
}
使えるフックの種類
| フック名 | 発火タイミング |
|---|---|
PreToolUse |
ツール呼び出し直前(ブロック可能) |
PostToolUse |
ツール呼び出し直後 |
UserPromptSubmit |
ユーザーがメッセージを送信した直後 |
Stop |
Claudeが応答を終えた直後 |
PreToolUse でスクリプトが exit code 1 を返すと、Claudeはそのツール呼び出しを中断する。build/ など重要ディレクトリへの書き込みを物理的にブロックするのに有効だ。
国際事例
海外のClaude Codeユーザー(Reddit r/ClaudeAI・GitHub Discussions)では、「Bashでrm -rfを呼ぼうとしたら拒否するフック」や「本番環境へのgit pushを承認制にするフック」の実装例が共有されている。特にセキュリティ用途で活発に使われている。
対策3: スキルの発動条件を具体的に書く
Claude Codeのスキル(.claude/skills/ 以下のMarkdownファイル)は、発動条件の記述が曖昧だと「ユーザーが意図しない言い回し」では発動しない。
悪い例
コードを書くときに使う。
良い例
## MANDATORY TRIGGERS(必ず発動する条件)
- ユーザーが「実装して」「追加して」「作って」と言った時
- 新しいファイルを作成する前
- 既存関数を変更する前
## SKIP(発動しない条件)
- 読み取り専用の調査・検索のみの場合
- ユーザーが「確認だけ」「調べて」と言った場合
MANDATORY TRIGGERS と SKIP を明示的に分けることで、スキルのオン・オフの境界をClaudeが判断しやすくなる。これは実際のSkillファイルで採用されているパターンだ。
対策4: 指示の冒頭と末尾に繰り返す
コンテキストウィンドウの「lost-in-the-middle」問題への対策として、重要ルールを 冒頭と末尾の両方に記述する 手法がある。
# CLAUDE.md
## [冒頭] 絶対ルール
- 出力テキストで「--」を使わない
---
(中略: 詳細なプロジェクト情報)
---
## [末尾] リマインダー(IMPORTANT: 毎回確認すること)
- 出力テキストで「--」を使わない
OpenAI・Anthropicのプロンプトエンジニアリングガイドともに「重要な制約は先頭か末尾に置く」ことを推奨しており、長文コンテキストでの一般的なベストプラクティスになっている。
対策5: 否定形より「代替行動」を指定する
「〇〇するな」という否定指示だけでは、モデルがどう振る舞えばよいか分からず、指示を無視しやすい。「〇〇の代わりに△△する」という形式 が効果的だ。
| 弱い指示 | 強い指示 |
|---|---|
| 「コメントを書くな」 | 「コメントは書かない。理由が非自明な場合のみ、1行以内で書く」 |
| 「長く説明するな」 | 「説明は2文以内。詳細はユーザーに聞かれた時だけ追加する」 |
| 「絵文字を使うな」 | 「絵文字はユーザーが明示的に求めた時だけ使う」 |
この手法はAnthropicのPrompt Libraryおよびopenai.com/promptingのベストプラクティスセクションで共通して推奨されている。
対策6: UserPromptSubmitフックで毎回チェックさせる
UserPromptSubmit フックを使うと、ユーザーがメッセージを送るたびにコンテキストを自動注入できる。スクリプトが標準出力に出力した内容は、そのターンのシステムコンテキストに追加される。
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "echo 【必須ルール】ファイル編集前に必ず影響範囲を提示してユーザー承認を得ること"
}
]
}
]
}
}
これにより、会話が長くなってもルールがリセットされるたびに再注入される。このプロジェクトでも実際に採用している手法だ。
対策7: モデルを変える・温度を下げる
海外フォーラム(LessWrong・EleutherAI Discord)での議論では、「指示追従性(instruction following)」はモデルの種類とサンプリング温度に強く依存することが指摘されている。
- Claude Opusシリーズ は Sonnet / Haiku より指示追従性が高いとされる
- temperature=0 に近いほど、指示から外れた創造的解釈が減る
- Claude APIでは
top_pを下げることでも効果がある
ただしClaude Codeはtemperatureを直接制御できないため、API経由で利用するケースに限られる。
対策8: Anthropicへのフィードバック
これは個人の対策ではなく、コミュニティ全体の話だが、Anthropicはmodel feedbackを受け付けており、指示追従性の問題は訓練データに反映される。GitHub上のClaudeリポジトリのIssueや、Reddit r/ClaudeAIへの再現手順付きの報告が、実際の改善につながった事例もある。
まとめ: 優先度順の対策チェックリスト
| 優先度 | 対策 | 効果 | 難易度 |
|---|---|---|---|
| 高 | CLAUDE.mdにMANDATORYルールを記述 | 大 | 低 |
| 高 | PreToolUseフックで物理的にブロック | 大 | 中 |
| 高 | UserPromptSubmitフックでルールを毎回注入 | 大 | 中 |
| 中 | スキルの発動条件をMANDATORY TRIGGERSで明示 | 中 | 低 |
| 中 | 否定指示を「代替行動」形式に書き換える | 中 | 低 |
| 中 | 重要ルールを冒頭と末尾に両方書く | 中 | 低 |
| 低 | temperatureを下げる(API利用時) | 中 | 低 |
| 低 | Anthropicにフィードバックを送る | 長期的に大 | 低 |
「AIが守らないなら強く言う」という人間的アプローチには限界がある。CLAUDE.mdとフックの組み合わせで「機械的に守らざるを得ない環境」を作ることが、最も再現性の高い解決策だ。
参考リンク
- Anthropic Model Specification
- Claude Code Hooks Documentation
- Anthropic Prompt Library
- Liu et al. (2023) "Lost in the Middle: How Language Models Use Long Contexts" - Stanford NLP