Skip to content

提案と拘束 — 到達 / 表現 / 実行 / 拘束の四層

拘束力を決めるのは、処理が決定論的かどうかではない。成果物がトークン列に入るかどうかである。

このドキュメントについて

RAG、Vector DB、MCP、Skills、プロンプト。これらはいずれも最終的に LLM の context window に入り、1 本のトークン列として LLM に渡される。そのため「RAG も MCP も Skills も、結局は LLM に渡すデータをどう構造化するかという問題に帰着する」という見方が成り立つ。この見方は妥当だが、これだけを設計指針にすると、成否を決めている層 が視界から外れる。

本ページでは、RAG・MCP・Skills などの個々の技術を評価する前に、それらを分類するための座標系を定義する。扱うのは以下の 3 つである。

  1. 拘束するものとしないものを分ける判定質問
  2. トークン列の内側にある 2 つの別作業(到達と表現)
  3. 四層への配置と、層を取り違えたときに何が起きるか

対象読者: RAG・MCP・Skills・permission を同じ設計の中に並べて置く人、「プロンプトに書いたのに守られない」の原因を層で説明したい人

このページの位置づけ

本ページは分類の座標系だけを扱う。座標系の上に載る個別の設計は別ページにある。拘束層のうち判定をどう設計するか判定の決定論性拘束層の境界でエージェントが何を要求するかPermission と Authorityハーネスと 5 層モデルの静的対応Harness Engineering との対応関係 を参照。

