Retrieval Augmented Generation (RAG): enseñando trucos nuevos a modelos viejos
En noviembre de 2022, la empresa OpenAI lanzó su herramienta ChatGPT, provocando una revolución —bueno, otra más en realidad— en el mundo de la inteligencia artificial. ChatGPT es un modelo de una familia de los llamados modelos grandes de lenguaje, o LLM por sus siglas en inglés (Large Language Models). Estos modelos se basan en arquitecturas de Transformers, de las que ya hablamos en este post, y que se entrenan con cantidades ingentes de texto —para hacernos una idea, se estima que GPT4, la última versión de OpenAI, se entrenó utilizando 10.000 GPUs de forma ininterrumpida durante 150 días—, aprendiendo así a generar texto de forma automática. Tal ha sido el éxito de los LLM, que desde la salida de ChatGPT, todas las empresas punteras han ido desarrollando y mejorando sus propios LLM: Llama 3 de Meta, Granite de IBM, o Claude de Anthropic. Aunque estos modelos son muy versátiles, siendo capaces de responder preguntas muy variadas, desde cultura general hasta incluso preguntas matemáticas y de lógica —algo que inicialmente era su talón de Aquiles—, en ocasiones queremos que nuestro modelo tenga un conocimiento sobre un dominio muy específico, incluso que puede ser información propia de una empresa particular. Es aquí donde han surgido varias técnicas para poder utilizar los LLM, pero además, “enseñarles” —ojo a las comillas— nuevos conocimientos. Reentrenando nuestro modelo Si yo le pregunto a cualquier LLM cuál es la capital de España, por ejemplo, este me responderá que es Madrid. El modelo ha sido entrenado con muchísima información pública —podemos pensar en Wikipedia, por ejemplo— entre la cuál se encuentra la respuesta a la pregunta que le hemos hecho. Sin embargo, si le preguntas cómo se llama tu perro, el LLM no va a conocer esa información —salvo que seas Cristiano Ronaldo o Taylor Swift— ya que no ha sido entrenado con ella. Como entrenar un LLM de cero no es una opción para el común de los mortales —no todos nos podemos permitir tener 10.000 GPUs funcionando 150 días seguidos, ¡con lo cara que está la luz!— se han explorado diferentes técnicas para poder incorporar información extra a los LLM ya entrenados, ahorrándonos así tiempo y dinero, sobre todo dinero. Un primer enfoque, muy extendido en el mundo del Deep Learning en general, es utilizar técnicas de Fine Tuning: esto es, tomar un LLM ya entrenado y reentrenarlo con nuestros datos particulares. Así, por ejemplo, tenemos modelos como BloombergGPT, un LLM que, a partir de los modelos de OpenAI, fue reentrenado con una gran cantidad de información financiera, creando así un modelo especialmente diseñado para aquellos que trabajan en el mundo de las finanzas. Sin embargo, ya que los modelos son tan grandes —miles y miles de millones de parámetros que hay que ajustar— esta técnica sigue siendo muy costosa. Además, en ocasiones las cosas no son tan bonitas como suenan, ya que en muchos casos BloombergGPT funciona solo ligeramente mejor que ChatGPT —sin tener este ningún conocimiento extra, sino el modelo de base que podemos utilizar cualquiera de nosotros— y peor que GPT4, la última versión del modelo. Conocer la información vs saber buscar la información Si al lector le preguntasen el cumpleaños de un familiar lejano, posiblemente no lo sabría de memoria —al menos ese es mi caso, lo reconozco. Sin embargo, tener esa información en la memoria es irrelevante, ya que la podemos tener apuntada en un calendario —para los más analógicos— o en el móvil. Con los LLM ocurre lo mismo. Si entrenamos un LLM con un conocimiento específico, el LLM “sabrá” ese conocimiento, igual que nosotros sabemos —espero— el cumpleaños de nuestros padres. Sin embargo, no necesitamos que un LLM sepa algo para poder preguntarle acerca de ello, podemos darle información extra para que elabore su respuesta, de la misma manera que si a nosotros nos preguntan algo que desconocemos podemos buscar la respuesta en libros, apuntes, internet, o llamando a nuestro amigo. Así, si yo le pregunto a ChatGPT por mi cumpleaños, obviamente no sabe darme la respuesta, como podemos ver en la Figura 1. Figura 1: ejemplo de respuesta de ChatGPT a una información desconocida. Sin embargo, si yo le proporciono información adicional sobre mí en el prompt —el texto que le pasamos al LLM— podemos ver como la respuesta sobre la fecha de mi cumpleaños es correcta —e incluso ChatGPT se permite alguna floritura, como podemos ver en la Figura 2. El LLM no conoce la información pero, si se le proporciona un contexto, sí que sabe buscarla y utilizarla para elaborar la respuesta. Figura 2: ejemplo de respuesta de ChatGPT al proporcionarle información adicional. Encontrando la información adecuada: sistemas RAG Llegados a este punto, el lector podría no estar muy satisfecho con el ejemplo anterior. ¿De qué sirve preguntarle a ChatGPT por mi cumpleaños si yo mismo tengo que darle esa información en el prompt? Parece bastante inútil preguntarle algo a un LLM si yo mismo le tengo que dar la respuesta. Sin embargo, podríamos diseñar un sistema que automatizase la búsqueda de ese contexto, esa información adicional que el LLM necesita, para pasárselo al LLM. Y precisamente esto es lo que hacen los sistemas RAG (Retrieval Augmented Generation). Los sistemas RAG constan de un LLM y una base de datos que almacenará los documentos sobre los que nosotros vamos a hacer preguntas al modelo. Así, si por ejemplo trabajamos en una empresa de maquinaría industrial, podríamos tener una base de datos con todos los manuales, tanto de la propia maquinaria como de seguridad, y podríamos hacerle preguntas sobre cualquiera de estos temas, que nos respondería tomando la información de dichos manuales. El funcionamiento de los sistemas RAG —ilustrado en la Figura 3— es el siguiente: El usuario escribe un prompt formulando su pregunta, el cual será convertido a un vector numérico a través de un modelo de embedding. Si este término no te es familiar, no te preocupes, puedes pensar que un embedding no es más que la “traducción” de un texto al idioma de los ordenadores. Tras ello, se toma esta “traducción” del prompt y se compara con todos los documentos que se desee —en este caso los manuales— y se extraen los fragmentos más similares. Aquí, hay que recalcar que todos los documentos han sido previamente “traducidos” con el mismo modelo de embedding. Por último, se le proporciona al LLM tanto el prompt como la información extraída de nuestra base de datos vectorial, proporcionándole de manera automática la información necesaria para responder a nuestra pregunta. Figura 3: Esquema de un sistema de RAG. Así, al igual que nosotros podemos buscar información que nos es desconocida, un LLM puede hacer lo mismo si lo integramos dentro de un RAG. Así, podemos explotar las capacidades de generación de texto de los LLM, a la vez que automatizamos la generación del contexto y la información necesaria para responder a las preguntas que deseemos… siempre que tengamos el documento necesario a mano, ¡claro está! IA & Data Preparando tu estrategia de datos para la era de la IA Generativa 7 de marzo de 2024 Imagen de rawpixel.com / Freepik.
17 de junio de 2024