Ingeniería Prompt Generación Mejorada con Recuperación (RAG)

Prompt Generación Mejorada con Recuperación (RAG)

El campo de Procesamiento del Lenguaje Natural (PLN) ha experimentado avances significativos con la llegada de modelos basados en transformadores como GPT-3. Estos modelos de lenguaje tienen la capacidad de generar texto similar al humano y se han encontrado aplicaciones diversas como chatbots, generación de contenido y traducción. Sin embargo, cuando se trata de casos de uso empresariales en los que se involucra información especializada y específica del cliente, los modelos de lenguaje tradicionales pueden quedarse cortos. Ajustar estos modelos con nuevos corpus puede ser costoso y llevar mucho tiempo. Para abordar este desafío, podemos utilizar una de las técnicas llamada “Generación con Recuperación Mejorada” (RAG).

En este blog, exploraremos cómo funciona RAG y demostraremos su efectividad a través de un ejemplo práctico utilizando GPT-3.5 Turbo para responder a un manual de producto como un corpus adicional.

Imagina que te han encargado desarrollar un chatbot que pueda responder a consultas sobre un producto en particular. Este producto tiene su propio manual de usuario único específico de las ofertas de la empresa. Los modelos de lenguaje tradicionales, como GPT-3, suelen entrenarse con datos generales y es posible que no tengan conocimiento de este producto específico. Ajustar el modelo con el nuevo corpus puede parecer una solución, pero conlleva costos considerables y requisitos de recursos.

Introducción de RAG

Generación con Recuperación Mejorada (RAG) ofrece una forma más eficiente y efectiva de abordar el problema de generar respuestas contextualmente apropiadas en dominios especializados. En lugar de ajustar finamente todo el modelo de lenguaje con el nuevo corpus, RAG aprovecha el poder de la recuperación para acceder a información relevante bajo demanda. Al combinar mecanismos de recuperación con modelos de lenguaje, RAG mejora las respuestas al incorporar contexto externo. Este contexto externo puede proporcionarse como un vector de embedding.

La siguiente imagen muestra el flujo de pasos que seguiremos para crear nuestra aplicación.

  1. Leer del PDF (manual de usuario de Clarett en PDF) y tokenizar con un tamaño de fragmento de 1000 tokens.
  2. Crear un vector de embedding de estos tokens. Utilizaremos la biblioteca OpenAIEmbeddings para crear los vectores de embedding.
  3. Almacenar los vectores de embedding localmente. Utilizaremos ChromaDB simple como nuestro VectorDB. Podríamos utilizar Pinecone o cualquier otro VectorDB de calidad de producción más disponible en su lugar.
  4. El usuario emite una solicitud con la consulta/pregunta.
  5. Esto emite una búsqueda y recuperación desde el VectorDB para obtener datos contextualmente más relevantes del VectorDB.
  6. Estos datos contextuales se utilizarán ahora junto con la consulta/pregunta.
  7. El contexto enriquece la consulta. Esto se conoce normalmente como enriquecimiento del contexto.
  8. La consulta, junto con la pregunta y este contexto mejorado, se pasa ahora al LLM.
  9. El LLM responde en función de este contexto.

Utilizaremos el manual de usuario de Focusrite Clarett como un corpus adicional. Focusrite Clarett es una interfaz de audio USB simple para grabar y reproducir audio. Puede descargar el manual de usuario desde aquí.

Ponte en Acción

Configurar Entorno Virtual

Creemos un entorno virtual para aislar nuestra implementación y evitar conflictos de versiones/bibliotecas/dependencias. Ejecuta los siguientes comandos para crear un nuevo entorno virtual de Python

Crear una Clave de OpenAI

Necesitaremos una clave de OpenAI para acceder a GPT. Creemos una clave de OpenAI. Puedes crear la clave de OpenAI de forma gratuita registrándote en OpenAI aquí.

Una vez que te registres, inicia sesión y selecciona la API, Opción, como se muestra en la captura de pantalla (Los diseños de pantalla pueden cambiar desde que tomé la captura de pantalla)

Ve a la configuración de tu cuenta y selecciona “Ver claves de API”.

Selecciona “Crear nueva clave secreta” y verás un mensaje emergente como el siguiente. Proporciona un nombre y se generará una clave.

Esto generará una clave única, que debes copiar al portapapeles y almacenar en un lugar seguro.

Ahora escribamos el código Python para implementar todos los pasos mostrados en el diagrama de flujo anterior.

Instalar Dependencias

Instalemos las diversas dependencias que necesitaremos. Utilizaremos las siguientes bibliotecas:

  • Lanchain: Un framework para desarrollar aplicaciones de LLM.
  • ChromaDB: Este es el VectorDB para persistir vectores de embedding.
  • unstructured: Utilizado para el preprocesamiento de documentos Word/PDF.
  • tiktoken: Framework de tokenización.
  • pypdf: Framework para leer y procesar documentos PDF.
  • openai: Framework para acceder a OpenAI.

Una vez que estas dependencias se instalan correctamente, crea una variable de entorno para almacenar las claves de OpenAI que se crearon en el último paso.

Comencemos a codificar…

Crear Vectores de Incrustación a partir del Manual de Usuario en PDF y Almacenarlos en ChromaDB

En el siguiente código, estamos importando todas las bibliotecas y funciones dependientes que utilizaremos.

En el siguiente código, lee el PDF, tokeniza y divide el documento en tokens.

En el siguiente código, estamos creando una colección de chroma, un directorio local para almacenar la base de datos de chroma. Luego, creamos una incrustación de vector y la almacenamos en ChromaDB.

Después de ejecutar este código, deberías ver una carpeta creada que almacena las incrustaciones de vector.

Ahora tenemos las incrustaciones de vector almacenadas en ChromaDB. Ahora usemos la API ConversationalRetrievalChain en LangChain para iniciar un componente de historial de chat. Pasaremos el objeto OpenAI iniciado con GPT 3.5 turbo y el vectorDB que creamos. Pasaremos ConversationBufferMemory, que almacena los mensajes.

Ahora que hemos inicializado la cadena de recuperación de conversación, podemos usarla para chatear/Preguntas y Respuestas. En el siguiente código, aceptamos las entradas del usuario (preguntas) hasta que el usuario escriba ‘listo’. Luego pasamos las preguntas al LLM para obtener una respuesta e imprimirlo.

Aquí tienes la captura de pantalla de la salida.

Como puedes ver, la Generación Aumentada de Recuperación es una gran técnica que combina las fortalezas de los modelos de lenguaje como GPT-3 con el poder de la recuperación de información. Al enriquecer la entrada con información específica del contexto, RAG permite que los modelos de lenguaje generen respuestas más precisas y relevantes en el contexto. En casos de uso empresarial donde el ajuste fino puede no ser práctico, RAG ofrece una solución eficiente y rentable para proporcionar interacciones personalizadas e informadas con los usuarios.

Espero que esto haya sido útil. Por favor, comparte tus opiniones, comentarios y sugerencias. Mientras tanto, estaré publicando más blogs en este campo mientras exploro.

¡Que tengas un buen tiempo… Vuelvo enseguida!! Mientras tanto, mantente seguro…