メタ情報
このページで固定するもの拘束 / 非拘束の判定質問、到達と表現の区別、四層の定義、技術ごとの層配置、設計時の三点チェック
扱わないこと判定層の内部設計(→ deterministic-verdicts)、境界での要求形式(→ permission-vs-authority)、個別 MCP の実装手順(→ mcp/development
依存harness-engineering-mapping
誤用ポイント検索処理が決定論的だから拘束すると考えること、スキーマ検証を呼び出しの是非に対する拘束と考えること、CLAUDE.md の禁止事項を拘束層に数えること

TIP

3 行で言うと

  • 拘束するかどうかは LLM が指示を無視した出力を出したとき、結果が変わるか で決まる。変わらないものだけが拘束する。処理そのものが決定論的かどうかとは無関係である。
  • トークン列の内側は 2 作業に割れる。到達(何を候補にするか)と 表現(入った後に誤読されないか)。両者は代替しない。
  • 最も起きやすい取り違えは、拘束層のつもりで書いたものが表現層にいることである。プロンプトの禁止事項がこれにあたる。

出発点の観察と、その不足

LLM の入力はトークン列 1 本である。RAG の検索結果も、MCP のレスポンスも、Skill 本体も、プロンプトも、最終的にはこの 1 本のトークン列に入る。「すべてはデータの構造化に帰着する」という見方は、この事実を正しく捉えている。

不足しているのは、その構造化がどれだけ精緻でも、LLM はそれを無視した出力を出せる という点である。構造化は出力の分布を動かすが、確定はさせない。何が出力を確定させているのか、それが設計のどこにあるのかは、構造化の議論からは出てこない。

分割線 — 何が成否を決めるか

判定は 1 つの質問でできる。

IMPORTANT

LLM が指示を無視する出力を出したとき、結果は変わるか。

  • 変わる → 非拘束。提案どまりである
  • 変わらない → 拘束。成否が確定する
内容拘束
トークン列に入るものRAG の検索結果、プロンプト、Skill 本体、tool description、MCP のレスポンスしない
境界: LLM の出力そのものどのツールを、どの引数で呼ぶかここまでは確率的に決まる
トークン列の外にあるものpermission、hook、MCP サーバ側の引数検証、型チェック、CI、テスト、人間による承認する

「制御機構は構造化とは別物だ」という直感が正しいのは、3 行目だけ である。CLAUDE.md の禁止事項もプロンプトの注意書きも tool description の警告も、形式上は制御に見えるが、実体は 1 行目にある。

WARNING

処理そのものが決定論的かどうかは、拘束力とは無関係である。

Vector DB の検索は決定論的なコードで、同じクエリなら同じ結果を返す。それでも結果は context に入るので、LLM はそれを無視した出力を出せる。逆に permission は LLM の出力を入力に取るが、判定はトークン列の外で完結するため拘束する。決定論的な実装であることと、成否を確定させることは別の性質である。

NOTE

用語の対応: 本サイトの他ページでは「決定論的な判定層」という呼び方をしている(判定の決定論性)。あれは本ページの 拘束層 に対応する。本ページで「決定論的」を拘束の同義語として使わないのは、上のとおり決定論的でも拘束しない処理があるためである。

トークン列の内側 — 到達と表現

「データの構造化」と呼ばれるものの中にも、目的の異なる 2 作業が混在している。

区分問い典型
到達 (Reach)何を context の候補にするかVector DB の検索、Skill の description による発火、tool description
表現 (Expression)context に入った後、誤読されない形かMarkdown 構造、スキーマ定義、プロンプト本文、Skill 本体

到達が良くても表現が悪ければ誤読する。表現が良くても到達しなければ、そもそも context に入らない。片方を厚くしても、もう片方の代わりにはならない。

「構造化」の射程は入力側である

本ページの到達・表現は、いずれも LLM に読ませるデータ の構造を指す。「JSON で返せ」のような 出力フォーマット の指定は、これとは別の軸である。

出力フォーマットを強く制約すると推論タスクの正答率が下がる、という報告がある (Tam et al., 2024)。一方で、同条件で比較し直すと差が消えるという再検証もあり (Kurt, 2024)、確定した結論ではない。この論点は、Context Rot の Distractor Interference(入力側の現象)と混ぜて「構造化は精度を下げる」と説明されることが多いが、別の現象である。

  • Distractor Interference は入力側の現象であり、妨害情報が context に入るかどうかは到達層の設計で決まる。本ページの見方を補強する。
  • 出力フォーマット制約の対策は、既存の層に収まる。「自由記述で考えてから最後に JSON にまとめる」は表現層の設計、「スキーマを API 側で強制する(constrained decoding、tool use の input_schema)」は拘束層である。層は増えない。

詳細は姉妹サイトの 出力フォーマット制約と精度 を参照。

四層

拘束問い典型
到達しない何を候補にするかVector DB / RAG、description による選択
表現しない誤読されない形かプロンプト、Skill 本体、スキーマ、整形済みレスポンス
実行境界何をどう呼ぶかMCP の write 系ツール、Bash
拘束する通すか、拒否するかpermission / hook、サーバ側検証、型・CI・テスト、人間による承認

実行は二段である。試みるところまでは確率的に決まり、通るかどうかは拘束層で決まる。実行層に到達したこと自体は何も保証しない。

人間による承認も、判定がトークン列の外で完結する限り拘束層に属する。ただし承認者が読む材料がエージェントの自己申告だけなら、後述の三点チェックの 3 番目に該当する。

実行の結果は次の周回の到達・表現へ戻る。この周回は Harness Engineering との対応関係 の①〜④ループと同じものを、拘束の有無という別の軸で切ったものである。

技術ごとの配置

技術到達表現実行拘束
Vector DB / RAG
プロンプト
Skills○(description)◎(本体)
MCP○(tool description)○(レスポンス整形)◎(write 系)○(引数検証・スキーマ)
permission / hook / CI

MCP だけが四層にまたがる。 「MCP はデータ構造化の手段だ」とだけ捉えると、MCP が持つ唯一の拘束部分——サーバ側の引数検証とスキーマ拒否——が設計から抜け落ちる。

WARNING

スキーマ検証が拘束するのは「どう呼ぶか」だけである。

スキーマは引数の形を拒否できる。呼ぶべきでない場面でそのツールを呼ぶことは拒否できない。後者は permission 側の判定であり、別の機構が要る。→ Permission と Authority

同じスキーマが 2 つの層に顔を出す点にも注意する。検証の強制(サーバ側で拒否すること)が拘束層、定義の記述(引数の意味を書き、LLM に読ませること)は表現層である。上の表で MCP が表現と拘束の両方に印を持つのはこのためである。

よくある取り違え

取り違え実態
CLAUDE.md に禁止事項を書いたから安全表現層。無視されれば結果が変わる
プロンプトで「許可するな」と書いた提案側への要請であり、拘束層ではない
スキーマ検証があるから安全引数の形しか拒否しない。呼び出しの是非は別の層
RAG を厚くすれば拘束は不要になる到達と表現の強化であり、許可の所在は動かない
構造化すると精度が下がると聞いたので、構造化を減らす入力側(Distractor Interference)と出力側(フォーマット制約)の混同。前者は到達層の設計で妨害情報の混入量が決まる話であり、構造化を減らす理由にはならない
プロンプトに「JSON で返せ」と書いたから形式は保証される表現層。無視されれば形式が崩れる。形式を確定させるのは API 側のスキーマ強制(拘束層)であり、それでも推論の場所をスキーマの外に確保しないと精度は下がり得る
別の LLM を許可役にすれば拘束になる主体を分けると相関しない誤りは検出できる。ただし許可判定自体は確率的なまま

最後の行を否定だけで読まないこと。主体の分離には効果がある。提案側と許可側で誤りの相関が切れるので、片方だけが誤っている場合は検出できる。ただし層は上がらず、拘束層の代わりにはならない。

提案する主体と、許可する主体

この四層が必要になる理由は、次の一文に集約される。

IMPORTANT

提案する主体が許可可否を同時に決めると、正しい判断たまたま当たった判断 を区別できない。

提案側がどれだけ根拠を添えても、その根拠は表現層にある。根拠の質が高いことと、許可が下りることは、別の層で決まっている必要がある。両者が同じ主体・同じ層にあると、事後に区別する手段が残らない。

ただし拘束層に置いた判定であっても、その 入力 が提案側に支配されていれば拘束力は落ちる。判定器がエージェントの自己申告だけを読んでいるなら、判定は形式上は外にあっても、実質は提案側にある。判定層の入力と再現性の設計は 判定の決定論性 を参照。

設計時の三点チェック

新しい仕組みを足すたびに、次の 3 つを問う。

  1. それは 到達 / 表現 / 実行 / 拘束 のどれか
  2. LLM が無視したら結果は変わるか(変わるなら拘束層ではない)
  3. 拘束層に置いたなら、その 入力は提案側に支配されていないか

構造化(到達・表現)は提案の質を上げる。拘束は許可と実行の成否を決める。両方が要り、片方を厚くしてももう片方の代わりにはならない。

関連ドキュメント

さらに深く: なぜ表現層は拘束できないのか

本ページは層の 分類 (What/How) を扱った。「なぜ context に書いた指示が守られないことがあるのか」を LLM の構造的制約から理解したい場合は、姉妹サイトを参照。


前へ: Hooks(実行時フック)次へ: Permission と Authority

最終更新: 2026 年 8 月

Released under the MIT License.