RAG es el acrónimo de Retrieval-Augmented Generation lo que en español significa Generación aumentada por recuperación, consiste en aumentar la generación de texto que hace un LLM como ChatGPT con la capacidad de recuperar información desde una base de datos o un corpus de texto externo al que se usó para entrenar el modelo.
Es bien sabido que los LLMs son entrenados con grandes cantidades de texto recuperado desde internet, tiene conocimiento prácticamente en todo los ámbitos del conocimiento humano, pero con la limitación de que su conocimiento suele estar limitado a la fecha de corte de los datos con los que fue entrenado, por ejemplo, ChatGPT-3.5 no suele tener conocimiento de eventos o información generada después de septiembre de 2021. Por lo general esto es suficiente para responder cualquier duda que uno suele tener, para un uso general está bien.
Pero el potencial de un LLM no se limita solo a responder las dudas de los usuarios, OpenAI lo sabe y por eso ofrece una API para poder consumir sus modelos y de esta forma integrar Inteligencia Artificial a aplicaciones de todo tipo
Supongamos que tenemos una tienda que vende peluches, tenemos peluches de todo tipo y los vendemos desde un perfil de Instagram. Nuestro principal canal de venta es mediante el chat de Instagram y WhatsApp en el cual nos coordinamos con los clientes para realizar las ventas y para resolver dudas. El negocio está creciendo y cada vez tenemos mas clientes que hacen consultas y quieren comprar algún peluche, los dueños del negocio ya no dan abasto con tantos mensajes y se les ocurre la idea de montar un bot que pueda responder las consultas de los clientes, bot que usa ChatGPT para generar las respuestas, pero tenemos algunos problemas con esa idea, por ejemplo, ¿Como sabe el bot cuales son los precios de los peluches?, el negocio comenzó a funcionar a mediados del 2024, ademas de que no es un negocio famoso, por ende no hay forma de que ChatGPT tenga conocimiento de él ni de sus productos.
Es aquí donde hace su magia RAG, como mencionaba antes, RAG es una técnica que permite aumentar la generación de un LLM mediante recuperación, pero, ¿Qué aumenta? y ¿Qué recupera?. Un LLM como ChatGPT puede ser instruido mediante un prompt de tipo System para darle un cierta personalidad y para darle indicaciones de como debe comportarse y que información debe saber. Por ejemplo:
{
"role": "system",
"content": "Eres un asistente virtual de una tienda de peluches"
}
Esto se logra mediante el uso de la API de OpenAI, esta nos permite manipular el comportamiento de ChatGPT mediante el uso de prompts de tipo System. El prompt System es importante porque es ahí en donde le podemos dar información que el modelo no tiene por defecto, como por ejemplo, los precios de los peluches. Pero esta información debe ser añadida de forma dinámica porque un cliente no siempre va a preguntar por el mismo producto , ademas no podemos pasarle un prompt con toda la información de la tiendo, quizás tenemos miles de productos y el prompt System tiene un limite de tokens que puede recibir. Es aquí en donde entra la parte de Retrieval o recuperación.
Cuando nosotros hablamos con un LLM el modelo en realidad no está recibiendo el texto tal cual nosotros lo enviamos, sino que mediante un proceso de embedding transforma nuestra palabras en vectores de números, en otras palabras, convierte el lenguaje en una representación matemática de los conceptos que estamos tratando de comunicar. Esto es importante saberlo porque es así como almacena información un LLM, entonces si queremos interactuar con el de una forma mas profunda debemos hablar su lenguaje.
Como el LLM no posee información de la tienda debemos encontrar una forma de que pueda acceder a estos datos, es aquí en donde entra una Base de datos de vectores. Como mencionaba, un LLM en su "cabeza" solo tiene vectores, que representan conceptos, palabras, frases, etc. Entonces para añadirle información externa, nuestra base de datos de la tienda debe tener este formato, de vectores, de esta forma el LLM puede buscar en la base de datos la información que necesita para responder las consultas de los clientes. ¿Como se logra esto?, el proceso es el siguiente:
- Indexación: Se indexa la información de la tienda en una base de datos de vectores, por ejemplo, si tenemos una tabla de productos, cada producto debe ser representado por un vector.
- Recuperación: Cuando un cliente hace una consulta al sistema, el sistema transforma la consulta a un embedding, esto se puede hacer mediante el uso de la API de OpenAI la cual tiene una función para generar embeddings de texto. Con el embedding de la consulta, el sistema hace una búsqueda semántica de la información en la base de datos de vectores. Osea, a diferencia de una consulta SQL tradicional en donde se busca la coincidencia exacta de un valor, en una búsqueda semántica se busca por significado, es decir, se busca información que en base al significado de la consulta
- Generación: Con la información recuperada, el sistema inyecta esta información en el prompt System y le pasa el prompt al LLM para que genere la respuesta.
{
"role": "system",
"content": "Eres un asistente virtual de una tienda de peluches. Context: Producto: Peluche de oso, Precio: $20",
}
De esta forma podemos añadirle la información de nuestra tienda al LLM y hacer que responda las consultas de los clientes de forma mas precisa y personalizada.
Lo interesante en si no es el poder añadirle información extra a un LLM, aunque en si eso es bastante útil, pero mas interesante es la búsqueda semántica que se puede hacer con una base de datos de vectores, podemos indexar información de cualquier tipo, información que para nosotros quizás no tenga ninguna relación entre si, pero para un LLM puede que si la tenga, esto nos permite hacer búsquedas en datos, archivos, imágenes, etc. todo se puede vectorizar y mediante un LLM podemos buscar las conexiones que hay entre estos datos usando lenguaje natural.