10 formas de mejorar el rendimiento de los sistemas de generación mejorada de recuperación

10 formas para mejorar el rendimiento de los sistemas de generación mejorada de recuperación

Herramientas para pasar de prototipo a producción

La guía de inicio rápido no es suficiente

“La generación aumentada por recuperación es el proceso de complementar la entrada de un usuario a un gran modelo de lenguaje (LLM) como ChatGPT con información adicional que se ha recuperado de algún otro lugar. El LLM puede utilizar esa información para mejorar la respuesta que genera”. – Cory Zue

Los LLM son una invención asombrosa, pero tienen un problema clave. Se inventan cosas. RAG hace que los LLM sean mucho más útiles al proporcionarles contexto factual para usar al responder consultas.

Usando la guía de inicio rápido de un framework como LangChain o LlamaIndex, cualquier persona puede construir un sistema RAG simple, como un chatbot para su documentación, con aproximadamente cinco líneas de código.

Pero, el bot construido con esas cinco líneas de código no funcionará muy bien. RAG es fácil de prototipar, pero muy difícil de llevar a producción, es decir, llegar a un punto donde los usuarios estén satisfechos con él. Un tutorial básico puede hacer que RAG funcione al 80%. Pero superar el siguiente 20% a menudo requiere de experimentación seria. Aún no se han establecido las mejores prácticas y pueden variar según el caso de uso. Pero descubrir las mejores prácticas vale la pena, porque RAG es probablemente la forma más efectiva de utilizar los LLM.

Esta publicación estudiará estrategias para mejorar la calidad de los sistemas RAG. Está dirigida a aquellos que construyen con RAG y desean cerrar la brecha entre las configuraciones básicas y el rendimiento a nivel de producción. Para los propósitos de esta publicación, mejorar significa aumentar la proporción de consultas para las cuales el sistema: 1. Encuentra el contexto adecuado y 2. Genera una respuesta apropiada. Supondré que el lector ya tiene una comprensión de cómo funciona RAG. Si no es así, sugiero leer este artículo de Cory Zue para obtener una buena introducción. También asumirá cierta familiaridad básica con los frameworks comunes utilizados para construir estas herramientas: LangChain y LlamaIndex. Sin embargo, las ideas discutidas aquí no dependen del framework.

No entraré en los detalles de cómo implementar cada estrategia que cubro, sino que intentaré dar una idea de cuándo y por qué podría ser útil. Dado lo rápido que avanza el espacio, es imposible proporcionar una lista exhaustiva o perfectamente actualizada de las mejores prácticas. En cambio, mi objetivo es esbozar algunas cosas que podrías considerar y probar al intentar mejorar tu aplicación de generación aumentada por recuperación.

10 formas de mejorar el rendimiento de la generación aumentada por recuperación

1. Limpia tus datos.

RAG conecta las capacidades de un LLM a tus datos. Si tus datos son confusos, ya sea en contenido o en estructura, entonces tu sistema sufrirá. Si estás utilizando datos con información contradictoria o redundante, tu recuperación tendrá dificultades para encontrar el contexto adecuado. Y cuando lo haga, es posible que el paso de generación realizado por el LLM no sea óptimo. Supongamos que estás construyendo un chatbot para la documentación de tu startup y descubres que no funciona bien. Lo primero que debes revisar es los datos que estás introduciendo en el sistema. ¿Los temas se dividen de manera lógica? ¿Los temas se tratan en un solo lugar o en varios lugares separados? Si tú, como humano, no puedes determinar fácilmente qué documento necesitarías consultar para responder consultas comunes, tu sistema de recuperación tampoco podrá hacerlo.

Este proceso puede ser tan simple como combinar manualmente documentos sobre el mismo tema, pero también puedes ir más allá. Uno de los enfoques más creativos que he visto es utilizar el LLM para crear resúmenes de todos los documentos proporcionados como contexto. El paso de recuperación puede ejecutar primero una búsqueda en estos resúmenes y profundizar en los detalles solo cuando sea necesario. Incluso algunos frameworks tienen esto como una abstracción incorporada.

2. Explora diferentes tipos de índices.

El índice es el pilar fundamental de LlamaIndex y LangChain. Es el objeto que alberga tu sistema de recuperación. El enfoque estándar de RAG involucra embeddings y búsqueda de similitud. Divide los datos de contexto, incrusta todo, cuando llega una consulta, encuentra piezas similares del contexto. Esto funciona muy bien, pero no es el mejor enfoque para todos los casos de uso. ¿Las consultas se relacionan con elementos específicos, como productos en una tienda en línea? Es posible que desees explorar la búsqueda basada en palabras clave. No tiene que ser uno u otro, muchas aplicaciones utilizan un enfoque híbrido. Por ejemplo, puedes utilizar un índice basado en palabras clave para consultas relacionadas con un producto específico, pero confiar en las incrustaciones para el soporte general al cliente.

3. Experimenta con tu enfoque de fragmentación.

