RESTRICTED の隔離
機密度ティアと、RESTRICTED コンテンツが LLM プロンプトに到達する前に 2 つの独立した出口でフィルタリングされる仕組み。
一部のコンテンツは決してドメイン外に出してはなりません — 取締役会の格付けメモや経営委員会の
議事録などです。RAGSpine はすべてのチャンクに機密度ティアを持たせることでこれをモデル化し、
RESTRICTED コンテンツがプロンプトに到達する前に 2 つの独立した出口で除去されることを
強制します。
保証。 機密度が RESTRICTED のコンテンツは、retrieval/link と retrieval/rerank という
2 つの出口でフィルタリングされるため、LLM プロンプトに入ることは決してありません。両方の
フィルタは維持されなければならず、どちらか一方だけでは不十分です。
機密度ティア
機密度は各チャンク上の文字列カラムです(retrieval/chunking/chunk_store.py、
デフォルトは INTERNAL)。分類は決定的であり、設定駆動で行われます
(common/sensitivity.py の classify_sensitivity + SensitivityPolicy):
restricted_filename_patterns に一致する場合 → RESTRICTED。restricted_keyword に一致する場合 → RESTRICTED。escalate_unknown_to_restricted がオンの場合 → RESTRICTED。default_level(デフォルトは INTERNAL)。これはシグナルに基づくフェイルセーフです:ラベル付けされていなくてもシグナルを含む
ドキュメントは RESTRICTED にエスカレートされます。「未知のものはすべて → RESTRICTED」と
いう一律の扱いでは、通常のレポートまで隠してしまい検索を壊してしまうため、これはオプトインの
厳格スイッチであり、デフォルトではオフです。ポリシーは [sensitivity] 設定セクションから
読み込まれ、企業固有の単語はハードコードされていません。
出口は 1 つではなく 2 つ
ナラティブチャネルが RESTRICTED コンテンツに触れたうえで LLM へと向かう箇所は 2 つあり、
それぞれが独立にフィルタリングを行います。
検索をエージェントに接続するアダプタ(retrieval/link/narrative_link.py)です。
エージェントは検索されたスニペットのテキストを LLM の合成プロンプトに投入するため、
アダプタはスニペットを返す前に、この出口であらゆる RESTRICTED チャンクを除去します:
return [
_to_snippet(r)
for r in results
if str(r.chunk.sensitivity).upper() != RESTRICTED_SENSITIVITY
]この一致判定は大文字・小文字を区別しません。このフィルタがなければ、RESTRICTED
スニペットのテキストがそのまま合成プロンプトに入り込んでしまいます。
リストワイズ再ランカー(retrieval/rerank/listwise_rerank.py)です。再ランキングは候補の
テキストを LLM ジャッジに送信するため、RESTRICTED 候補は決してジャッジのプロンプトに
入れられません:
- RESTRICTED でないサブセットのみがジャッジに送られます。
RESTRICTEDチャンクは元の RRF の位置にそのまま据え置かれます。- すべての候補が
RESTRICTEDの場合、ジャッジは一切呼び出されず、結果は純粋な RRF 順序に 縮退します。
これは「戦略 B」です:機密でないサブセットに対する再ランキング品質を維持しつつ、RESTRICTED
テキストがジャッジに一切到達しないことを保証します(凍結テストがこれを固定しています)。
なぜ両方が必要なのか
2 つの出口は、再ランキングのジャッジプロンプトと合成プロンプトという、異なる 2 つの LLM 対向面をそれぞれ守っています。あるチャンクが一方の経路を通過しても、なおもう一方へと 向かっている可能性があるからです。
多層防御:再ランキングのフィルタはジャッジを守り、リンクのフィルタは合成を守ります。両方の
不変条件は retrieval/CLAUDE.md に「両方とも維持必須」として列挙されており、上流の分類器に
よるフェイルセーフなエスカレーションが第一線です — もし RESTRICTED ドキュメントが
インジェスト時に誤って INTERNAL とラベル付けされたら、両方の出口フィルタはそれを素通り
させてしまいます。誤ラベルは漏洩そのものであり、決定的な分類器がそれを防ぎます。
エージェントの最初のガード:スコープ外エンティティ
これとは別に、決定的なセキュリティゲートが、いかなるチャネル、ツール、リトリーバー、LLM
呼び出しが実行されるよりも前に、スコープ外 / 競合他社エンティティに関する質問を拒否します
(agent/agent.py:CLARIFY_OUT_OF_SCOPE_ENTITY が最初に返されます)。このゲートは意図的に
決して差し替え不可とされています:生の質問から競合 / 外部スコープを再導出し、一致した
エイリアスを同じ長さの空白でマスクするため、別の(LLM ベースのものであっても)インテント
パーサーに差し替えてもこれを無効化することはできません。システムが、外部エンティティに関する
質問への回答として自社の数値を出力することは決してありません。