Guía de Chroma DB | Una Tienda de Vectores para tus LLMs Generativos de IA

Chroma DB Una tienda de vectores para tus LLMs generativos de IA

Introducción

Los Modelos Generativos de Lenguaje Amplio como GPT, PaLM, etc. se entrenan con grandes cantidades de datos. Estos modelos no toman los textos del conjunto de datos tal cual, porque las computadoras no entienden texto, solo entienden números. Los embeddings son la representación del texto pero en formato numérico. Toda la información hacia y desde los Modelos de Lenguaje Amplio se realiza a través de estos embeddings. Acceder directamente a estos embeddings es lento. Por lo tanto, lo que se llama Bases de Datos Vectoriales almacena estos embeddings específicamente diseñados para un almacenamiento y recuperación eficientes de los embeddings vectoriales. En esta guía, nos centraremos en una de estas bases de datos/vectoriales, Chroma DB, que es ampliamente utilizada y de código abierto.

Objetivos de Aprendizaje

  • Generar embeddings con ChromaDB y Modelos de Embedding
  • Crear colecciones dentro de la Tienda de Vectores Chroma
  • Almacenar documentos, imágenes y embeddings dentro de las colecciones
  • Realizar Operaciones de Colección como eliminar y actualizar datos, renombrar Colecciones
  • Finalmente, consultar las colecciones para extraer información relevante

Este artículo fue publicado como parte del Data Science Blogathon.

Breve Introducción a los Embeddings

Los Embeddings o Embeddings Vectoriales son una forma de representar datos (ya sean textos, imágenes, audio, videos, etc.) en formato numérico, para ser precisos, es una forma de representar datos en forma de números en un espacio n-dimensional (un vector numérico). De esta manera, los embeddings nos permiten agrupar datos similares. Hay modelos que toman estas entradas y las convierten en vectores. Un ejemplo de ello es Word2Vec, que es un modelo de embedding popular desarrollado por Google, que convierte palabras en vectores (los vectores son puntos con n-dimensiones). Todos los Modelos de Lenguaje Amplio tienen sus respectivos modelos de embedding, que crean embeddings para sus MLL.

¿Para qué se utilizan estos embeddings?

Lo bueno de convertir palabras en vectores es que podemos compararlos. Una computadora no puede comparar dos palabras tal cual son, pero si se las damos en forma de entradas numéricas, es decir, embeddings vectoriales, puede compararlos. Podemos crear un grupo de palabras que tengan embeddings similares. Las palabras Rey, Reina, Príncipe y Princesa aparecerán en un grupo porque están relacionadas entre sí.

De esta manera, los embeddings nos permiten encontrar palabras similares a una palabra dada. Podemos incorporar esto en frases, donde ingresamos una frase y obtenemos las frases relacionadas a partir de los datos proporcionados. Esta es la base para la Búsqueda Semántica, la Similitud de Frases, la Detección de Anomalías, los chatbots y muchos otros casos de uso. Los chatbots que construimos para realizar Preguntas y Respuestas a partir de un PDF o un documento aprovechan este mismo concepto de los embeddings. Todos los Modelos Generativos de Lenguaje Amplio utilizan este enfoque para obtener contenido relacionado de manera similar a las consultas proporcionadas.

Tienda de Vectores y la Necesidad de ellas

Como se mencionó, los embeddings son representaciones de cualquier tipo de datos, generalmente los no estructurados, en formato numérico en un espacio n-dimensional. Ahora, ¿dónde los almacenamos? Los Sistemas de Gestión de Bases de Datos Relacionales (RDMS, por sus siglas en inglés) tradicionales no se pueden utilizar para almacenar estos embeddings vectoriales. Aquí es donde entran en juego las Tiendas de Vectores o Bases de Datos Vectoriales. Las Bases de Datos Vectoriales están diseñadas para almacenar y recuperar embeddings vectoriales de manera eficiente. Hay muchas Tiendas de Vectores disponibles, que difieren en los modelos de embedding que admiten y en el tipo de algoritmo de búsqueda que utilizan para obtener vectores similares.

