Detecta documentos poison en un corpus RAG
antesdel chunk+embed, no después de la recuperación. v0.2 añade embeddings reales (MiniLM) y detección multimodal (CLIP).
La mayoría de la defensa contra envenenamiento de RAG opera post-retrieval o en inferencia. Pero el corpus se puede envenar antes de la ingesta: un documento insertado con texto que imita el estilo del corpus (semantic mimicry), sustituye entidades conocidas (entity-swap), o lleva una imagen cuyo contenido contradice el texto (visual poison). Una vez embebido, el daño ya está en el vector store.
rag-sanitizer
cubre ese tramo: un escáner determinista y barato que marca o pone en cuarentena el corpus antes de chunk + embed
.
Tres detectores, combinables:
k·sigma
.Madrid → Beijing
).
pip install -e '.[real-embeddings,multimodal]'
rag-sanitizer fixtures/corpus.jsonl --embedder dummy
rag-sanitizer fixtures/corpus.jsonl --embedder real --multimodal clip
El reporte es por documento: CLEAN
/ SUSPECT
/ POISON
, con las razones. La salida va por --out
(.json
o .md
); el corpus es un dir, un .jsonl
, o un .txt
/.md
.
real_embeddings
(MiniLM + CLIP, contra sentence-transformers
/torch
): real_embeddings
se saltan). ruff check
y ruff format --check
limpios; bandit
0 issues.revision
pinneada (commit 3d74acf9...
de openai/clip-vit-base-patch32
), así la mitigación de B615 es el pin, no un #nosec
.Documentado en KNOWN_ISSUES.md
, no oculto:
n >= 10
documentos de confianza; con menos, el veredicto lleva low_confidence
y el scanner lo señala en ScanReport.warnings
en vez de emitir un veredicto silencioso.El ciclo siguió implementa → audita en clone limpio → corrige → re-audita → aprueba → merge. En la auditoría independiente (Claude, sobre SHA 22db1fb
) apareció un bug real: tras corregir sigmoid(logit)
(que saturaba a 1.0 para todos los pares) por coseno escalado por temperatura en clip_embedder.py
, el umbral de ClipMultimodalDetector se había quedado en 0.5 y con la nueva escala (match ~0.27–0.32, mismatch ~0.16–0.24) habría marcado SUSPECT prácticamente cualquier imagen. Se recalibró a 0.25, se añadió el test de caso positivo que faltaba, y se reverificó. Ese es el valor de la auditoría externa: atrapa lo que el self-report no ve.
| Componente | Uso |
|---|---|
| Typer | CLI |
| sentence-transformers (MiniLM) | embeddings reales |
| transformers + torch | CLIP |
| ruff + bandit | calidad y SAST |
Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez.