Implementación de búsqueda híbrida semántica-léxica en RAG

En este artículo, aprenderá cómo implementar una estrategia de búsqueda híbrida para sistemas RAG combinando la búsqueda léxica BM25 con la búsqueda semántica, fusionadas mediante Reciprocal Rank Fusion.

Los temas que cubriremos incluyen:

Por qué la búsqueda híbrida supera a la búsqueda léxica o semántica por sí sola en sistemas de generación de recuperación aumentada. Cómo implementar la búsqueda léxica BM25 y la búsqueda semántica de vectores densos como motores de recuperación independientes en Python. Cómo fusionar ambas clasificaciones utilizando Reciprocal Rank Fusion (RRF) para producir un resultado de recuperación final y equilibrado.

Vayamos directo a ello.

Implementación de búsqueda híbrida semántica-léxica en RAG

Introducción

La implementación de estrategias de búsqueda híbrida es un paso fundamental en la construcción de sistemas RAG (generación aumentada de recuperación) modernos, especialmente cuando se pasa de soluciones prototipo a soluciones listas para producción.

Hay pocos argumentos en contra de que la búsqueda semántica, impulsada por vectores densos o incrustaciones, que son representaciones numéricas de texto, sea increíblemente útil para comprender la semántica, los sinónimos y el contexto. Sin embargo, la búsqueda léxica basada en palabras clave con enfoques como BM25 cubre un pequeño punto ciego descuidado por la búsqueda semántica. Por lo tanto, combinar lo mejor de ambos mundos es la receta perfecta para llevar el mecanismo de recuperación de su sistema RAG un paso más allá.

Exploremos cómo implementar una estrategia de búsqueda híbrida a través de un ejemplo de codificación sencillo, que lo guiará en cada paso del proceso.

Nota: Si no está familiarizado con los sistemas RAG, es posible que la serie de artículos “Comprensión de RAG” le resulte muy útil para aprovechar al máximo esta lectura. En particular, recomiendo adquirir conocimientos sobre las bases de datos vectoriales primero a través de este artículo.

Implementación paso a paso

El primer paso es asegurarse de que estén instaladas todas las bibliotecas externas de Python necesarias, en particular estas tres:

rank_bm25: una implementación del algoritmo de búsqueda léxica BM25 para la recuperación de información (BM significa "Best Matching"). Transformadores de oraciones: proporciona modelos de lenguaje previamente entrenados para generar incrustaciones de texto. En un entorno real, es posible que ya tenga su propia base de datos de vectores que contenga muchos documentos incrustados y no la necesite, pero la usaremos aquí para simular la construcción de una base de datos de vectores de juguetes e ilustrar la búsqueda híbrida en ella. solicitudes: se utiliza para recuperar el paquete del conjunto de datos sin procesar de un repositorio público de conjuntos de datos de GitHub preparado para este ejemplo.

Con estos ingredientes a mano, comenzamos cargando el conjunto de datos y almacenando los textos sin formato en una lista (lo hacemos porque es un conjunto de datos pequeño).

El proceso de búsqueda híbrida se divide en tres etapas: dos de ellas se desarrollan en paralelo o de forma independiente entre sí. El tercero es donde ocurre la fusión de ambos enfoques, utilizando un método de fusión llamado Fusión de Rango Recíproco (RRF).

Primero cubramos la búsqueda léxica con BM25:

El proceso de búsqueda léxica se ha encapsulado en una función llamada search_bm25(). Esta función toma dos argumentos de entrada: una cadena que contiene la consulta del usuario al sistema RAG y el número de resultados principales a recuperar. La biblioteca rank_bm25 proporciona un método get_scores() que calcula, para cada documento (tratado como una colección de tokens), una puntuación de relevancia léxica. Luego clasificamos los documentos según su puntuación decreciente, seleccionamos el top-k y los devolvemos.

Mientras tanto, el motor de búsqueda semántica primero utiliza un modelo de transformador de oraciones para obtener vectores de incrustación para los textos y la consulta del usuario, luego aplica una métrica de similitud de vectores como la similitud de coseno para clasificar los textos por relevancia semántica y recuperar el k más relevante:

Es hora de ponerlo todo junto. Las dos puntuaciones calculadas para cada documento no pueden simplemente sumarse, porque operan en escalas numéricas muy diferentes. En lugar de ello, realizamos la fusión en función de rangos en lugar de puntuaciones brutas de similitud o relevancia. Para ello, RRF es el estándar de oro de la industria para fusionar información de clasificación: calcula una clasificación general para cada documento recompensando a aquellos que aparecen en posiciones altas en ambas listas. La lógica subyacente es algo similar a la del operador de media armónica en estadística.

El proceso general de búsqueda híbrida se implementa de la siguiente manera:

Ahora es el momento de probarlo todo. Formulemos una consulta de usuario y veamos qué resultados obtenemos.

Los resultados no son excelentes en comparación con un sistema RAG de producción, pero tenga en cuenta que lo probamos en un pequeño conjunto de datos de nueve documentos. En ese contexto, el resultado es bastante razonable.

Prueba a modificar la consulta y sustituirla por otras relacionadas con templos, playas, montañas o cualquier otra cosa que se te ocurra al pensar en destinos orientales. ¿Puede encontrar un escenario en el que tanto los resultados semánticos como los resultados del BM25 sean muy consistentes entre sí?

Concluyendo

Este artículo lo guió en la implementación de un mecanismo de búsqueda híbrido para la etapa de recuperación de los sistemas RAG. Elegir no depender únicamente de la búsqueda semántica es una consideración importante al escalar las soluciones RAG a entornos de producción.