<!-- Canonical: https://lucioduran.com/es/projects/bilingual-retrieval-evals
Language: es
Content-SHA256: d6af5bae4d1d1fbbba6dc9034511c28d0d476acda23662a5dd1c63aa464c2b30
-->

[Proyectos](<https://lucioduran.com/es/projects>) / Bilingual Retrieval Evals

# Bilingual Retrieval Evals

Evaluación de recuperación EN/ES con BM25 y MiniLM multilingüe. Separa idiomas, direcciones, acentos y expresiones culturales, con rankings y evidencia reproducible.

Autor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 · Licencia: [MIT](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/LICENSE>)

Ficha publicada: 2026-10-22 · Ficha actualizada: 2026-10-22

[Repositorio](<https://github.com/lucioduran/bilingual-retrieval-evals>) · [Evidencia original](<https://raw.githubusercontent.com/lucioduran/bilingual-retrieval-evals/8cc64e903e89ef399db5c4648b23cee52038b83b/results/eval/report.json>) · [Release v0.1.0](<https://github.com/lucioduran/bilingual-retrieval-evals/releases/tag/v0.1.0>)

## Problema y utilidad para agentes

Un promedio de recuperación puede esconder que el buscador funciona en inglés y falla al cruzar idiomas. Traducir consultas tampoco elimina la ambigüedad cultural ni los distractores léxicos.

El proyecto expone qué documentos recupera cada método para consultas paralelas en español e inglés. Permite inspeccionar errores que un Recall@3 perfecto todavía puede ocultar.

## Arquitectura

1. **Corpus y juicios explícitos.** 32 documentos ficticios, 68 variantes de consulta y etiquetas por candidato con pasajes de apoyo. Las familias de desarrollo y evaluación permanecen separadas.
2. **Recuperación por dirección.** Cada consulta busca entre 16 documentos del idioma objetivo. Compara BM25, BM25 con normalización de acentos y un encoder MiniLM multilingüe fijado por revisión.
3. **Desgloses y replay.** Guarda vectores, rankings completos, métricas por grupo, contrastes pareados e intervalos por familia. El replay recalcula los resultados sin descargar el modelo.

- [Diseño y metodología](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/docs/methodology.md>)

## Qué demuestra

- Evaluación multilingüe que conserva denominadores y separa las cuatro direcciones de búsqueda.
- Diseño de consultas culturales, distractores y contrastes de acentos con trazabilidad de relevancia.
- Inspección de errores de ranking y de incertidumbre sin contar variantes correlacionadas como observaciones independientes.

## Resultados publicados

Medición local en Intel Xeon W-3223 con dos hilos. Las tablas principales usan 32 consultas originales de ocho familias de evaluación; excluyen las variantes sin acentos para no dar más peso al español.

Cutoff 3, BM25 k1=1.2 y b=0.75, embeddings limitados a 128 tokens. El informe completo incluye 46 variantes de evaluación. Los intervalos usan 2.000 remuestreos por familia y un estimador distinto del promedio de consultas originales.

### Recuperación sobre 32 consultas originales

| Método | Recall@3 | NDCG@3 | MRR@3 |
| --- | --- | --- | --- |
| BM25 | 0.719 | 0.719 | 0.719 |
| BM25 sin acentos | 0.719 | 0.719 | 0.719 |
| Multilingual MiniLM | 1.000 | 0.977 | 0.969 |

### NDCG@3 por dirección

| Dirección | Consultas | BM25 | MiniLM |
| --- | --- | --- | --- |
| EN → EN | 8 | 1.000 | 1.000 |
| EN → ES | 8 | 0.625 | 0.954 |
| ES → EN | 8 | 0.375 | 0.954 |
| ES → ES | 8 | 0.875 | 1.000 |

MiniLM logró Recall@3 de 1,000, pero ubicó un distractor sobre el documento relevante en una consulta cultural y otra de paquetería. Encontrar el documento entre los tres primeros no equivale a ordenar correctamente.

Los intervalos por familia, las diferencias por entidades y los siete pares de acentos por idioma objetivo están publicados con sus denominadores. [Resumen de resultados](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/docs/results.md>).

## Reproducir

Python 3.11 o posterior. Validación y replay usan la biblioteca estándar. La medición neural necesita las dependencias fijadas y la descarga explícita del encoder público.

Los comandos usan una shell POSIX y directorios nuevos. Ejecutá una medición por vez. El lock corresponde al entorno Intel macOS medido; otros sistemas pueden necesitar una distribución compatible de PyTorch.

### Revisar la evidencia guardada

```
git clone https://github.com/lucioduran/bilingual-retrieval-evals.git
cd bilingual-retrieval-evals
git checkout 8cc64e903e89ef399db5c4648b23cee52038b83b
python -m bilingual_retrieval validate
python -m bilingual_retrieval verify --report results/dev/report.json
python -m bilingual_retrieval verify --report results/eval/report.json
```

### Repetir la medición local

```
python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements-local.lock
python -m bilingual_retrieval download
OMP_NUM_THREADS=2 MKL_NUM_THREADS=2 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 TOKENIZERS_PARALLELISM=false python -m bilingual_retrieval run --split dev --output build/dev
OMP_NUM_THREADS=2 MKL_NUM_THREADS=2 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 TOKENIZERS_PARALLELISM=false python -m bilingual_retrieval run --split eval --output build/eval
python -m bilingual_retrieval verify --report build/dev/report.json
python -m bilingual_retrieval verify --report build/eval/report.json
```

## Alcance y límites

- Corpus sintético conocido por el autor. Las etiquetas todavía no tienen revisión humana bilingüe independiente; no representan dialectos ni tráfico real.
- Ocho familias dan intervalos de incertidumbre débiles. Los grupos por entidad o idioma no son tratamientos causales.
- Los tiempos son una única pasada por lotes, no percentiles de latencia. El replay comprueba coherencia interna, no autenticidad de los embeddings o de las mediciones.

- [Búsqueda vectorial y evaluación multilingüe](<https://lucioduran.com/es/blog/vector-databases-pgvector-qdrant-pinecone>)

## Fuentes y revisión

Los valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.

- Revisión consultada: [` 8cc64e903e89ef399db5c4648b23cee52038b83b `](<https://github.com/lucioduran/bilingual-retrieval-evals/commit/8cc64e903e89ef399db5c4648b23cee52038b83b>)
- Revisión registrada por el experimento: [` d89585a8e53aa43a0fa8bc6fe50d43635172c5de `](<https://github.com/lucioduran/bilingual-retrieval-evals/commit/d89585a8e53aa43a0fa8bc6fe50d43635172c5de>)
- Fecha del informe (UTC): 2026-10-21T22:59:22.243350+00:00
- Release publicada: [v0.1.0](<https://github.com/lucioduran/bilingual-retrieval-evals/releases/tag/v0.1.0>) · 2026-10-21T23:04:15Z

- [README y uso](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/README.md>)
- [Evidencia original](<https://raw.githubusercontent.com/lucioduran/bilingual-retrieval-evals/8cc64e903e89ef399db5c4648b23cee52038b83b/results/eval/report.json>)
- [Resumen de resultados](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/docs/results.md>)
- [Diseño y metodología](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/docs/methodology.md>)
- [Datos y procedencia](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/data/README.md>)
- [Evidencia de desarrollo](<https://raw.githubusercontent.com/lucioduran/bilingual-retrieval-evals/8cc64e903e89ef399db5c4648b23cee52038b83b/results/dev/report.json>)
- [Análisis de errores](<https://raw.githubusercontent.com/lucioduran/bilingual-retrieval-evals/8cc64e903e89ef399db5c4648b23cee52038b83b/results/eval/errors.json>)
- [Modelos, revisiones y licencias](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/docs/model-notices.md>)
- [Dependencias del entorno medido](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/requirements-local.lock>)
- [Licencia MIT](<https://github.com/lucioduran/bilingual-retrieval-evals/blob/8cc64e903e89ef399db5c4648b23cee52038b83b/LICENSE>)