¿Por qué las necesitamos? Las necesitamos porque proporcionan un acceso rápido a los datos que necesitamos. Consideremos un chatbot basado en un PDF. Cuando un usuario ingresa una consulta, lo primero que se debe hacer es obtener el contenido relacionado del PDF con esa consulta y proporcionar esta información al chatbot. De esta manera, el chatbot puede utilizar esta información relacionada con la consulta para generar una respuesta relevante para el usuario. Ahora, ¿cómo obtenemos el contenido relevante del PDF relacionado con la consulta del usuario? La respuesta es una simple búsqueda de similitud.

Cuando los datos se representan en embeddings vectoriales, podemos encontrar similitudes entre diferentes partes de los datos y extraer los datos similares a un embedding en particular. Primero, la consulta se convierte en embeddings mediante un modelo de embedding y luego la Tienda de Vectores toma este embedding vectorial y realiza una búsqueda de similitud (a través de algoritmos de búsqueda) entre otros embeddings que tiene almacenados en su base de datos y recupera todos los datos relevantes. Estos embeddings vectoriales relevantes se pasan luego al Modelo de Lenguaje Amplio, que es el chatbot que utiliza esta información para generar una respuesta final al usuario.

¿Qué es Chroma DB?

Chroma es un Vector Store / Vector DB de la empresa Chroma. Chroma DB al igual que muchos otros Vector Stores, se utiliza para almacenar y recuperar incrustaciones de vectores. La buena parte es que Chroma es un proyecto gratuito y de código abierto. Esto le brinda a otros desarrolladores habilidosos la oportunidad de hacer sugerencias y realizar mejoras tremendas en la base de datos e incluso se puede esperar una respuesta rápida a un problema al tratar con software de código abierto, ya que toda la comunidad de código abierto está ahí para ver y resolver ese problema.

En la actualidad, Chroma no proporciona servicios de alojamiento. Al crear aplicaciones en torno a Chroma, almacene los datos localmente en el sistema de archivos local. Aunque Chroma planea construir un servicio de alojamiento en un futuro próximo. Chroma DB ofrece diferentes formas de almacenar incrustaciones de vectores. Puedes almacenarlos en la memoria, guardarlos y cargarlos en la memoria, o simplemente ejecutar Chroma como un cliente para comunicarte con el servidor backend. En general, Chroma DB solo tiene 4 funciones en la API, lo que lo hace corto, simple y fácil de comenzar.

Comencemos con Chroma DB

En esta sección, instalaremos Chroma y veremos todas las funcionalidades que ofrece. En primer lugar, instalaremos la biblioteca a través del comando pip

$ pip install chromadb

API de Chroma Vector Store

Esto descargará la API de Chroma Vector Store para Python. Con este paquete, podemos realizar todas las tareas, como almacenar las incrustaciones de vectores, recuperarlas y realizar una búsqueda semántica para una incrustación de vector dada.

import chromadb
from chromadb.config import Settings


client = chromadb.Client(Settings(chroma_db_impl="duckdb+parquet",
                                    persist_directory="/content/"
                                ))

Base de Datos en Memoria

Comenzaremos creando una base de datos persistente en memoria. El código anterior la creará para nosotros. Para crear un cliente, tomamos el objeto Client() de Chroma DB. Ahora, para crear una base de datos en memoria, configuramos nuestro cliente con los siguientes parámetros

  • chroma_db_impl = “duckdb+parquet”
  • persist_directory = “/content/”

Esto creará una base de datos DuckDB en memoria con el formato de archivo parquet. Y proporcionamos el directorio donde se almacenarán estos datos. Aquí estamos guardando la base de datos en la carpeta /content/. Por lo tanto, cada vez que nos conectemos a un cliente de Chroma DB con esta configuración, Chroma DB buscará una base de datos existente en el directorio proporcionado y la cargará. Si no está presente, la creará. Y cuando cerremos la conexión, los datos se guardarán en este directorio.

Ahora, crearemos una colección. Una colección en Vector Store es donde guardamos el conjunto de incrustaciones de vectores, documentos y cualquier metadato si está presente. Una colección en una base de datos de vectores se puede pensar como una tabla en una base de datos relacional.

Crear Colección y Agregar Documentos

Ahora crearemos una colección y agregaremos documentos a ella.

collection = client.create_collection("my_information")


collection.add(
    documents=["Este es un documento que contiene información sobre automóviles",
    "Este es un documento que contiene información sobre perros", 
    "Este documento contiene un catálogo de vehículos de cuatro ruedas"],
    metadatas=[{"fuente": "Libro de Autos"},{"fuente": "Libro de Perros"},{'fuente':'Información de Vehículos'}],
    ids=["id1", "id2", "id3"]
)
  • Aquí comenzamos creando una colección primero. Aquí nombramos la colección “my_information”.
  • A esta colección, agregaremos documentos. Aquí estamos agregando 3 documentos, en nuestro caso, simplemente estamos agregando tres frases como tres documentos. El primer documento trata sobre automóviles, el segundo trata sobre perros y el último trata sobre vehículos de cuatro ruedas.
  • Incluso estamos agregando los metadatos. Se proporciona metadatos para los tres documentos.
  • Cada documento debe tener un ID único, por lo tanto, les damos id1, id2 e id3.
  • Todo esto son como las variables para la función add() de la colección.
  • Después de ejecutar el código, agregamos estos documentos a nuestra colección “my_information”.

Bases de datos vectoriales

Aprendimos que la información almacenada en las bases de datos vectoriales se encuentra en forma de incrustaciones vectoriales. Pero aquí hemos proporcionado texto/archivos de texto, es decir, documentos. ¿Cómo los almacena entonces? Por defecto, Chroma DB utiliza un modelo de incrustación vectorialall-MiniLM-L6-v2 para crear las incrustaciones. Este modelo tomará nuestros documentos y los convertirá en incrustaciones vectoriales. Si queremos trabajar con una función de incrustación específica, como otros modelos de transformador de oraciones de HuggingFace o el modelo de incrustación de OpenAI, podemos especificarlo en la variable embeddings_function=nombre_de_la_funcion_de_incrustacion en el método create_collection().

También podemos proporcionar directamente las incrustaciones a la tienda vectorial, en lugar de pasar los documentos a ella. Al igual que el parámetro de documento en create_collection, tenemos un parámetro de incrustación, al que pasamos las incrustaciones que queremos almacenar en la base de datos vectorial.

Ahora el modelo ha almacenado con éxito nuestros tres documentos en forma de incrustaciones vectoriales en la tienda vectorial. Ahora, veremos cómo recuperar documentos relevantes de ellos. Pasaremos una consulta y obtendremos los documentos relevantes a ella. El código correspondiente para esto será

results = collection.query(
    query_texts=["Coche"],
    n_results=2
)


print(results)

Consultar una Tienda Vectorial

  • Para consultar una tienda vectorial, tenemos una función query() proporcionada por las colecciones que nos permite consultar la base de datos vectorial en busca de documentos relevantes. En esta función, proporcionamos dos parámetros
  • query_texts – A este parámetro le damos una lista de consultas para las cuales necesitamos extraer los documentos relevantes.
  • n_results – Este parámetro especifica cuántos resultados principales debe devolver la base de datos. En nuestro caso, queremos que nuestra colección devuelva los 2 documentos más relevantes relacionados con la consulta.
  • Cuando ejecutamos e imprimimos los resultados, obtenemos la siguiente salida

Vemos que la tienda vectorial devuelve dos documentos asociados con id1 e id3. El id1 es el documento sobre coches y el id3 es el documento sobre vehículos de cuatro ruedas, que está relacionado con un coche nuevamente. Entonces, cuando proporcionamos una consulta, Chroma DB convierte la consulta en una incrustación vectorial con el modelo de incrustación que proporcionamos al principio. Luego, esta incrustación vectorial realiza una búsqueda semántica (vecinos más cercanos similares) en todos los documentos disponibles. La consulta aquí “coche” es más relevante para los documentos id1 e id3, por lo tanto, obtenemos el siguiente resultado para la consulta.

