Al construir un pipeline de RAG, rápidamente descubrirás que la búsqueda semántica por sí sola no siempre devuelve los mejores resultados. A veces necesitas coincidencias exactas de términos que la búsqueda semántica podría pasar por alto. La solución es combinar la búsqueda semántica con la búsqueda léxica usando una técnica llamada BM25.
El problema de la búsqueda semántica por sí sola
Supongamos que estás buscando un ID de incidente específico como "INC-2023-Q4-011" en un documento. Aunque este término exacto aparece varias veces en secciones relevantes, la búsqueda semántica podría devolver secciones no relacionadas que son semánticamente similares pero que en realidad no contienen el término específico que estás buscando.

Esto sucede porque la búsqueda semántica se enfoca en el significado en lugar de las coincidencias exactas. Cuando necesitas una coincidencia precisa de términos, necesitas un enfoque diferente.
Estrategia de búsqueda híbrida
La solución es ejecutar dos búsquedas en paralelo y combinar los resultados:

- Búsqueda semántica - Usa embeddings y bases de datos vectoriales para la coincidencia basada en significado
- Búsqueda léxica - Usa búsqueda de texto clásica para la coincidencia exacta de términos
- Combinar resultados - Combina ambos conjuntos de resultados para una mejor cobertura
Cómo funciona BM25
BM25 (Best Match 25) es un algoritmo popular para la búsqueda léxica en pipelines de RAG. Así es como procesa una consulta de búsqueda:

El algoritmo sigue estos pasos clave:
- Tokenizar la consulta - Divide la pregunta del usuario en términos individuales
- Contar la frecuencia de términos - Observa con qué frecuencia aparece cada término en todos los documentos
- Ponderar términos por rareza - Los términos usados con menos frecuencia obtienen puntuaciones de importancia más altas
- Encontrar las mejores coincidencias - Devuelve fragmentos que contienen más instancias de los términos con mayor ponderación
La idea clave es que los términos raros como "INC-2023-Q4-011" son mucho más importantes para la búsqueda que palabras comunes como "un" o "el".
Implementando la búsqueda BM25
Así es como se configura un sistema de búsqueda BM25:
# Create a BM25 store
store = BM25Index()
# Add documents to the store
for chunk in chunks:
store.add_document({"content": chunk})
# Search the store
results = store.search("What happened with INC-2023-Q4-011?", 3)La implementación de BM25 proporciona la misma API que tu sistema de búsqueda semántica: ambos tienen métodos add_document() y search(), lo que facilita usarlos juntos.
Mejores resultados de búsqueda
Cuando ejecutas la misma consulta a través de BM25 que falló con la búsqueda semántica por sí sola, obtienes resultados mucho mejores. En lugar de devolver secciones irrelevantes, BM25 prioriza las secciones que realmente contienen tus términos de búsqueda específicos.
El algoritmo identifica correctamente que "INC-2023-Q4-011" es un término raro e importante, y clasifica los documentos que lo contienen mucho más alto que los documentos que solo tienen palabras comunes de la consulta.
Próximos pasos
Ahora que tienes sistemas de búsqueda semántica y léxica funcionando de forma independiente, el siguiente paso es combinar sus resultados. Este enfoque híbrido te da lo mejor de ambos mundos: la comprensión contextual de la búsqueda semántica combinada con la precisión de la coincidencia exacta de términos de la búsqueda léxica.

Ambos sistemas de búsqueda usan APIs similares, lo que facilita consultar ambos en paralelo y combinar sus resultados en un único conjunto de resultados más completo.