“La generación aumentada de recuperación es el proceso de complementar la entrada de un usuario a un modelo de lenguaje grande (LLM) como ChatGPT con información adicional que usted (el sistema) tiene. recuperado desde algún otro lugar. El LLM luego puede usar esa información para aumentar la respuesta que genera.” – Cory Zue
Los LLM son un invento asombroso, propenso a un problema clave. Ellos inventan cosas. RAG hace que los LLM sean mucho más útiles al brindarles un contexto fáctico para usar al responder consultas.
Con la guía de inicio rápido de un marco como LangChain o LlamaIndex, cualquiera puede crear un sistema RAG simple, como un chatbot para sus documentos, con aproximadamente cinco líneas de código.
Pero el bot creado con esas cinco líneas de código no funcionará muy bien. RAG es fácil de crear prototipos, pero muy difícil de producir, es decir, llegar a un punto en el que los usuarios estén contentos con él. Un tutorial básico podría hacer que RAG funcione al 80%. Pero llegar al siguiente 20% a menudo requiere una experimentación seria. Las mejores prácticas aún no se han resuelto y pueden variar según el caso de uso. Pero vale la pena dedicar tiempo a descubrir las mejores prácticas, porque RAG es probablemente la forma más eficaz de utilizar los LLM.
Esta publicación analizará estrategias para mejorar la calidad de los sistemas RAG. Está diseñado para quienes 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 adecuada. Asumiré que el lector ya comprende cómo funciona RAG. Si no, te sugiero leer Este artículo por Cory Zue por una buena introducción. También supondrá cierta familiaridad básica con los marcos comunes utilizados para crear estas herramientas: LangChain y LlamaIndex. Sin embargo, las ideas discutidas aquí son independientes del marco.
No profundizaré en los detalles de cómo implementar exactamente cada estrategia que cubro, sino que intentaré dar una idea de cuándo y por qué podría ser útil. Dada la rapidez con la que se mueve el espacio, es imposible proporcionar una lista exhaustiva o perfectamente actualizada de las mejores prácticas. En lugar de ello, mi objetivo es describir algunas cosas que usted podría considerar e intentar cuando intente mejorar su aplicación de recuperación de generación aumentada.
1. Limpia tus datos.
RAG conecta las capacidades de un LLM con sus datos. Si sus datos son confusos, en sustancia o diseño, entonces su sistema se verá afectado. Si utiliza datos con información contradictoria o redundante, su recuperación tendrá dificultades para encontrar el contexto adecuado. Y cuando lo hace, el paso de generación realizado por el LLM puede no ser óptimo. Supongamos que está creando un chatbot para los documentos de ayuda de su startup y descubre que no funciona bien. Lo primero que debe tener en cuenta son los datos que está introduciendo en el sistema. ¿Los temas están divididos de forma lógica? ¿Se tratan los temas en un solo lugar o en muchos lugares separados? Si usted, como ser humano, no puede saber fácilmente qué documento necesitaría mirar para responder consultas comunes, su sistema de recuperación tampoco podrá hacerlo.
Este proceso puede ser tan simple como combinar manualmente documentos sobre el mismo tema, pero 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. Luego, el paso de recuperación puede ejecutar primero una búsqueda en estos resúmenes y profundizar en los detalles solo cuando sea necesario. Algunos marcos incluso tienen esto como una abstracción incorporada.
2. Explore diferentes tipos de índices.
El índice es el pilar central de LlamaIndex y LangChain. Es el objeto que sostiene su sistema de recuperación. El enfoque estándar de RAG implica incrustaciones y búsqueda de similitudes. Divida los datos del contexto, incruste todo, cuando llegue una consulta, encuentre piezas similares del contexto. Esto funciona muy bien, pero no es el mejor enfoque para todos los casos de uso. ¿Las consultas se relacionarán con artículos específicos, como productos en una tienda de comercio electrónico? Es posible que desee explorar la búsqueda basada en palabras clave. No tiene por qué ser uno u otro, muchas aplicaciones utilizan un híbrido. Por ejemplo, puede utilizar un índice basado en palabras clave para consultas relacionadas con un producto específico, pero confiar en las incrustaciones para la atención al cliente general.
3. Experimente con su enfoque de fragmentación.
Fragmentar los datos de contexto es una parte fundamental de la construcción de un sistema RAG. Los marcos abstraen el proceso de fragmentación y le permiten salirse sin pensar en ello. Pero deberías pensar en ello. El tamaño del fragmento importa. Debe explorar qué funciona mejor para su aplicación. En general, los fragmentos más pequeños a menudo mejoran la recuperación, pero pueden hacer que la generación sufra una falta de contexto circundante. Hay muchas maneras de abordar la fragmentación. Lo único que no funciona es abordarlo a ciegas. Esta publicación de PineCone establece algunas estrategias a considerar. Tengo un conjunto de preguntas de prueba. Me acerqué a esto por ejecutando un experimento. Recorrí cada conjunto una vez con un tamaño de trozo pequeño, mediano y grande y descubrí que lo pequeño era lo mejor.
4. Experimente con su mensaje base.
Un ejemplo de un mensaje básico utilizado en LlamaIndex es:
‘La información de contexto se encuentra a continuación. Dada la información del contexto y no el conocimiento previo, responda la pregunta.
Puede sobrescribir esto y experimentar con otras opciones. Incluso puede piratear el RAG de modo que permita que el LLM confíe en su propio conocimiento si no puede encontrar una buena respuesta en el contexto. También puede ajustar el mensaje 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 mensaje de modo que el LLM tenga contexto sobre los trabajos que está realizando. Por ejemplo:
‘Usted es un agente de atención al cliente. Está diseñado para ser lo más útil posible y proporcionar únicamente información objetiva. Debes ser amigable, pero no demasiado hablador. La información de contexto se encuentra a continuación. Dada la información del contexto y no el conocimiento previo, responda la pregunta.
5. Pruebe el filtrado de metadatos.
Una estrategia muy eficaz para mejorar la recuperación es agregar metadatos a los fragmentos y luego utilizarlos para ayudar a procesar los resultados. La fecha es una etiqueta de metadatos común que se puede agregar porque le permite filtrar por actualidad. Imagine que está creando una aplicación que permite a los usuarios consultar su historial de correo electrónico. Es probable que los correos electrónicos más recientes sean más relevantes. Pero no sabemos si serán 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. Puede agregar la fecha de cada correo electrónico a sus metadatos y luego priorizar el contexto más reciente durante la recuperación. LlamaIndex tiene una clase integrada de posprocesadores de nodos que ayudan exactamente con esto.
6. Utilice el enrutamiento de consultas.
A menudo resulta útil tener más de un índice. Luego, dirige las consultas al índice apropiado cuando llegan. Por ejemplo, puede tener un índice que maneje preguntas de resumen, otro que maneje preguntas puntuales y otro que funcione bien para preguntas sensibles a fechas. Si intenta optimizar un índice para todos estos comportamientos, terminará comprometiendo su desempeño en todos ellos. En su lugar, puede enrutar la consulta al índice adecuado. Otro caso de uso sería dirigir algunas consultas a un índice basado en palabras clave, como se analiza en la sección 2.
Una vez que hayas construido tus índices, sólo 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 ello.
7. Considere la posibilidad de reclasificar.
La reclasificación es una solución al problema de la discrepancia entre similitud y relevancia. Con la reclasificación, su sistema de recuperación obtiene los nodos superiores para el contexto como de costumbre. Luego los reclasifica según su relevancia. Cohere Rereanker se utiliza comúnmente para esto. Esta estrategia es una que veo que los expertos recomiendan a menudo. No importa el caso de uso, si está compilando con RAG, debe experimentar con la reclasificación y ver si mejora su sistema. Tanto LangChain como LlamaIndex tienen abstracciones que facilitan su configuración.
8. Considere las transformaciones de consultas.
Ya modifica la consulta de su usuario colocándola dentro de su mensaje base. Puede tener sentido modificarlo aún más. Aquí están algunos ejemplos:
Reformulación: si su sistema no encuentra un contexto relevante para la consulta, puede hacer que el LLM reformule la consulta e intente nuevamente. Dos preguntas que parecen iguales para los humanos no siempre parecen tan similares en el espacio incrustado.
HyDE: Hyde es una estrategia que toma una consulta, genera una respuesta hipotética y luego usa ambas para incrustar la búsqueda. Las investigaciones han descubierto que esto puede mejorar drásticamente el rendimiento.
Subconsultas: los LLM tienden a funcionar mejor cuando analizan consultas complejas. Puede integrar esto en su sistema RAG de modo que una consulta se descomponga en varias preguntas.
LLamaIndex tiene documentos que cubren estos tipos de transformaciones de consultas.
9. Ajusta tu modelo de incrustación.
La similitud basada en incrustación es el mecanismo de recuperación estándar para RAG. Sus datos están divididos e incrustados 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? Por lo general, un modelo previamente entrenado como el texto de OpenAIincrustar–ada–002.
El problema es que el concepto del modelo previamente entrenado sobre lo que es similar en el espacio de incrustación puede no alinearse muy bien con lo que es similar en su contexto. Imagine que está trabajando con documentos legales. Le gustaría que su inserción base su juicio de similitud más en términos específicos de su dominio, como “propiedad intelectual” o “incumplimiento de contrato”, y menos en términos generales como “por la presente” y “acuerdo”.
Puede ajustar su modelo de incrustación para resolver este problema. Hacerlo puede aumentar sus métricas de recuperación entre un 5% y un 10%. Esto requiere un poco más de esfuerzo, pero puede marcar una diferencia significativa en el rendimiento de la 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 por Jerry Liu sobre cómo LlamaIndex aborda el ajuste de las incrustaciones, o esta publicación que recorre el proceso de ajuste.
10. Comience a utilizar las herramientas de desarrollo de LLM.
Probablemente ya estés usando LlamaIndex o LangChain para construir tu sistema. Ambos marcos tienen útiles herramientas de depuración que le permiten definir devoluciones de llamadas, ver qué contexto se utiliza, de qué documento proviene su recuperación y más.
Si descubre que faltan las herramientas integradas en estos marcos, existe un ecosistema creciente de herramientas que pueden ayudarlo a profundizar en el funcionamiento interno de su sistema RAG. Arize AI tiene una herramienta en el cuaderno que le permite explorar cómo, qué contexto se recupera y por qué. Remache es una herramienta que proporciona una interfaz visual para ayudarle a crear agentes complejos. Fue 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 su flujo de trabajo.
Construir con RAG puede ser frustrante porque es muy fácil empezar a trabajar y muy difícil hacerlo bien. Espero que las estrategias anteriores puedan brindarle algo de inspiración sobre cómo cerrar la brecha. Ninguna de estas ideas funciona todo el tiempo y el proceso es de experimentación, prueba y error. No me sumergí en la evaluación, cómo se puede medir el rendimiento de su 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 controlar constantemente. Ésta es la única manera de saber si los cambios que está implementando marcan la diferencia. escribí sobre cómo evaluar RAG sistema anteriormente. Para obtener más información, puede explorar Evaluaciones de LlamaIndex, Evaluaciones de LangChainy un nuevo marco realmente prometedor llamado RAGAS.