Esto es muy útil cuando intentamos construir una aplicación de chat que incluye múltiples documentos. A través de una tienda vectorial, podemos obtener los documentos relevantes para la consulta proporcionada realizando una búsqueda semántica y alimentando solo estos documentos al modelo final de IA generativa, que luego tomará estos documentos relevantes y generará una respuesta a la consulta proporcionada.

Actualización y eliminación de datos

No siempre agregamos toda la información de una vez a la tienda vectorial. En la mayoría de los casos, solo tenemos datos/documentos limitados al principio, que agregamos tal cual a la tienda vectorial. Más adelante, cuando obtenemos más datos, se vuelve necesario actualizar los datos/incrustaciones vectoriales existentes en la tienda vectorial. Para actualizar datos en Chroma DB, hacemos lo siguiente

collection.update(
    ids=["id2"],
    documents=["Este es un documento que contiene información sobre gatos"],
    metadatas=[{"source": "Libro de gatos"}],
)

Anteriormente, la información en el documento asociado con id2 era sobre perros. Ahora lo estamos cambiando a gatos. Para que esta información se actualice en la tienda vectorial, pasamos el ID del documento, el documento actualizado y los metadatos actualizados del documento a la función update() de las colecciones. Esto actualizará el id2 a gatos, que anteriormente era sobre perros.

Consulta en la base de datos

resultados = colección.query(
    query_texts=["Felinos"],
    n_results=1
)


print(resultados)

Pasamos “Felinos” como consulta al Vector Store. Los gatos pertenecen a la familia de mamíferos llamada Felinos. Por lo tanto, la colección debe devolver el documento de gato como documento relevante para nosotros. En la salida, podemos ver exactamente lo mismo. El Vector Store pudo realizar una búsqueda semántica entre la consulta y el contenido de los documentos y pudo devolver el documento perfecto para la consulta proporcionada.

La función Upset

Hay una función similar a la función de actualización llamada la función upsert(). La única diferencia entre ambas funciones, update() y upsert(), es que si el ID del documento especificado en la función update() no existe, la función update() generará un error. Pero en el caso de la función upsert(), si el ID del documento no existe en la colección, se agregará a la colección de manera similar a la función add().

A veces, para reducir el espacio o eliminar información innecesaria/no deseada, es posible que deseemos eliminar algunos documentos de la colección en el Vector Store.

colección.delete(ids = ['id1'])


resultados = colección.query(
    query_texts=["Coche"],
    n_results=2
)


print(resultados)

La función de eliminación

Para eliminar un elemento de una colección, tenemos la función delete(). En el ejemplo anterior, estamos eliminando el primer documento asociado con id1, que se trataba de coches. Ahora, para verificar, consultamos la colección con “coche” como consulta y luego vemos los resultados. Vemos que solo aparecen 2 documentos id2 e id3, donde id2 es el documento sobre vehículos de cuatro ruedas que están más cerca de los coches y id3 es el documento sobre gatos que está menos cerca de los coches, pero como especificamos n_results = 2, también obtenemos id3. Si no especificamos ninguna variable en la función delete(), entonces todos los elementos se eliminarán de esa colección.

Funciones de la colección

Hemos visto cómo crear una nueva colección y luego agregar documentos y embeddings a ella. Incluso hemos visto cómo extraer información relevante para una consulta de la colección, es decir, de los documentos almacenados en el Vector Store. El objeto de colecciones de Chroma DB también está asociado con muchas otras funciones útiles.

Echemos un vistazo a algunas otras funcionalidades proporcionadas por Chroma DB

nuevas_colecciones = cliente.create_collection("nueva_coleccion")


nuevas_colecciones.add(
    documents=["Esta es la documentación de Python",
               "Esta es la documentación de JavaScript",
               "Este documento contiene una hoja de trucos de API de Flask"],
    metadatas=[{"fuente": "Python para todos"},
    {"fuente": "JS Docs"},
    {'fuente':'Todo Flask'}],
    ids=["id1", "id2", "id3"]
)


print(nuevas_colecciones.count())
print(nuevas_colecciones.get())

La función de conteo

