# rag-sanitizer v0.2: escáner de corpus RAG pre-ingestión con embeddings reales y CLIP

> Source: <https://dev.to/magopredator/rag-sanitizer-v02-escaner-de-corpus-rag-pre-ingestion-con-embeddings-reales-y-clip-3jo4>
> Published: 2026-08-28 19:21:34+00:00

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`

).

```
# install
pip install -e '.[real-embeddings,multimodal]'

# fast suite (Dummy + heurístico, sin descargar modelos)
rag-sanitizer fixtures/corpus.jsonl --embedder dummy

# batería real
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.*