Fragmentar los datos de contexto es una parte fundamental para construir un sistema RAG. Los marcos de trabajo abstraen el proceso de fragmentación y te permiten evitar pensar en ello. Pero deberías considerarlo. El tamaño de los fragmentos importa. Deberías explorar qué funciona mejor para tu aplicación. En general, fragmentos más pequeños suelen mejorar la recuperación pero pueden hacer que la generación sufra por falta de contexto circundante. Hay muchas formas de enfocar la fragmentación. Lo único que no funciona es enfocarlo a ciegas. Esta publicación de PineCone presenta algunas estrategias a considerar. Tengo un conjunto de preguntas de prueba. Enfoqué esto ejecutando un experimento. Recorrí cada conjunto una vez con un tamaño de fragmento pequeño, VoAGI y grande, y encontré que el pequeño era el mejor.

4. Juega con tu promp base.

Un ejemplo de un promp base utilizado en LlamaIndex es:

‘La información de contexto está a continuación. Dada la información de contexto y sin conocimiento previo, responde a la consulta.’

Puedes sobrescribir esto y experimentar con otras opciones. Incluso puedes modificar el RAG para permitir que el LLM se base en su propio conocimiento si no puede encontrar una buena respuesta en el contexto. También puedes ajustar el promp para ayudar a dirigir los tipos de consultas que acepta, por ejemplo, indicándole que responda de cierta manera para preguntas subjetivas. Como mínimo, es útil sobrescribir el promp de manera que el LLM tenga contexto sobre las tareas que está realizando. Por ejemplo:

‘Eres un agente de soporte al cliente. Tu objetivo es ser lo más útil posible al proporcionar solo información factual. Debes ser amigable, pero no demasiado charlatán. La información de contexto está a continuación. Dada la información de contexto y sin conocimiento previo, responde a la consulta.’

5. Prueba el filtrado de metadatos.

Una estrategia muy efectiva para mejorar la recuperación es agregar metadatos a tus fragmentos y luego utilizarlos para procesar los resultados. La fecha es una etiqueta de metadatos común para agregar porque te permite filtrar por novedad. Imagina que estás construyendo una aplicación que permite a los usuarios consultar su historial de correo electrónico. Es probable que los correos más recientes sean más relevantes. Pero no sabemos si serán los más similares, desde el punto de vista de la incrustación, a la consulta del usuario. Esto plantea un concepto general a tener en cuenta al construir RAG: similar ≠ relevante. Puedes agregar la fecha de cada correo a sus metadatos y luego priorizar el contexto más reciente durante la recuperación. LlamaIndex tiene una clase incorporada de Post-Procesadores de Nodos que ayudan con esto exactamente.

6. Utiliza el enrutamiento de consultas.

A menudo es útil tener más de un índice. Luego, enrutas las consultas al índice correspondiente cuando llegan. Por ejemplo, puedes tener un índice que maneje preguntas de resumen, otro que maneje preguntas concretas y otro que funcione bien para preguntas sensibles a la fecha. Si intentas optimizar un índice para todos estos comportamientos, terminarás comprometiendo su rendimiento en todos ellos. En cambio, puedes enrutar la consulta al índice adecuado. Otro caso de uso sería dirigir algunas consultas a un índice basado en palabras clave, como se discutió en la sección 2.

Una vez que hayas construido tus índices, solo tienes que definir en texto para qué se debe utilizar cada uno. Luego, en el momento de la consulta, el LLM elegirá la opción adecuada. Tanto LlamaIndex como LangChain tienen herramientas para esto.

7. Investiga el reordenamiento.

El reordenamiento es una solución para el problema de la discrepancia entre la similitud y la relevancia. Con el reordenamiento, tu sistema de recuperación obtiene los nodos principales para el contexto como de costumbre. Luego, los vuelve a ordenar según su relevancia. Cohere Rereanker se utiliza comúnmente para esto. Esta estrategia es recomendada con frecuencia por los expertos. Sin importar el caso de uso, si estás construyendo con RAG, deberías experimentar con el reordenamiento y ver si mejora tu sistema. Tanto LangChain como LlamaIndex tienen abstracciones que facilitan la configuración.

8. Considera las transformaciones de consulta.

Ya alteras la consulta del usuario al incluirla en tu promp base. Puede tener sentido modificarla aún más. Aquí tienes algunos ejemplos:

Reformulación: si tu sistema no encuentra contexto relevante para la consulta, puedes hacer que el LLM reformule la consulta y vuelva a intentarlo. Dos preguntas que parecen iguales para los humanos no siempre se ven tan similares en el espacio de incrustación.

HyDE: HyDE es una estrategia que toma una consulta, genera una respuesta hipotética y luego las utiliza ambas para buscar incrustaciones. Los investigadores han descubierto que esto puede mejorar drásticamente el rendimiento.