La función count() de las colecciones devuelve el número de elementos presentes en la colección. En nuestro caso, tenemos 3 documentos almacenados en nuestra colección, por lo tanto, la salida será 3. En cuanto a la función get(), devolverá todos los elementos que están presentes en nuestra colección junto con los metadatos, ids y embeddings si los hay. En la salida, vemos que todos los elementos que tenemos en nuestra colección se obtienen mediante el comando get(). Ahora veamos cómo modificar el nombre de la colección.

collection.modify(name="new_collection_name")

La función Modificar

Utilice la función modify() de collections para cambiar el nombre de la colección que se dio al inicio de la creación de la colección. Cuando se ejecute, cambie el nombre de la colección desde el nombre antiguo que se definió al inicio al nuevo nombre proporcionado en la función modify() bajo la variable de nombre. Ahora supongamos que tenemos varias colecciones en nuestro Vector Store. ¿Cómo trabajar en una colección específica, es decir, cómo obtener una colección específica del Vector Store y cómo eliminar una colección específica? Veamos esto

my_collection = client.get_collection(name="my_information_2")

client.delete_collection(name="my_information_2")

La función Obtener Colección

La función get_collection() obtendrá una colección existente proporcionada el nombre, del Vector Store. Si la colección proporcionada no existe, la función generará un error por lo mismo. Aquí, la función get_collection() intentará obtener la colección my_information_2 y la asignará a la variable my_collection. Para eliminar una colección existente, tenemos la función delete_collection(), que toma el nombre de la colección como parámetro (my_information en este caso) y luego la elimina, si existe.

Conclusión

En esta guía, hemos visto cómo comenzar con Chroma, una de las Bases de Datos Vectoriales de Código Abierto. Inicialmente, comenzamos aprendiendo qué son los vectores de inserción, por qué son necesarios para los modelos de IA generativos y cómo las Bases de Datos Vectoriales ayudan a estos Modelos de Lenguaje Generativos de Gran Tamaño. Luego nos sumergimos en Chroma y vimos cómo crear colecciones en Chroma. Luego vimos cómo agregar datos como documentos a Chroma y cómo Chroma DB crea vectores de inserción a partir de ellos. Finalmente, hemos visto cómo recuperar información relevante relacionada con la consulta dada de una colección específica presente en el Vector Store.

Algunas de las principales conclusiones de esta guía incluyen:

  • Los Vectores de Inserción son representaciones numéricas (vectores numéricos) de datos no numéricos como texto, imágenes, audio, etc.
  • Las Bases de Datos Vectoriales son las bases de datos que se utilizan para almacenar los vectores de inserción en forma de colecciones.
  • Proporcionan almacenamiento y recuperación eficientes de información a partir de los datos de inserción.
  • Chroma DB puede funcionar tanto como una base de datos en memoria como como una base de datos de respaldo.
  • Chroma DB tiene la funcionalidad de almacenar los datos al salir y cargar los datos en memoria al iniciar una conexión, lo que permite persistir los datos.
  • Con las Bases de Datos Vectoriales, será mucho más sencillo extraer información de documentos, generar recomendaciones y crear aplicaciones de chatbot.

Preguntas frecuentes

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Conoce a CodiumAI El Asistente Definitivo para Pruebas Basado en Inteligencia Artificial para Desarrolladores

En el mundo acelerado del desarrollo de software, escribir pruebas a menudo se considera una tarea tediosa que lleva ...

Inteligencia Artificial

Conoce Jupyter AI Desatando el poder de la inteligencia artificial en los cuadernos de Jupyter

En un avance innovador en inteligencia artificial y codificación, Project Jupyter presenta una adición revolucionaria...

Inteligencia Artificial

Investigadores de Meta IA publican como código abierto Pearl una biblioteca de agentes de IA de aprendizaje por refuerzo lista para la producción.

Aprendizaje por refuerzo (RL) es un subcampo del aprendizaje automático en el cual un agente toma acciones adecuadas ...

Inteligencia Artificial

Investigadores de Stanford y Microsoft presentan Inteligencia Artificial de Auto-Mejora Aprovechando GPT-4 para elevar el rendimiento del programa de andamiaje.

Casi todos los objetivos descritos en lenguaje natural pueden optimizarse mediante la consulta a un modelo de lenguaj...