Cómo mejorar el rendimiento de su canalización RAG
Con la creciente popularidad de las aplicaciones de Generación Aumentada de Recuperación(RAG), hay una preocupación cada vez mayor por mejorar su rendimiento. Este artículo presenta todas las formas posibles de optimizar las canalizaciones RAG y proporciona las ilustraciones correspondientes para ayudarle a comprender rápidamente las principales estrategias de optimización RAG.
Es importante señalar que sólo proporcionaremos una exploración de alto nivel de estas estrategias y técnicas, centrándonos en cómo se integran en un sistema RAG. Sin embargo, no profundizaremos en detalles intrincados ni le guiaremos a través de la implementación paso a paso.
Un proceso estándar de GAR
El siguiente diagrama muestra el proceso RAG estándar más sencillo. En primer lugar, los trozos de documentos se cargan en un almacén de vectores (como Milvus o Zilliz Cloud). A continuación, el almacén de vectores recupera los K trozos más relevantes relacionados con la consulta. A continuación, estos fragmentos relevantes se inyectan en la consulta contextual del LLM y, por último, el LLM devuelve la respuesta final.
Distintos tipos de técnicas de mejora de la GAR
Podemos clasificar los distintos enfoques de mejora de la GAR en función de su función en las etapas del proceso de la GAR.
- Mejora de la consulta: Modificación y manipulación del proceso de consulta de la entrada RAG para expresar o procesar mejor la intención de la consulta.
- Mejora de la indexación: Optimización de la creación de índices de fragmentación mediante técnicas como la fragmentación múltiple, la indexación por pasos o la indexación multidireccional.
- Mejora del recuperador: Aplicación de técnicas y estrategias de optimización durante el proceso de recuperación.
- Mejora del generador: Ajuste y optimización de las instrucciones al ensamblarlas para que el LLM proporcione mejores respuestas.
- Mejora del conducto RAG: Cambiar dinámicamente los procesos dentro de todo el canal de la GAR, incluyendo el uso de agentes o herramientas para optimizar los pasos clave del canal de la GAR.
A continuación, presentaremos métodos específicos para cada una de estas categorías.
Mejora de las consultas
Exploremos cuatro métodos eficaces para mejorar la experiencia de consulta: Preguntas hipotéticas, incrustación de documentos hipotéticos, subconsultas e instrucciones de retroceso.
Creación de preguntas hipotéticas
La creación de preguntas hipotéticas implica la utilización de un LLM para generar múltiples preguntas que los usuarios podrían formular sobre el contenido de cada fragmento de documento. Antes de que la consulta real del usuario llegue al LLM, el almacén de vectores recupera las preguntas hipotéticas más relevantes relacionadas con la consulta real, junto con sus trozos de documentos correspondientes, y las reenvía al LLM.
Esta metodología evita el problema de la asimetría entre dominios en el proceso de búsqueda vectorial, ya que realiza directamente búsquedas de consulta a consulta, lo que alivia la carga de las búsquedas vectoriales. Sin embargo, introduce una sobrecarga e incertidumbre adicionales en la generación de preguntas hipotéticas.
HyDE (incrustación de documentos hipotéticos)
HyDE son las siglas de Hypothetical Document Embeddings. Aprovecha un LLM para elaborar un "documento hipotético" o una respuesta falsa en respuesta a una consulta del usuario desprovista de información contextual. A continuación, esta respuesta falsa se convierte en incrustaciones vectoriales y se emplea para consultar los trozos de documentos más relevantes dentro de una base de datos vectorial. Posteriormente, la base de datos vectorial recupera los K trozos de documentos más relevantes y los transmite al LLM y a la consulta original del usuario para generar la respuesta final.
Este método es similar a la técnica de la pregunta hipotética a la hora de abordar la asimetría entre dominios en las búsquedas vectoriales. Sin embargo, también presenta inconvenientes, como los costes computacionales añadidos y la incertidumbre de generar respuestas falsas.
Para más información, consulte el documento HyDE.
Creación de subconsultas
Cuando una consulta de usuario es demasiado complicada, podemos utilizar un LLM para descomponerla en subconsultas más sencillas antes de pasarlas a la base de datos vectorial y al LLM. Veamos un ejemplo.
Imaginemos que un usuario pregunta: "¿Cuáles son las diferencias de características entre Milvus y Zilliz Cloud?" Esta pregunta es bastante compleja y puede que no tenga una respuesta directa en nuestra base de conocimientos. Para abordar esta cuestión, podemos dividirla en dos subconsultas más sencillas:
- Subconsulta 1: "¿Cuáles son las características de Milvus?"
- Subconsulta 2: "¿Cuáles son las características de Zilliz Cloud?"
Una vez que tenemos estas subconsultas, las enviamos todas a la base de datos vectorial después de convertirlas en incrustaciones vectoriales. A continuación, la base de datos vectorial encuentra los trozos de documentos Top-K más relevantes para cada subconsulta. Por último, el LLM utiliza esta información para generar una respuesta mejor.
Al dividir la consulta del usuario en subconsultas, facilitamos a nuestro sistema la búsqueda de información relevante y la obtención de respuestas precisas, incluso para preguntas complejas.
Creación de subpreguntas
Otra forma de simplificar las consultas complejas de los usuarios es crear mensajes de retroceso. Esta técnica consiste en abstraer las consultas complicadas de los usuarios en "preguntas paso a paso"** mediante un LLM. A continuación, una base de datos vectorial utiliza estas preguntas retrospectivas para recuperar los fragmentos de documentos más relevantes. Por último, el LLM genera una respuesta más precisa a partir de los documentos recuperados.
Ilustremos esta técnica con un ejemplo. Consideremos la siguiente consulta, que es bastante compleja y cuya respuesta directa no es sencilla:
Consulta original del usuario: "Tengo un conjunto de datos con 10.000 millones de registros y quiero almacenarlo en Milvus para consultarlo. ¿Es posible?"
Para simplificar esta consulta de usuario, podemos utilizar un LLM para generar una pregunta paso a paso más directa:
Pregunta paso a paso: "¿Cuál es el límite de tamaño del conjunto de datos que puede manejar Milvus?".
Este método puede ayudarnos a obtener respuestas mejores y más precisas a consultas complejas. Descompone la pregunta original en una forma más sencilla, lo que facilita a nuestro sistema la búsqueda de información relevante y la obtención de respuestas precisas.
Mejora de la indexación
Mejorar la indexación es otra estrategia para mejorar el rendimiento de sus aplicaciones RAG. Exploremos tres técnicas de mejora de la indexación.
Fusión automática de fragmentos de documentos
Al crear un índice, podemos emplear dos niveles de granularidad: los fragmentos hijos y sus correspondientes fragmentos padres. Inicialmente, buscamos los fragmentos hijos a un nivel de detalle más fino. A continuación, aplicamos una estrategia de fusión: si un número determinado, n, de trozos hijos de los primeros k trozos hijos pertenecen al mismo trozo padre, proporcionamos este trozo padre al LLM como información contextual.
Esta metodología se ha implementado en LlamaIndex.
Construcción de índices jerárquicos
Al crear índices para documentos, podemos establecer un índice de dos niveles: uno para los resúmenes de documentos y otro para los trozos de documentos. El proceso de búsqueda vectorial consta de dos etapas: inicialmente, filtramos los documentos relevantes basándonos en el resumen y, posteriormente, recuperamos los trozos de documentos correspondientes exclusivamente dentro de estos documentos relevantes.
Este enfoque resulta beneficioso en situaciones que implican grandes volúmenes de datos o casos en los que los datos son jerárquicos, como la recuperación de contenidos dentro de una colección de biblioteca.
Recuperación y reordenación híbridas
La técnica Hybrid Retrieval and Reranking integra uno o varios métodos de recuperación complementarios con la recuperación por similitud vectorial. A continuación, un reordenador clasifica los resultados obtenidos en función de su relevancia para la consulta del usuario.
Entre los algoritmos de recuperación complementaria más habituales se encuentran los basados en frecuencias léxicas, como BM25, o los grandes modelos que utilizan incrustaciones dispersas, como Splade. Los algoritmos de reordenación incluyen RRF o modelos más sofisticados como Cross-Encoder, que se asemeja a arquitecturas tipo BERT.
Este enfoque aprovecha diversos métodos de recuperación para mejorar la calidad de la recuperación y abordar posibles lagunas en la recuperación de vectores.
Mejora del recuperador
El perfeccionamiento del componente recuperador dentro del sistema GAR también puede mejorar las aplicaciones GAR. Veamos algunos métodos eficaces para mejorar el recuperador.
Recuperación de la ventana de frases
En un sistema GAR básico, el fragmento de documento que se entrega al LLM es una ventana más grande que abarca el fragmento de incrustación recuperado. Esto garantiza que la información proporcionada al LLM incluya una gama más amplia de detalles contextuales, minimizando la pérdida de información. La técnica Sentence Window Retrieval desvincula el fragmento de documento utilizado para la recuperación de la incrustación del fragmento proporcionado al LLM.
Sin embargo, ampliar el tamaño de la ventana puede introducir información adicional que interfiera. Podemos ajustar el tamaño de la ampliación de la ventana en función de las necesidades específicas de la empresa.
Filtrado de metadatos
Para garantizar respuestas más precisas, podemos refinar los documentos recuperados filtrando metadatos como la hora y la categoría antes de pasarlos al LLM. Por ejemplo, si se recuperan informes financieros que abarcan varios años, el filtrado basado en el año deseado refinará la información para satisfacer requisitos específicos. Este método resulta eficaz en situaciones con datos extensos y metadatos detallados, como la recuperación de contenidos en colecciones de bibliotecas.
Mejora del generador
Exploremos más técnicas de optimización de la RAG mejorando el generador dentro de un sistema RAG.
Compresión del mensaje LLM
La información de ruido en los fragmentos de documentos recuperados puede afectar significativamente a la precisión de la respuesta final de la GAR. Además, la limitada ventana de consulta de los LLM supone un obstáculo para obtener respuestas más precisas. Para hacer frente a este reto, podemos comprimir los detalles irrelevantes, enfatizar los párrafos clave y reducir la longitud total del contexto de los fragmentos de documentos recuperados.
Este planteamiento es similar al método híbrido de recuperación y reordenación anteriormente descrito, en el que se utiliza un reordenador para filtrar los fragmentos de documentos irrelevantes.
Ajustar el orden de los trozos en la solicitud
En el artículo "Lost in the middle", los investigadores observaron que, durante el proceso de razonamiento, los LLM suelen pasar por alto la información que se encuentra en medio de los documentos. En su lugar, tienden a confiar más en la información presentada al principio y al final de los documentos.
Basándonos en esta observación, podemos ajustar el orden de los fragmentos recuperados para mejorar la calidad de la respuesta: cuando se recuperan múltiples fragmentos de conocimiento, los fragmentos con una confianza relativamente baja se colocan en el centro, y los fragmentos con una confianza relativamente alta se sitúan en ambos extremos.
Mejora de la canalización RAG
También podemos mejorar el rendimiento de sus aplicaciones RAG mejorando todo el proceso RAG.
Autorreflexión
Este enfoque incorpora el concepto de autorreflexión dentro de los agentes de IA. Entonces, ¿cómo funciona esta técnica?
Algunos trozos de documentos Top-K recuperados inicialmente son ambiguos y pueden no responder directamente a la pregunta del usuario. En tales casos, podemos llevar a cabo una segunda ronda de reflexión para verificar si estos trozos pueden responder realmente a la consulta.
Podemos llevar a cabo la reflexión utilizando métodos de reflexión eficaces como los modelos de Inferencia del Lenguaje Natural (NLI) o herramientas adicionales como las búsquedas en Internet para la verificación.
Este concepto de autorreflexión se ha explorado en varios artículos o proyectos, como Self-RAG, Corrective RAG, LangGraph, etc.
Enrutamiento de consultas con un agente
A veces, no necesitamos utilizar un sistema RAG para responder a preguntas sencillas, ya que podría dar lugar a más malentendidos e inferencias a partir de información engañosa. En tales casos, podemos utilizar un agente como enrutador en la fase de consulta. Este agente evalúa si es necesario que la consulta pase por la canalización RAG. En caso afirmativo, se inicia el subsiguiente proceso RAG; de lo contrario, el LLM responde directamente a la consulta.
El agente puede adoptar diversas formas, como un LLM, un pequeño modelo de clasificación o incluso un conjunto de reglas.
Al enrutar las consultas en función de la intención del usuario, se puede redirigir una parte de las consultas, lo que supone un aumento significativo del tiempo de respuesta y una notable reducción del ruido innecesario.
Podemos extender la técnica de enrutamiento de consultas a otros procesos dentro del sistema GAR, como determinar cuándo utilizar herramientas como las búsquedas web, realizar subconsultas o buscar imágenes. Este planteamiento garantiza la optimización de cada paso del sistema GAR en función de los requisitos específicos de la consulta, lo que conduce a una recuperación de la información más eficaz y precisa.
Resumen
Aunque una canalización RAG sencilla puede parecer simple, para lograr un rendimiento empresarial óptimo a menudo se requieren técnicas de optimización más sofisticadas.
Este artículo resume varios enfoques populares para mejorar el rendimiento de sus aplicaciones RAG. También proporcionamos ilustraciones claras para ayudarle a comprender rápidamente estos conceptos y técnicas y agilizar su implementación y optimización.
Puede obtener las implementaciones sencillas de los principales enfoques enumerados en este artículo en este enlace de GitHub.