IA Generativa (GenAI)

Creación de aplicaciones RAG integrales con Couchbase Vector Search

Grandes modelos lingüísticos, conocidos popularmente como LLM, es uno de los temas más debatidos en la industria de la IA. Todos conocemos las posibilidades y capacidades de ChatGPT de OpenAI. Eventualmente usando esos LLMs a nuestro favor descubrimos un montón de nuevas posibilidades usando los datos.

Pero no se puede esperar todo de los LLM debido a sus limitaciones de diseño y a muchos otros factores. Pero utilizando el concepto de Búsqueda vectorial nos ofrece un nuevo tipo de aplicaciones llamadas Aplicaciones de Generación Aumentada de Recuperación (RAG). Así que vamos a ver qué son las aplicaciones RAG, cómo se pueden utilizar para hacer frente a nuevos problemas, cómo se pueden desarrollar utilizando Couchbase y tener una visión detallada de cómo Vector Search ayuda a hacer esas aplicaciones.

Antes de entrar en el fondo de la aplicación, aquí hay un diagrama de arquitectura de lo que estamos construyendo y cómo LangChain se vincula a ella:

Generación aumentada de recuperación (RAG)

El GAR permite aumentar los resultados de un LLM con información específica sin modificar el propio modelo subyacente, de modo que la información específica puede estar más actualizada que el LLM y ser específica de una organización y un sector concretos. Esto significa que el IA generativa puede proporcionar respuestas más adecuadas al contexto y basarlas en datos muy actuales. Comprendamos este concepto con un ejemplo de la vida real.

Digamos que perteneces a la organización X, que tiene una tonelada de datos almacenados en su base de datos, y estás a cargo del desarrollo de una aplicación que pide la entrada del usuario y da la salida basada en los datos presentes en su base de datos.

Al principio puedes pensar que esto parece fácil, ¿verdad? Si conoces los LLMs y cómo aprovecharlos para tus necesidades, entonces es una tarea sencilla. Sólo tienes que elegir los LLMs de OpenAI o los modelos Llama y Mistral si quieres ser rentable, y simplemente disparar preguntas de usuario al LLM y obtener los resultados. 

Pero aquí hay un gran problema...

Por ejemplo, supongamos que está utilizando la función Llama 2 LLM 8B tipo.

Ahora bien, este modelo está entrenado con casi todos los datos presentes en la Internet pública. Haces cualquier pregunta, incluso sobre tu org X, y te da la respuesta correcta más cercana.

Ahora hagamos un pequeño cambio en el enunciado de tu problema. La tonelada de datos que hay en tu base de datos ya no son datos públicos, sino privados. Lo que significa que Llama 2 desconoce tus datos y ya no te dará respuestas correctas.

Teniendo en cuenta el escenario anterior, consideremos la pregunta del usuario, "¿cuáles son las actualizaciones del componente C en org X?"

Entonces, ¿cómo solucionarlo?

Podrías pensar, ¿por qué no pasamos todos los datos presentes en la base de datos, junto con la pregunta, para que el LLM pueda utilizar los datos como contexto y responder a la pregunta? Pero aquí está el gran problema, todos los LLM tienen una restricción llamada límite simbólico. Sin entrar en qué son los tokens, etc., por ahora considera que 1 token == 1 palabra. 

Lamentablemente, el límite de tamaño de los tokens de Llama 2 es de 4096 tokens (palabras). Supongamos que la totalidad de los datos presentes en su base de datos tiene 10 millones de palabras, por lo que resulta imposible pasar la totalidad de los datos por motivos de contexto. 

La solución al problema anterior se llama RAG. En RAG, seleccionamos una proporción de datos presentes en su base de datos que está muy relacionada con la consulta del usuario. El tamaño de la proporción es tal que:

Tamaño de la proporción < límite de fichas

Ahora pasamos los datos extraídos como contexto junto con la consulta y obtenemos buenos resultados. Esto es RAG. Pero, ¿cómo obtenemos la proporción de datos que está estrechamente relacionada con la consulta del usuario y, al mismo tiempo, el tamaño no supera el tamaño del token? Esto se resuelve utilizando el concepto de Búsqueda vectorial.

¿Qué es la búsqueda vectorial?

La búsqueda vectorial aprovecha el aprendizaje automático (AM) para captar el significado y el contexto de los datos no estructurados, incluidos textos e imágenes, transformándolos en una representación numérica. Frecuentemente utilizada para la búsqueda semántica, la búsqueda vectorial encuentra datos similares mediante algoritmos de aproximación al vecino más cercano (RNA). 

Couchbase versión 7.6.0 y superior viene con esto Búsqueda vectorial. Lo importante aquí es que no se requieren librerías externas, módulos y configuraciones. Basta con tener al menos 1 busque en hace el trabajo.

Couchbase utiliza internamente Marco FAISS proporcionada por Facebook para realizar la búsqueda vectorial.

Creación de una aplicación RAG

Ahora pasemos a desarrollar una aplicación RAG de principio a fin utilizando la herramienta Funcionalidad de búsqueda vectorial de Couchbase.

En este tutorial, vamos a desarrollar un chatea con tus pdf aplicación.

Antes de seguir adelante, hay varias formas de crear la aplicación. Una de ellas es utilizando el framework LangChain que utilizaremos para desarrollar la aplicación RAG.

