RAGSieve: 信頼できる参照なしでRAGにおける知識汚染文書を検出するためのコード。
RAGSieveは、検索拡張生成(RAG)システムの2つのポイントで知識汚染文書を検出します。RSQはオンラインフィルタであり、生成のために選択された5つの文書を、現在のクエリに対する6~20位と比較してスコアリングします。RSGはオフラインスキャナであり、コーパス内のすべての文書を、それ自身の意味的・語彙的近傍と比較してスコアリングします。このパッケージには、論文で使用されたRSQとRSGの実装、完全なコーパス検索、Top-5フィルタリングと補充、文書レベルの評価、およびコンパクトで実行可能な例が含まれています。
data/datasets/ NQ、HotpotQA、MS MARCOのテキスト知識ベース
data/demo/ 4つのターゲットクエリと20の例示的なポイズン文書
src/ragsieve/ RSQ、RSG、検索、フィルタリング、メトリクス
install.sh 環境のインストール
data_preparation.sh 9つの密ベクトルインデックスのローカル構築
run_demo.sh RSQとRSGのエンドツーエンド機能チェック
公開された3つの知識ベースには、128,044件のNQ文書、9,961件のHotpotQA文書、8,239件のMS MARCOパッセージが含まれています。これらには生テキスト、1,000件のサンプリングされたクエリ、qrels、ターゲット回答、および固定された100クエリの攻撃サブセットが含まれます。密ベクトルはローカルで生成され、リポジトリの一部にはなりません。
デモには、NQからの2つのPR-Wと2つのCEM-Cの実現が含まれ、クエリごとに5つのポイズン文書があります。これらの攻撃は、完全な攻撃コレクションや攻撃生成の実装を提供することなく、両方の検出器を通る短く検査可能なパスを提供します。
Python 3.11または3.12、uv、およびCUDA対応GPUを推奨します。
bash install.sh
検出器は、初回使用時に論文で指定されたHugging Faceモデルをダウンロードします。
エンドツーエンドのQAには、共有のOpenAI互換設定をコピーして3つの値を入力します:
cp .env.example .env
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=your-model-name
OPENAI_API_KEY=your-api-key
同じエンドポイントとモデルが回答を生成し、意味的ASR判定を実行します。
bash run_demo.sh
このコマンドは、520文書のRSGスナップショット用のローカルBGE-M3インデックスを構築し、準備された完全コーパス検索コンテキストでRSQを実行し、生成Top-5をフィルタリングおよび補充し、両方の検出器を評価します。結果はoutputs/demo/に書き込まれます:
rsq-metrics.json: RSQのAUROCと5%クリーン除去時のポイズン検出;rsg-metrics.json: クエリ不要のコーパススナップショットに対するRSGメトリクス;filtered-top5.jsonl: RSQ後に生成のために保持された5つの文書。rsg-*-top5.jsonlとjoint-*-top5.jsonl: RSG単独後および共同フィルタリング後の各デモ攻撃の保持コンテキスト。QAは別のオプトインコマンドです。公開された例では、RSQはPR-WとCEM-Cの両方で100%のAUROCと5%クリーン除去時の100%ポイズン検出を達成します。RSGは同じクリーン除去予算で100%のAUROCと100%のポイズン検出を達成します;その固定ルールはポイズン文書の85%を除去し、クリーン文書の0%を除去します。これらの値はキュレーションされたデモでの機能チェックであり、論文の集計結果ではありません。
グラウンドトゥルースフィールドは評価コマンドによってのみ読み取られます。それらはRSQやRSGには渡されません。
bash data_preparation.sh
デフォルトでは、論文で評価された3データセット×3検索器(BGE-M3、E5-large-v2、all-MiniLM-L6-v2)を構築します。出力は無視されるdata/indices/ディレクトリの下に配置されます。スクリプトを編集せずにサブセットを選択できます:
DATASETS="nq" ENCODERS="bge-m3" DEVICE="cuda:0" bash data_preparation.sh
各インデックスは、論文のプーリング、プレフィックス、トランケーション、コサイン正規化設定を使用して、完全な公開コーパスから生成されます。
クリーンな検索とバンドルされた攻撃を含む検索を準備します:
uv run ragsieve prepare-contexts \
--dataset-dir data/datasets/nq \
--index-dir data/indices/nq/bge-m3 \
--subset data/demo/subset.json \
--attacks data/demo/attacks.jsonl \
--output outputs/demo/contexts.jsonl \
--device cuda:0
prepare-contextsは、各クエリに対して完全なコーパス全体で正確な検索を1回実行し、注入された文書を個別にスコアリングし、上位100件を元の順序で保存します。RSQは候補1~5を6~20位と比較してスコアリングします;残りの順位は補充に利用可能です。RSQを実行し、文書レベルのメトリクスを計算し、生成コンテキストを補充します:
uv run ragsieve detect \
--input outputs/demo/contexts.jsonl \
--output outputs/demo/rsq-predictions.jsonl \
--device cuda:0
uv run ragsieve evaluate \
--predictions outputs/demo/rsq-predictions.jsonl \
--output outputs/demo/rsq-metrics.json
uv run ragsieve filter-contexts \
--contexts outputs/demo/contexts.jsonl \
--predictions outputs/demo/rsq-predictions.jsonl \
--output outputs/demo/filtered-top5.jsonl
uv run ragsieve qa \
--input outputs/demo/filtered-top5.jsonl \
--output outputs/demo/qa-records.jsonl \
--summary outputs/demo/qa-summary.json \
--env-file .env
RSQは4つの証拠源を組み合わせます:回答アンカーの集中度、書記体系の完全性、ローカル言語モデルのサプライザル、およびクエリアラインメントの遷移。CLIデフォルトのすべての設定は論文の設定です。
RSGは文書テキストとRAGインデックスによって既に維持されているベクトルを消費します:
uv run ragsieve detect-graph \
--documents data/demo/corpus.jsonl \
--embeddings data/indices/demo/bge-m3/embeddings.npy \
--output outputs/demo/rsg-predictions.jsonl \
--device cuda:0
uv run ragsieve evaluate-graph \
--predictions outputs/demo/rsg-predictions.jsonl \
--labels data/demo/labels.jsonl \
--output outputs/demo/rsg-metrics.json
RSGは正確なコサインtop-16グラフを構築し、意味的に近く語彙的に遠い隣接文書を保持し、各文書の密度上昇を自身の近傍フロアに対して測定し、経験的コーパステールと書記体系の完全性を組み合わせます。
共同デプロイメントは直列的です:RSGが最初に文書を除外し、次にRSQが新しい上位5件を生き残った6~20位と比較してスコアリングします。フラグが立てられた候補は削除され、コンテキストは生き残ったランキングから一度補充されます;置換文書は再スコアリングされません。bash run_demo.shの後、PR-Wの例は次のとおりです:
uv run ragsieve quarantine-contexts \
--contexts data/demo/contexts.jsonl \
--graph-predictions outputs/demo/rsg-predictions.jsonl \
--condition pr_w \
--output outputs/demo/serial-pr_w-contexts.jsonl
uv run ragsieve detect \
--input outputs/demo/serial-pr_w-contexts.jsonl \
--output outputs/demo/serial-pr_w-rsq.jsonl --device cuda:0
uv run ragsieve filter-contexts \
--contexts outputs/demo/serial-pr_w-contexts.jsonl \
--predictions outputs/demo/serial-pr_w-rsq.jsonl \
--output outputs/demo/joint-pr_w-top5.jsonl
uv run ragsieve qa \
--input outputs/demo/joint-pr_w-top5.jsonl \
--output outputs/demo/joint-pr_w-qa.jsonl \
--summary outputs/demo/joint-pr_w-qa-summary.json \
--env-file .env
RSG単独の場合は、元のコンテキストに対して--graph-predictionsと--conditionのみでfilter-contextsを実行します。CEM-Cの場合は、--condition ipi_cem_cと別の出力パスを使用します。--conditionは、評価される検索条件にRSGスキャンをバインドします;非ポイズンQAはクリーンコーパスの別のRSGスキャンを使用します。バンドルされたRSGスナップショットには両方のデモ攻撃が含まれています。完全コーパスとクリーンQAの手順はアーティファクトガイドにあります。
保存された証拠は、モデルを再度ロードすることなく公開されたアブレーションを実行するのに十分です:
uv run ragsieve ablate \
--predictions outputs/demo/rsq-predictions.jsonl \
--variant without-answer-anchor \
--output outputs/demo/rsq-without-answer-anchor.jsonl
uv run ragsieve evaluate \
--predictions outputs/demo/rsq-without-answer-anchor.jsonl \
--output outputs/demo/rsq-without-answer-anchor-metrics.json
uv run ragsieve ablate \
--predictions outputs/demo/rsg-predictions.jsonl \
--variant corpus-local-only \
--output outputs/demo/rsg-corpus-local-only.jsonl
uv run ragsieve evaluate-graph \
--predictions outputs/demo/rsg-corpus-local-only.jsonl \
--labels data/demo/labels.jsonl \
--output outputs/demo/rsg-corpus-local-only-metrics.json
RSQはwithout-script-integrity、without-surprisal、without-query-alignmentもサポートしています;RSGはscript-integrity-onlyもサポートしています。コーパスローカルアブレーションは、5%のアラート予算全体をグラフブランチに割り当てます。アブレーションされた予測は、同じフィルタリングおよびQAコマンドに渡すことができます。
uv run ragsieve benchmark --mode rsq \
--input data/demo/contexts.jsonl \
--output outputs/demo/rsq-cost.json --device cuda:0
uv run ragsieve benchmark --mode rsg \
--input data/demo/corpus.jsonl \
--embeddings data/indices/demo/bge-m3/embeddings.npy \
--output outputs/demo/rsg-cost.json --device cuda:0
測定はモデル/データのロード、検索、QAを除外します。モデルと埋め込みは常駐したままで、CUDA作業は各測定の周囲で同期されます。コマンドは平均、中央値、P95実行時間、スループット、ピークGPU割り当てを報告します。論文のコーパススキャンワークロードには完全なNQインデックスを使用してください;小さなデモは機能チェックです。ワークロードと環境の詳細はアーティファクトガイドにあります。
このリリースはRAGSieveのエントリとアブレーションを再現します;ベースラインのエントリは論文で引用された実装から取得されます。以下のマッピングは現在のプレプリントに従っています。
| 論文の結果 | アーティファクトパス |
|---|---|
| 表1と図C1: RSQ文書検出 | 9つの準備されたシステムに対してdetectしてからevaluate。 |
| 表C1: RSQ後のオンラインQA | 保持されたTop-5に対してfilter-contextsしてからqa。 |
| 表C2と図C2(a): RSQアブレーション | 上記の4つのleave-one-outバリアントを使用してablateしてからevaluate。 |
| 表2と図C1: RSG検出 | 各コーパススナップショットに対してdetect-graphしてからevaluate-graph。 |
| 表C4と図C2(b): RSGアブレーション | corpus-local-onlyまたはscript-integrity-onlyでablateしてからevaluate-graph。 |
| 表C3: RSG後のオフラインQA | filter-contexts --graph-predictions ... --condition ...してからqa。 |
| 図C3: 注入量 | クエリごとに1、3、5、または10文書でスナップショット準備し、同じ検出コマンドを実行。 |
| 表3と図C4: 直列デプロイメント | quarantine-contexts、生存者に対するdetect、filter-contexts、次にqa。 |
| 表B2/B3と図B1: システムごとの結果 | データセット/検索器ごとにコマンドを1回実行;セルごとのJSONメトリクスを保持。 |
| 表B4と図C5: 検出コスト | 指定されたワークロードでbenchmark --mode rsqまたはbenchmark --mode rsg。 |