Subconsultas: LLMs tienden a funcionar mejor cuando descomponen consultas complejas. Puedes incorporar esto en tu sistema RAG de manera que una consulta se descomponga en múltiples preguntas.

LLamaIndex tiene documentos que cubren estos tipos de transformaciones de consulta.

9. Ajusta tu modelo de incrustación.

La similitud basada en incrustaciones es el mecanismo de recuperación estándar para RAG. Tus datos se dividen y se incrustan dentro del índice. Cuando llega una consulta, también se incrusta para compararla con la incrustación en el índice. Pero ¿qué hace la incrustación? Usualmente, un modelo pre-entrenado como OpenAI’s text-embedding-ada-002.

El problema es que el concepto del modelo pre-entrenado sobre lo que es similar en el espacio de incrustación puede no coincidir muy bien con lo que es similar en tu contexto. Imagina que estás trabajando con documentos legales. Te gustaría que tu incrustación se base más en términos específicos de tu dominio como “propiedad intelectual” o “incumplimiento de contrato” y menos en términos generales como “por la presente” y “acuerdo”.

Puedes ajustar tu modelo de incrustación para resolver este problema. Hacerlo puede mejorar tus métricas de recuperación en un 5-10%. Esto requiere un poco más de esfuerzo, pero puede marcar una diferencia significativa en el rendimiento de tu recuperación. El proceso es más fácil de lo que piensas, ya que LlamaIndex puede ayudarte a generar un conjunto de entrenamiento. Para más información, puedes consultar esta publicación de Jerry Liu sobre cómo LlamaIndex aborda el ajuste fino de las incrustaciones, o esta publicación que explica el proceso de ajuste fino.

10. Comienza a usar herramientas de desarrollo de LLM.

Es probable que ya estés utilizando LlamaIndex o LangChain para construir tu sistema. Ambos marcos tienen herramientas de depuración útiles que te permiten definir devoluciones de llamada, ver qué contexto se utiliza, de qué documento proviene tu recuperación y más.

Si encuentras que las herramientas incorporadas en estos marcos son insuficientes, existe un creciente ecosistema de herramientas que pueden ayudarte a profundizar en el funcionamiento interno de tu sistema RAG. Arize AI tiene una herramienta en el cuaderno que te permite explorar cómo se recupera el contexto y por qué. Rivet es una herramienta que proporciona una interfaz visual para ayudarte a construir agentes complejos. Fue recientemente liberada como software de código abierto por la empresa de tecnología legal Ironclad. Constantemente se lanzan nuevas herramientas y vale la pena experimentar para ver cuáles son útiles en tu flujo de trabajo.

Conclusión

Construir con RAG puede ser frustrante porque es muy fácil hacerlo funcionar y muy difícil hacerlo funcionar bien. Espero que las estrategias anteriores puedan proporcionarte alguna inspiración sobre cómo puedes cerrar la brecha. Ninguna de estas ideas funciona todo el tiempo y el proceso es de experimentación, prueba y error. No profundicé en la evaluación, cómo puedes medir el rendimiento de tu sistema, en esta publicación. La evaluación es más un arte que una ciencia en este momento, pero es importante establecer algún tipo de sistema que puedas verificar de manera consistente. Esta es la única forma de saber si los cambios que estás implementando marcan una diferencia. Escribí sobre cómo evaluar un sistema RAG anteriormente. Para más información, puedes explorar LlamaIndex Evals, LangChain Evals y un marco realmente prometedor llamado RAGAS.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Desenmascarando Deepfakes Aprovechando los patrones de estimación de la posición de la cabeza para mejorar la precisión de detección

La aparición de la capacidad de producir videos “falsos” ha generado preocupaciones significativas con re...

Inteligencia Artificial

Aterrizaje de Chandrayaan 3 Cómo la IA y los sensores ayudaron en la épica empresa lunar de la ISRO.

En la fascinante expansión de la exploración espacial, cada misión es una apuesta cósmica, cada una un lanzamiento de...

Inteligencia Artificial

Día de Desarrollo de OpenAI 2023 ¡Cuatro importantes anuncios de la presentación principal del fundador Sam Altman que no puedes perderte!

La primera conferencia para desarrolladores de OpenAI estuvo repleta de asombrosos anuncios de productos. ¿Y sabes qu...

Inteligencia Artificial

RELU vs. Softmax en Vision Transformers ¿Importa la longitud de la secuencia? Ideas de un artículo de investigación de Google DeepMind

Hoy en día, una arquitectura común de aprendizaje automático es la arquitectura de transformer. Una de las partes pri...

Inteligencia Artificial

Intérprete de código de ChatGPT Todo lo que necesitas saber

OpenAI ha estado causando sensación con emocionantes anuncios, y el último seguramente complacerá a los usuarios de C...

Inteligencia Artificial

Apple entra en la competencia de la IA generativa con el chatbot 'AppleGPT

El gigante tecnológico Apple sigue adelante con su esperado chatbot impulsado por IA, tentativamente llamado “A...