En el apasionado mundo de la inteligencia artificial, la Retrieval-Augmented Generation (RAG) destaca como un enfoque útil que combina las técnicas de extracción de documentos con la creatividad y potencia de los modelos generativos. Este artículo será la introducción para una serie completa que explorará la aplicación práctica de un sistema RAG en varias plataformas y profundizará en sus metodologías.
Los sistemas basados en RAG permiten a los modelos generar respuestas más precisas y relevantes gracias a la incorporación de fuentes externas de conocimiento. De este modo, no sería necesario reentrenar un modelo, sino que hace uso de la información contextual proporcionada durante el proceso de generación para ofrecer una mejor respuesta.
Para entenderlo mejor, imagina una empresa tecnológica que cuenta con una fuente de documentación interna. En ella, la empresa cuenta con documentos con información técnica sobre sus productos y servicios. Un LLM (Large Language Model) tendría dificultades para responder a cuestiones relacionadas con el contenido interno de la empresa.
Es en este momento donde un sistema RAG interviene. Cuando un usuario realiza una consulta el sistema recupera los documentos internos más relevantes y los incorpora a la consulta realizada al LLM. Esta consulta con información añadida permite al LLM construir una respuesta más informada y precisa, sin necesidad de reentrenamiento. Además la capacidad de citar la fuente en la que basa su respuesta le aporta un extra de fiabilidad. En este aspecto, se mejora la confianza de los usuarios eliminando el temor de que el modelo “alucine”. Sigue leyendo para aprender más.
¿Qué es un Sistema RAG?
El fin de los sistemas RAG es generar un mensaje que permita al modelo generativo responder al usuario con la ayuda de contexto adicional.
Para lograr esto en los sistemas RAG debe seguir una serie de pasos fundamentales. En ellos es imprescindible el almacenamiento, la recuperación y el uso de la información contextual de manera efectiva. Esto permite que las respuestas del modelo generativo sean más completas y precisas. Los componentes que no pueden faltar en un modelo RAG son:
- Ingesta de datos. Los documentos que se usarán para enriquecer al LLM se añaden a una base de datos adecuada, garantizando su buena estructuración y fácil acceso.
- Proceso de Recuperación. Al recibir una consulta del usuario el sistema recupera los documentos más importantes de la base de datos. (En la siguiente sección se analizará los diferentes enfoques para optimizar su recuperación.)
- Construcción del Prompt. Con la combinación del contexto del documento externo y la consulta del usuario se crea el prompt. Ese prompt ordena al modelo a responder a la consulta del usuario usando la información adicional recuperada.
- Generación de la respuesta. Finalmente se pasa el prompt al LLM que genera una respuesta más precisa con el contexto adecuado.
El Proceso de Recuperación
El proceso de recuperación es un componente crítico de un sistema RAG. Este tiene un impacto significativo en la calidad y relevancia de las respuestas proporcionadas. La capacidad de nuestro LLM para producir una respuesta útil sólo es posible si logramos brindarle la información más relevante.
Existen algunos métodos para la recuperación de documentos:
– Búsqueda de palabras clave. Es un método donde el sistema recupera documentos mediante palabras o frases específicas proporcionadas por el usuario. Se realiza una búsqueda en base a términos exactos o sus “sinónimos” para encontrar el contenido relevante.
– Búsqueda semántica. Va más allá de la concordancia exacta de palabras clave al comprender el significado y el contexto de la consulta. Aprovecha técnicas de embeddings para interpretar la intención detrás de la consulta. Con ello, recupera documentos que están conceptualmente relacionados, incluso si no contienen las palabras clave de la consulta.
– Búsqueda híbrida. Es una combinación, de la búsqueda semántica y de las palabras clave para aprovechar las ventajas de ambas. Utiliza la correlación de palabras clave para identificar documentos relevantes y luego aplica análisis semántico para refinar sus resultados. Esto asegura tanto la precisión como la relevancia contextual de la respuesta.
En el siguiente artículo mostraremos una pequeña aplicación que utiliza la búsqueda semántica para la recuperación de documentos. Este enfoque es particularmente útil en escenarios donde las consultas de los usuarios son complejas o donde la información buscada tiene matices y no se puede capturar fácilmente mediante simples coincidencias de palabras clave.
Búsqueda semántica y embeddings
Para comprender la búsqueda semántica, debemos profundizar un poco más en los embeddings (o vectores). Los embeddings son representaciones numéricas de palabras, frases o documentos completos en un espacio vectorial continuo. Estos vectores capturan relaciones semánticas entre entidades, lo que permite que conceptos similares tengan representaciones vectoriales similares.
La búsqueda semántica aprovecha los embeddings para ir más allá de la concordancia tradicional de palabras clave al comprender el significado y el contexto de las consultas. En lugar de depender de palabras exactas, la búsqueda semántica utiliza representaciones vectoriales de la consulta y los documentos para encontrar coincidencias por similitud conceptual.
Esto permite que el sistema encuentre contenido relevante que no contenga las palabras exactas de la consulta, pero que coincide con la intención de búsqueda del usuario.
Bases de Datos Vectoriales
Todo lo que queda es ingestar los embeddings calculados a un almacenamiento apropiado. Para ello recurriremos a las bases de datos vectoriales. Estos son sistemas especializados diseñados para almacenar y gestionar representaciones vectoriales de datos. Estas bases de datos optimizan el almacenamiento y la recuperación de embeddings. Para ello utilizan algoritmos como Approximate Nearest Neighbor (ANN) para garantizar el rendimiento y la escalabilidad.
En el próximo artículo, utilizaremos OpenSearch para aprovechar el servicio administrado de AWS. OpenSearch permite a los usuarios almacenar y realizar consultas sobre vectores y estructuras de datos más tradicionales. Con características como la búsqueda k-NN y la integración con frameworks de machine learning, proporciona una plataforma para implementar búsqueda y análisis basados en vectores en diversas aplicaciones.
Restricción de conocimientos
Una decisión a tomar es si debemos restringir nuestro LLM. En este punto hay dos opciones, restringir la generación de la respuesta al contexto proporcionado; o permitir que el modelo pueda adicionalmente usar todo el contenido con el que ha sido entrenado. Esto generalmente se hace mediante prompt engineering.
Limitar la respuesta al contexto proporcionado por el RAG garantiza que las respuestas sean directamente relevantes para las consultas realizadas. Lo cual, es útil para aplicaciones que requieren información precisa y exacta.
Por el contrario, permitir al LLM usar el extenso conocimiento con el que ha sido entrenado habilitará al modelo generar respuestas más completas a expensas de un mayor riesgo de alucinaciones.
Arquitectura del sistema:
En resumen, nuestro proceso RAG consistiría en los siguientes pasos:
- El sistema ingesta nuestra base de conocimientos interna y los embeddings calculados en la base de datos vectorial..
- Los embeddings se calcularán para la consulta del usuario y se utilizarán para buscar el documento más cercano en la base de datos vectorial. Esto nos permitirá recuperar el documento más relevante para nuestra consulta.
- Luego, creamos un mensaje que consta de la pregunta del usuario original más el documento recuperado en forma de contexto adicional.
- Finalmente podemos pasar esta prompt a nuestro LLM para lograr una respuesta más precisa y relevante.
Arquitectura de la Aplicación
Vamos a restringirnos a una de las arquitecturas más sencillas posibles para nuestra aplicación. Desplegamos nuestra interfaz Streamlit contenerizada a un clúster, la aplicación estará respaldada por una base de datos vectorial. Para simplificar, delegamos tanto la lógica para ingestar documentos como el chatbot a la aplicación Streamlit, en lugar de crear un pipeline separado.
Por último, y dependiendo del proveedor de la nube, haremos accesible el cluster mediante un Load Balancer que nos proporcionará un DNS público.
Marcos de Desarrollo
A la hora de implementar un sistema RAG en nuestra aplicación hay dos herramientas que destacan por su popularidad: Langchain y LlamaIndex. Ambas son capaces de facilitar el desarrollo de estos tipos de sistemas. Sin embargo, debemos tener en cuenta que satisfacen necesidades y casos de uso distintos.
Langchain es una herramienta completa para manejar todo el proceso de interacción con modelos de lenguaje, desde la creación del prompt hasta el procesamiento de la respuesta del modelo. Permite crear flujos complejos para implementar procesos de múltiples etapas, integrándose con diversas fuentes de datos y herramientas externas, lo que lo hace ideal para configuraciones RAG complejas que requieren una gestión avanzada de datos e interacciones con usuarios. Además, evoluciona continuamente gracias a una amplia comunidad.
Por otro lado, LlamaIndex se especializa en la indexación y recuperación de datos, centrándose en la gestión de grandes volúmenes de información y una extracción eficiente de los datos. Ofrece técnicas avanzadas para mejorar los procesos de recuperación, siendo fundamental para la generación de contenido de alta calidad.
La elección entre Langchain y LlamaIndex depende de los requisitos específicos del proyecto: Langchain es ideal para proyectos muy personalizados y pipelines varias etapas, mientras que LlamaIndex es mejor para proyectos que priorizan la recuperación eficiente de grandes volúmenes de datos. Ambas herramientas ofrecen ventajas únicas para distintas aplicaciones RAG, permitiendo a los desarrolladores elegir la más adecuada según sus necesidades.
Otras Técnicas
Hay bastantes técnicas que podemos emplear para mejorar el rendimiento de nuestras aplicaciones RAG. Algunas de las más importantes son la fragmentación de texto, la expansión de consultas y la reclasificación. Profundicemos en cómo funcionan estos métodos y sus beneficios en el contexto de un sistema RAG.
Fragmentación de texto:
La fragmentación de texto implica dividir documentos grandes en partes o fragmentos más pequeños y manejables. Esto es crucial porque los embeddings sólo pueden capturar una cantidad limitada de significado en un formato vectorial. Al incorporar e indexar estos fragmentos más pequeños en lugar de documentos completos, el sistema puede buscar y recuperar con mayor precisión las secciones más relevantes para la consulta de un usuario. Para mejorar el contexto, los textos suelen dividirse en segmentos superpuestos.
La fragmentación de texto garantiza que la información relevante se encuentre de manera efectiva. Incluso si está oculta dentro de un documento más grande, para así usarse en la construcción del prompt para el modelo generativo.
Expansión de consultas:
Un problema habitual en un sistema RAG es que incluso usando búsqueda semántica, no seamos capaces de recuperar el documento adecuado en base al prompt inicial. En cierto sentido, estamos poniendo todos los huevos en la misma cesta; Dependemos de que los embeddings de la consulta inicial sean suficientes para encontrar el documento más importante en nuestra base de datos.
Por lo tanto, la idea de este método es utilizar un LLM para generar múltiples consultas basadas en el mensaje inicial. De esta manera, con los múltiples embeddings de esta colección de consultas tenemos más posibilidades de recuperar los documentos más importantes.
Pongamos un ejemplo: Si la consulta original es «impactos del cambio climático», se puede ampliar para incluir términos como «efectos del calentamiento global», «cambios ambientales» y «consecuencias ecológicas», lo que garantiza un proceso de recuperación más completo.
Reclasificación:
Es un proceso con el fin de filtrar o ordenar por prioridad los documentos recuperados por un sistema RAG.
Los métodos de reclasificación pueden utilizar varios criterios. Como por ejemplo, puntuaciones de relevancia de los documentos, feedback de los usuarios o información contextual. Todo ello con la intención de conseguir que los documentos más pertinentes sean visibles. Una práctica común es utilizar un LLM para discernir la información más relevante de la colección inicial recuperada.
Cuando se combina, la expansión de consultas y la reclasificación pueden mejorar significativamente los resultados obtenidos por el RAG. La expansión de consultas, garantiza una amplia colección de documentos posiblemente relevantes durante la fase de recuperación. Luego, la reclasificación refina estos resultados, enfocándose en los documentos más relevantes y de alta calidad para completar la generación.
Siguientes Pasos
Con esto concluimos la introducción a los sistemas RAG, más adelante profundizaremos en sus aplicaciones prácticas. En los próximos artículos mostraremos una guía de cómo llevar a cabo el proceso de implementación de un sistema RAG en las principales plataformas en la nube como Amazon Web Services, Microsoft Azure y Google Cloud Platform. Cada artículo intentará aprovechar las fortalezas específicas de cada plataforma para sus implementaciones RAG.
Además, exploramos algunas de las técnicas avanzadas mencionadas en esta introducción y las metodologías utilizadas en la evaluación de estos sistemas. Para no perdértelo, no olvides suscribirte a nuestra Newsletter y estar al tanto de las últimas tendencias.
¿Te gustaría desarrollar tu propio sistema RAG pero no sabes por dónde empezar? Contacta con nosotros y te ayudaremos a desarrollar uno adaptado a las necesidades que tu negocio requiera. Recuerda que con un sistema RAG, las respuestas a las consultas se vuelven más precisas, la confianza en el modelo aumenta al limitar las “alucinaciones” y puedes obtener una amplia variedad de respuestas a tus preguntas.
¡Impulsa tu negocio hoy mismo! Contáctanos para una consultoría personalizada y descubre cómo implementar un sistema RAG en tu empresa.