
Самореферентный локальный контраст для обнаружения отравления знаний в генерации с дополнением на основе извлечения
Эталонная реализация для «RAGSieve: самореференсный локальный контраст для обнаружения отравления знаний в поисково-дополненной генерации».
RAGSieve обнаруживает документы с отравлением знаний в двух контрольных точках системы поисково-дополненной генерации (RAG). RAGSieve-Query (RSQ) — это онлайн-фильтр: он оценивает пять документов, отобранных для генерации, относительно позиций 6--20 для текущего запроса. RAGSieve-Graph (RSG) — это офлайн-сканер: он оценивает каждый документ корпуса относительно его собственного семантико-лексического окружения. Пакет содержит реализации, использованные в препринте, точный поиск по полному корпусу, фильтрацию и повторное заполнение Top-5, оценку на уровне документов и компактный запускаемый пример.
data/datasets/ NQ, HotpotQA, and MS MARCO text knowledge bases
data/demo/ four target queries and 20 example poison documents
docs/ schemas, prompts, and RAGSieve method diagrams
src/ragsieve/ RSQ, RSG, retrieval, filtering, and metrics
tests/ unit tests for the detector rules and data path
install.sh environment installation
data_preparation.sh local construction of the nine dense indices
run_demo.sh end-to-end RSQ and RSG functionality check
Три опубликованные базы знаний содержат 128,044 документов NQ, 9,961 документов HotpotQA и 8,239 пассажей MS MARCO. Они включают исходный текст, 1,000 сэмплированных запросов, qrels, целевые ответы и фиксированное подмножество атак на 100 запросов. Плотные векторы генерируются локально и никогда не являются частью репозитория.
Демо содержит по две реализации PR-W и CEM-C из NQ, по пять отравленных документов на каждый запрос. Эти атаки дают короткий и наглядный путь через оба детектора, не поставляя полную коллекцию атак или реализации генерации атак.
Рекомендуются Python 3.11 или 3.12, uv и GPU с поддержкой CUDA.
bash install.sh
При первом использовании детектор загружает модели Hugging Face, указанные в статье.
Для сквозного QA скопируйте общую конфигурацию, совместимую с OpenAI, и заполните три значения:
cp .env.example .env
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=your-model-name
OPENAI_API_KEY=your-api-key
Тот же endpoint и модель генерируют ответы и выполняют семантическую оценку ASR.
bash run_demo.sh
Эта команда строит локальный индекс BGE-M3 для снимка RSG из 520 документов, запускает RSQ на подготовленных контекстах поиска по полному корпусу, фильтрует и повторно заполняет Top-5 для генерации и оценивает оба детектора. Результаты записываются в outputs/demo/:
rsq-metrics.json: AUROC RSQ и обнаружение отравления при удалении 5% чистых документов;rsg-metrics.json: метрики RSG на снимке корпуса без запросов;filtered-top5.jsonl: пять документов, сохранённых для генерации после RSQ.На опубликованных примерах RSQ достигает 100% AUROC и 100% обнаружения отравления при удалении 5% чистых документов как для PR-W, так и для CEM-C. RSG достигает 100% AUROC и 100% обнаружения отравления при том же бюджете удаления чистых документов; его фиксированное правило удаляет 85% отравленных документов и 0% чистых. Эти значения являются проверкой работоспособности на подобранном демо, а не агрегированным результатом статьи.
Поля ground-truth читаются только командами оценки. Они не передаются в RSQ или RSG.
bash data_preparation.sh
По умолчанию строятся 3 набора данных x 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 выполняет точный поиск по полному корпусу один раз для каждого запроса, отдельно оценивает внедрённые документы и объединяет статические близости в топ-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 объединяет четыре источника свидетельств: концентрацию ответных якорей, целостность системы письма, локальную неожиданность языковой модели и переход согласования с запросом. Все настройки по умолчанию в 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 строит точный граф верхних 16 косинусных соседей, сохраняет семантически близких и лексически далёких соседей, измеряет рост плотности каждого документа над собственным базовым уровнем окружения и объединяет эмпирический хвост корпуса с целостностью системы письма.
Совместное развёртывание сначала сканирует корпус с помощью RSG, исключает идентификаторы карантинных документов из поиска, а затем применяет RSQ к полученному топ-20:
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 \
--exclude-predictions outputs/demo/rsg-predictions.jsonl \
--output outputs/demo/joint-contexts.jsonl \
--device cuda:0
uv run ragsieve detect \
--input outputs/demo/joint-contexts.jsonl \
--output outputs/demo/joint-rsq-predictions.jsonl \
--device cuda:0
Релиз воспроизводит результаты RAGSieve и абляции; опубликованные базовые результаты получены из реализаций, указанных в статье.
Рисунки 1 и 2 являются пояснительными схемами системы, а не сгенерированными графиками данных. Их SVG-исходники включены как docs/ragsieve-overview.svg и docs/ragsieve-method.svg. Подробные схемы и ожидаемый протокол оценки приведены в docs/ARTIFACT.md.
uv run pytest
uv run ruff check .
Модульные тесты не загружают веса моделей.
Реализация RAGSieve распространяется под лицензией MIT. Опубликованные наборы данных и веса моделей сохраняют свои исходные лицензии.
| Результат из статьи | Путь к артефакту |
|---|
| Таблица 1, обнаружение документов RSQ | detect, затем evaluate по девяти подготовленным системам. |
| Таблицы 2--3 и рисунок 4, онлайн-QA | filter-contexts с последующим qa на сохранённом Top-5. |
| Таблица 4 и рисунок 5A, абляция RSQ | Покомпонентные поля, записываемые detect. |
| Таблица 5, обнаружение документов RSG | detect-graph, затем evaluate-graph для каждого снимка корпуса. |
| Таблицы 6--7 и рисунок 5B, QA и абляция RSG | Покомпонентные поля RSG и его список карантинных документов. |
| Рисунок 6, объём инъекций | Повторите подготовку контекстов с 1, 3, 5 или 10 документами на запрос. |
| Таблица 8 и рисунок 7, совместное развёртывание | Исключение через RSG с последующим обнаружением RSQ и повторным заполнением Top-5. |
| Рисунок A1 в приложении и таблица A2 | Групповая оценка по выводимым полям dataset и encoder. |