Sistema RAG

Fusiono BM25 y búsqueda vectorial en vez de elegir uno.

Trabajo
Búsqueda híbrida sobre un catálogo de precios
Rol
Diseño de la arquitectura y construcción
Periodo
2025 — 2026
  • Búsqueda híbrida
  • RAG
  • MCP
  • FastAPI
El encargo

Un catálogo de 73 productos con 537 fechas y 37,893 filas de precios, y un equipo que preguntaba por él en lenguaje natural. La búsqueda por palabra clave fallaba en cuanto la consulta mezclaba un producto con un periodo. Diseñé y construí el sistema completo: indexación, recuperación, evaluación y la superficie por la que se consume.

La búsqueda por palabra clave fallaba en las consultas que mezclaban producto y periodo, y la puramente vectorial perdía los códigos exactos. Fusiono las dos con Reciprocal Rank Fusion y evalúo el resultado contra un gold set de 32 casos que redacté yo, de los que 29 puntúan para recall.

El sistema expone 8 herramientas por un servidor MCP y 13 rutas por FastAPI, sobre un dominio de 73 productos, 537 fechas y 37,893 filas de precios.

Este sistema no es el buscador de esta página. El de aquí lo escribí para este sitio y es mucho más chico: 39 pasajes contra 9,281 fragmentos, y sin piso determinista. Ya tiene gold set propio, de 26 preguntas, y sus cifras están más abajo en la portada. PrecioVivo corre sobre un catálogo de precios, no sobre mi CV.

1.00recall@10 29 de 29 casos perfectos, con el embebedor real jina-embeddings-v3 a 256 dimensiones. El piso determinista solo, sin búsqueda, ya alcanza 1.00: este número no es mérito de la fusión
0.816MRR El mismo gold set, granularidad semanal. El grano mensual da 0.955 y se descartó igual, porque promedia 29 días de evidencia contra 5
9,281fragmentos 73 productos, 537 fechas, 37,893 filas
chunk_8434 chunk_8440 chunk_8433
LA PREGUNTAprecio de P-065 en marzoBM25palabras exactasVECTORIALsignificadoRRFfusiona los dos1P-070·marzo2P-067·marzo3P-066·marzo4P-065·marzo5P-004·marzo6P-006·marzo1P-065·marzo2P-065·083P-065·104P-065·septiembre5P-065·junio6P-065·111P-065·marzo2P-070·marzo3P-066·marzo4P-067·marzo5P-065·086P-065·104.º → 1.ºclaro = coincide con la pregunta, gris = no coincide
LA PREGUNTAprecio de P-065 en marzoBM25palabrasVECTORsignificadoRRFfusion1070·mar2067·mar3066·mar4065·mar5004·mar1065·mar2065·083065·104065·sep5065·jun1065·mar2070·mar3066·mar4067·mar5065·084.º → 1.ºclaro coincide, gris no
El índice, visto de cerca. 667 de 9,281 fragmentos, proyectados con t-SNE. Los tres marcados son los vecinos más cercanos por coseno de una consulta real.BM25 acierta el mes y falla el producto. La vectorial acierta el producto y falla el mes. De sus 6 primeros comparten 1: P-065 · marzo, la respuesta. Por eso RRF la deja 1.º, cuando era 4.º para una y 1.º para la otra.
Dónde se rompe

Papaya devuelve papa, y no lo arreglé en recuperación

Preguntar por un producto que no está en el catálogo devuelve el más parecido por nombre. Papaya puntúa 0.6444 y papa 0.6656: dos centésimas. Probé el umbral obvio y no funciona, porque cualquier corte que las separe mata las preguntas agregadas, que puntúan 0.5151. Lo resolví avisando al modelo desde el filtro léxico, que ya sabía que ninguna palabra coincidía con el catálogo. La evaluación sigue reportando las dos violaciones: no relajé el gold set.

El recall@10 vale dentro del dominio indexado

El gold set son 32 casos que redacté yo sobre 73 productos y 537 fechas. Es una muestra pequeña y de autor único: sirve para detectar regresiones, no para afirmar que el sistema generaliza.