DEV Community

Cover image for embedwatch v0.1: mide si filtrar tus embeddings equivale a filtrar tus documentos
Fenix
Fenix

Posted on

embedwatch v0.1: mide si filtrar tus embeddings equivale a filtrar tus documentos

Tus vectores de embeddings no son "solo números". Un paper de 2025 demuestra que se pueden traducir de un modelo a otro sin el texto original, y desde ahí inferir de qué tratan tus documentos. Si operas un RAG o un buscador semántico, filtrar tu base vectorial puede equivaler a filtrar tu contenido. embedwatch v0.1 convierte esa amenaza en una medición repetible.

El problema en una frase

Los dumps de embeddings se tratan como datos no sensibles porque "son solo vectores". Jha et al. (2025) muestran que distintos espacios de embeddings comparten una geometría universal que permite traducir vectores entre modelos y, desde el espacio traducido, inferir atributos del texto original. Sin medir contra modelos concretos, no puedes cuantificar tu exposición.

Qué hace embedwatch

Dado un dump local de vectores (.npy o .json, sin texto), lo audita contra modelos de referencia conocidos:

embedwatch candidates
embedwatch audit dump.npy --candidates e5,gte --cal-dir ./cals
Enter fullscreen mode Exit fullscreen mode

Por cada candidato devuelve cosine similarity media, top-1 accuracy y mean rank (las métricas del paper), más un score de riesgo BAJO/MEDIO/ALTO en JSON. Sale con exit 0 (sin ALTO), 1 (hay ALTO) o 2 (error de input).

Cómo funciona, sin humo

Un MLP supervisado de 2 capas (numpy desde cero, sin torch en runtime) aprende a traducir del espacio desconocido al espacio candidato usando pares alineados, y se evalúa en un split disjunto. A propósito no usamos el GAN del paper: su entrenamiento es inestable y un MVP debe ser determinista (mismo dump, mismo reporte, sha256 idéntico).

Resultados verificados, no prometidos

  • 46 tests en verde, ruff limpio, cobertura 94.7%, CI en GitHub en verde.
  • Prueba con modelos reales (e5-small-v2 contra gte-small, ambos MIT): cosine 0.898, top-1 0.925, score 0.911 = ALTO. El enfoque funciona fuera de los fixtures.
  • Tres bugs reales los encontró el proceso, no el self-report: un default subentrenado, un tripwire que solo miraba archivos tracked, y un tripwire que colisionaba con prosa legítima. Todos corregidos con evidencia.

Lo que NO es (honestidad metodológica)

  • No es un oráculo universal: solo mide fuga contra los candidatos que configures.
  • No recupera tu texto original; estima riesgo de inferencia de atributos.
  • El score es una cota inferior: un atacante con el traductor completo del paper traduce mejor que nuestro MLP. Un BAJO no certifica seguridad, y el reporte lo dice en cada salida.

Pruébalo

Repo (AGPL-3.0-or-later): https://github.com/amurlaniakea/embedwatch/tree/feat/embedwatch-001-mvp

pip install -e ".[dev]"
python -m pytest tests/ -v
Enter fullscreen mode Exit fullscreen mode

Paper fundacional: Jha et al. (2025) — Harnessing the Universal Geometry of Embeddings. Reimplementación independiente desde el paper; cero código de terceros sin licencia.


Licencia: AGPL-3.0-or-later — Pedro Sordo Martínez

Top comments (0)