ルールがなぜ発火しないのか:AIエージェント指示システムのデバッグ手法

Published · AI Daily — AI-assisted deep research, methodology & disclosure

日本のAIシステムアーキテクト山田氏が、AGENTS.md や CLAUDE.md に記述された厳格なルールや否定制約が、長大なマルチターン対話でなぜ無視されてしまうのかを徹底検証。コンテキストウィンドウ内でのアテンション減衰とトークン競合を主因として特定し、階層型ルールルーティング、実行前前提条件インジェクション、実行後アクティブアサーション検証からなる実践的パターンにより、99%以上の指示遵守率を達成する手法を解説しています。

消えた指示書:なぜリポジトリのルールはマルチターンで無視されるのか

Cursor、Claude Code、Devinなどの自律型コーディングエージェントが開発現場に急速に浸透する中、リポジトリ直下に `CLAUDE.md` や `AGENTS.md`、`.cursorrules` といった設定ファイルを配置することが標準的な開発プラクティスとなりました。これらのファイルには、「本番環境の設定ファイルを直接変更してはならない」「DBのスキーマ変更には必ずロールバックスクリプトを伴わせること」「明示的な許可なく外部シェルコマンドを実行するな」といった、チームの規約が事細かに記載されています。しかし、実際に複雑なタスクをエージェントに依頼したことのあるエンジニアであれば、誰もが同じ苛立ちを経験しているはずです。対話が十数ターン進むと、エージェントはまるでそれらのルールを忘弊したかのように無視し、機密ファイルを書き換えたり、ユニットテストをスキップしたりする現象です。

日本のAIシステムアーキテクト山田氏が技術共有プラットフォーム Zenn で発表した詳細な実証記事は、この問題の根本原因を白日の下に晒しました。山田氏によれば、これはモデルの「能力不足」ではなく、Transformerの自己注意機構(Self-Attention)の数理的性質と、開発者の直感的な期待との間に横たわる構造的なミスマッチに起因しています。開発者は、静的な設定ファイルに数十行のルールを記述すれば、モデルが従来のルールエンジンのように厳格なブール代数評価を行ってくれると錯覚しがちです。しかし現実には、トークン列が長大化するにつれて、コンテキスト最上部に置かれたシステムプロンプトへの注意の重みは急激に拡散・減衰(Attention Dilution)していきます。

認知の病理:Lost-in-the-Middle と否定制約の罠

山田氏は、500回以上の実開発タスクにおけるエージェントの思考ログとツール実行ログを詳細に分析し、ルールが発火しなくなる2つの致命的な要因を特定しました。

1. 中間欠落(Lost-in-the-Middle)と局所コンテキストの支配

タスクが15ターン、20ターンと長期化すると、コンテキストウィンドウ内には数千行に及ぶコンパイラのエラーログ、差分コード(git diff)、ターミナルの実行結果が蓄積されます。この時、Transformerの自己注意機構のリソースは、直近の局所的なトークンや当面の構文エラーの解消に集中します。コンテキストの先頭にあるルール記述は、次トークン予測の生成位置から遥か彼方へと押し流され、モデルの内部状態に影響を与える勾配が極小化してしまうのです。

2. 否定制約パラドックス(Negative Constraint Paradox)

多くの開発規約は「〜するな」という禁止構文で書かれています(例:「非推奨関数 `old_helper` を削除するな」)。しかし、大量のコードで学習された言語モデルにとって、「NOT」という否定演算子は注意行列の中で独立した抑制シグナルとして機能しにくい性質があります。禁止対象の単語をプロンプト内で強調すればするほど、モデルの内部空間でそのトークン周辺のベクトルが強く活性化し、結果として禁止された操作を自発的に実行してしまうという認知の逆転現象が頻発します。

指示遵守率99%以上を達成する三重防御アーキテクチャ

この「注意の忘弊」を根本から克服するため、山田氏は静的なテキストプロンプトを動的な検証パイプラインへと昇華させる3つの実践的アーキテクチャを提唱しています。 ### 1. 階層的動的ルールルーティング(Hierarchical Dynamic Rule Routing)

すべてのルールを常時プロンプトに含めることを廃止します。エージェントが「データベース操作」や「ファイル修正」といった特定のアクションに踏み込もうとした瞬間を意図分類器で検知し、そのアクションに直接関係するルールだけを直前のターンにジャストインタイム(JIT)で注入します。これにより、限られた注意ウィンドウのリソースを常に必要最小限のクリティカルな制約に集中させます。

2. 実行前意図宣言コントラクト(Pre-Action Intent Contracts)

ファイル変更やシェル実行などの破壊的操作を伴うツール呼び出しを行う前に、エージェントに対して「実行意図とルール適合性の自己アサーション」を構造化JSONとして出力することを強制します。思考過程(Chain-of-Thought)の中で自らの計画をルールと照合させるステップを明示的に挟むことで、自己回帰生成の注意力を自律的な適合性検証へと誘導します。 ### 3. 決定論的サンドボックス迎撃とペナルティリトライ

モデルの確率的な遵守能力に安全を委ねることを完全に破棄します。エージェントの外側に、gitフックやASTパーサーを用いた決定論的ガードレールを常駐させます。エージェントが保護対象ファイルに触れようとした瞬間にミリ秒単位でツール実行を遮断し、明確なペナルティメッセージをコンテキストに差し戻して再計画を強制します。

「お祈りプロンプト」からの脱却

山田氏の提言は、AI時代のソフトウェア開発における重要な転換点を示しています。

自然言語でルールを書き連ねてエージェントが守ってくれることを祈る「お祈りプログラミング」の時代は終わりました。JITインジェクション、明示的コントラクト、そして決定論的インターセプトの三位一体を構築することこそが、自律型AIエージェントを本番環境で真に実用に耐えうるシステムへと変貌させる唯一の道です。

Sources

FAQ

指示ファイルのルールが長期対話で無視される理由は何ですか?

対話の深化に伴い膨大なログがコンテキストを埋め尽くし、注意機構が直近の局所情報に偏るため、最上部の静的ルールへの関心が希釈されるからです。

「〜するな」という否定制約が逆効果を生むのはなぜですか?

言語モデルは否定構文の抑制を苦手とし、禁止語句を強調するほど内部の単語ベクトルが活性化して、かえって禁止行動を誘発しやすくなるためです。

山田氏が提唱する三重防御アーキテクチャの要点とは?

必要な瞬間だけ制約を注水する動的ルールルーティング、実行前の意図宣言コントラクト、違反を即時遮断する決定論的サンドボックスの3本柱です。