Aplicación 1: Construcción con el marco LangChain

Paso 1: Configurar una base de datos Couchbase 

Puedes configurar el servidor Couchbase en EC2, Máquina Virtual, tu máquina local, etc.

Siga este enlace para configurar el clúster Couchbase. Asegúrate de tener activados estos servicios, los demás son opcionales:

    • Datos
    • Buscar en

Nota: Asegúrese de instalar Couchbase Server versión 7.6.0 o superior para realizar búsquedas vectoriales. También desarrollaremos esta aplicación utilizando Python en el entorno Mac OS.

Una vez que el cluster esté en marcha, crea un nuevo proyecto <project_name> y crear un nuevo archivo Python llamado app.py.

Ahora, en el terminal del proyecto, ejecute el siguiente comando:

Ahora ve a la interfaz de usuario y crea un cubo llamado proyecto. Para este tutorial, utilizaremos el método por defecto alcance y recogida.

Ahora hay diferentes maneras de generar incrustaciones vectoriales. El más popular es OpenAI y lo usaremos para generar incrustaciones vectoriales.

Copie el código siguiente en app.py:

Si alojaste Couchbase en una VM, entonces asegúrate de reemplazar la palabra localhost a la ip pública de la máquina virtual.

Paso 2: Importar el índice de búsqueda

La función de búsqueda vectorial en Couchbase requiere un índice de búsqueda para funcionar. Hay varias maneras de crear el índice, pero para hacer las cosas fáciles y rápidas, a continuación es el índice JSON. Copia el código de abajo y pégalo:

  • INTERFAZ DE USUARIO > Buscar en > Añadir índice (arriba a la derecha) > Importar

Índice.json

Paso 3: Cargar los datos

Ahora es el momento de almacenar todos los datos PDF como trozos junto con sus incrustaciones vectoriales en la base de datos.


Nota: Lea esto blog detallado sobre fragmentación, recopilación de datos, etc.. Es muy recomendable consultar el blog para tener una idea clara de lo que vamos a tratar en los pasos posteriores.


Existen bibliotecas para los distintos tipos de documentos que desee cargar. Por ejemplo, si sus datos de origen están en .txt añada el siguiente código a su app.py:

Pero supongamos que su tipo de fuente es PDF, entonces:

No sólo es compatible con PDF, LangChain ofrece compatibilidad con múltiples tipos, como: 

    • CSV
    • HTML
    • JSON
    • Markdown y mucho más

Más información Cargadores de documentos Langchain.

Paso 4: Inferir los resultados

Ahora estamos listos para enviar consultas a nuestra aplicación:

App 2: Crear la app desde cero

Antes de empezar, como se describe en la sección anterior, cree su clúster con un bucket llamado proyecto. Siga también el paso 2 de la sección anterior, asegurándose de importar el índice de búsqueda.

Paso 1: Configuración de Couchbase

Si va a utilizar los valores por defecto, entonces su app.py debería tener este aspecto:

Ahora que los enlaces de la colección Couchbase y el índice de búsqueda están listos, pasemos a la parte de carga de datos.

Paso 2: Carga de datos

Para mantener las cosas modularizadas, crea un nuevo archivo Python llamado load.py.

Existen múltiples formas de extraer datos de archivos PDF. Para hacerlo más fácil, vamos a utilizar el pypdf de Langchain:

cargar.py

Ahora bien páginas es una lista de bloques de texto extraídos del pdf. Vamos a fusionar todo el contenido en una variable:

Antes de hacer el chunking, tenemos que configurar el modelo de incrustación. En este caso, utilizaremos el modelo transformadores de frases/paráfrasis-distilroberta-base-v1 de abrazar la cara.

Este modelo proporciona incrustaciones vectoriales de 768 dimensiones.

cargar.py

Ahora nuestro modelo está listo. Empujemos los documentos. Podemos utilizar el paquete divisor de texto de caracteres recursivos de Langchain.

Este paquete le da trozos del tamaño proporcionado, a continuación, vamos a encontrar la incrustación de vectores para cada trozo utilizando el modelo anterior y empujar el documento en la base de datos.

Así, el documento tendrá dos campos:

cargar.py

Ahora que nuestros trozos están listos, podemos encontrar las incrustaciones para cada trozo y enviarlo a la base de datos.

cargar.py

Me pregunto dónde está el cb_coll ¿de dónde viene? Es el conector de colección que creamos en app.py. Para pasarlo, vamos a envolver todo esto en cargar.py a una función que acepte cb_coll como parámetro.

Así que, finalmente su cargar.py debería verse así:

Ahora vamos a app.pyimporta esto y llama al cargar_datos función.

app.py

Ahora esto empujará los documentos en el formato requerido y nuestro índice de búsqueda también será mutado. Ahora es el momento de hacer la búsqueda vectorial.

Paso 3: Búsqueda vectorial

En Couchbase tienes múltiples formas de hacerlo, una de ellas es el método Curl.

En resultado.stdout contiene el k más cercano Doc IDs. Puede ampliar el script para realizar una solicitud get en todos los ID devueltos y combinar los resultados para obtener el contexto final. Luego pasamos este contexto junto con la solicitud al LLM para obtener los resultados deseados.

Referencias

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Sanjivani Patra - Ingeniero de software

1 Comentarios

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.