Logotipo de Zephyrnet

Guía de Chroma DB | Una tienda de vectores para sus LLM de IA generativa

Fecha:

Introducción

Los modelos generativos de lenguaje grande como GPT, PaLM, etc. se entrenan con grandes cantidades de datos. Estos modelos no toman los textos del conjunto de datos tal como son, porque las computadoras no entienden el texto, solo entienden los números. Las incrustaciones son la representación del texto pero en formato numérico. Toda la información hacia y desde los modelos de lenguaje grande se obtiene a través de estas incrustaciones. Acceder a estas incrustaciones directamente lleva mucho tiempo. Por lo tanto, lo que se denomina bases de datos vectoriales almacena estas incrustaciones diseñadas específicamente para el almacenamiento y la recuperación eficientes de incrustaciones de vectores. En esta guía, nos centraremos en una de esas bases de datos/almacén de vectores, Chroma DB, que es ampliamente utilizada y de código abierto.

OBJETIVOS DE APRENDIZAJE

  • Generación de incrustaciones con ChromaDB y Modelos de incrustación
  • Creación de colecciones dentro de Chroma Vector Store
  • Almacenamiento de documentos, imágenes e incrustaciones dentro de las colecciones.
  • Realización de 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 Blogatón de ciencia de datos.

Tabla de contenidos.

Breve introducción a las incrustaciones

Las incrustaciones o incrustaciones vectoriales son una forma de representar datos (ya sea texto, 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, las incrustaciones nos permiten agrupar datos similares. Hay modelos que toman estas entradas y las convierten en vectores. Un ejemplo de ello es el Palabra2Vec, que es un popular modelo de incrustación desarrollado por Google, que convierte palabras en vectores (los vectores son puntos que tienen n dimensiones). Todos los modelos de lenguaje grande tienen sus respectivos modelos de incrustación, que crean incrustaciones para su LLM.

¿Para qué se utilizan estas incrustaciones?

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

De esta manera, las incrustaciones nos permiten encontrar palabras similares a una palabra dada. Podemos incorporar esto en oraciones, donde ingresamos una oración y obtenemos las oraciones relacionadas de los datos provistos. Esta es la base para la búsqueda semántica, la similitud de oraciones, la detección de anomalías, el chatbot y muchos más casos de uso. Los chatbots que construimos para responder preguntas desde un PDF o documento dado, aprovechan este mismo concepto de incrustaciones. Todos los Modelos Generativos de Lenguaje Grande utilizan este enfoque para obtener contenido similarmente relacionado con las consultas que se les proporcionan.

Tienda de vectores y la necesidad de ellos

Como se discutió, las incrustaciones son representaciones de cualquier tipo de datos, por lo general, los no estructurados en formato numérico en un espacio n-dimensional. Ahora, ¿dónde los almacenamos? Los RDMS tradicionales (Sistemas de gestión de bases de datos relacionales) no se pueden utilizar para almacenar estas incrustaciones de vectores. Aquí es donde entran en juego Vector Store / Vector Dabases. Las bases de datos de vectores están diseñadas para almacenar y recuperar incrustaciones de vectores de manera eficiente. Existen muchas tiendas de vectores, que se diferencian por los modelos de incrustación que admiten y el tipo de algoritmo de búsqueda que utilizan para obtener vectores similares.

¿Por qué los necesitamos? Los necesitamos porque brindan acceso rápido a los datos que necesitamos. Consideremos un Chatbot basado en un PDF. Ahora, cuando un usuario ingresa una consulta, lo primero será obtener contenido relacionado de PDF para esa consulta y enviar esta información al Chatbot. Para que el Chatbot pueda tomar esta información relacionada con la consulta y probar la respuesta relevante al 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 incrustaciones de vectores, podemos encontrar similitudes entre diferentes partes de los datos y extraer los datos similares a una incrustación particular. La consulta se convierte primero en incrustaciones mediante un modelo de incrustaciones y luego Vector Store toma esta incrustación de vectores y luego realiza una búsqueda de similitud (a través de algoritmos de búsqueda) entre otras incrustaciones que ha almacenado en su base de datos y obtiene todos los datos relevantes. Estas incrustaciones de vectores relevantes luego se pasan al modelo de lenguaje grande, que es el chatbot que usa esta información para generar una respuesta final para el usuario.

¿Qué es ChromaDB?

Chroma es un Vector Store / Vector DB de la empresa Chroma. Chroma DB, como muchas otras tiendas de vectores, es para almacenar y recuperar incrustaciones de vectores. Lo bueno es que Chroma es un proyecto gratuito y de código abierto. Esto le da a otros desarrolladores calificados en el mundo la oportunidad de dar sugerencias y realizar mejoras tremendas en la base de datos e incluso uno puede esperar una respuesta rápida a un problema cuando se trata de 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 ningún servicio de alojamiento. Almacene los datos localmente en el sistema de archivos local al crear aplicaciones alrededor de Chroma. Aunque Chroma planea construir un servicio de alojamiento en un futuro próximo. Chroma DB ofrece diferentes formas de almacenar incrustaciones de vectores. Puede almacenarlos en la memoria, puede guardarlos y cargarlos en la memoria, puede simplemente ejecutar Chroma como cliente para hablar con el servidor back-end. En general, Chroma DB tiene solo 4 funciones en la API, por lo que es breve, simple y fácil de usar.

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 tienda de vectores de croma

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 de una incrustación de vectores determinada.

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

Base de datos de memoria

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

  • croma_db_impl = “patodb+parquet”
  • directorio_persistente = “/contenido/”

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/. Entonces, siempre que nos conectemos a un cliente Chroma DB con esta configuración, Chroma DB buscará una base de datos existente en el directorio provisto y la cargará. Si no está presente, lo creará. Y cuando cerremos la conexión, los datos se guardarán en este directorio.

Ahora, vamos a crear una colección. La colección en Vector Store es donde guardamos el conjunto de incrustaciones de vectores, documentos y cualquier metadato, si está presente. La colección en una base de datos vectorial se puede considerar como una tabla en una base de datos relacional.

Crear colección y agregar documentos

Ahora crearemos una colección y le agregaremos documentos.

collection = client.create_collection("my_information") collection.add( documents=["This is a document containing car information", "This is a document containing information about dogs", "This document contains four wheeler catalogue"], metadatas=[{"source": "Car Book"},{"source": "Dog Book"},{'source':'Vechile Info'}], ids=["id1", "id2", "id3"]
)
  • Aquí comenzamos creando una colección primero. Aquí nombramos la colección “mi informacion.
  • A esta colección iremos añadiendo documentos. Aquí estamos agregando 3 documentos, en nuestro caso, solo estamos agregando tres oraciones como tres documentos. El primer documento es sobre automóviles, el segundo sobre perros y el último sobre vehículos de cuatro ruedas.
  • Incluso estamos agregando los metadatos. Se proporcionan metadatos para los tres documentos.
  • Cada documento debe tener una identificación única, por lo tanto, les estamos dando id1, id2 e id3.
  • Todos estos son como las variables de la añadir() función de la colección
  • Después de ejecutar el código, agregue estos documentos a nuestra colección "mi informacion"

Bases de datos vectoriales

Aprendimos que la información almacenada en las bases de datos vectoriales está en forma de incrustaciones de vectores. Pero aquí, proporcionamos archivos de texto/texto, es decir, documentos. Entonces, ¿cómo los almacena? Chroma DB por defecto, utiliza un todo-MiniLM-L6-v2 modelo de incrustación vectorial para crear las incrustaciones para nosotros. 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 transformación de oraciones de HuggingFace o el modelo de incrustación de OpenAI, podemos especificarlo en el incrustaciones_función=incrustación_función_nombre nombre de la variable en el crear_coleccion() método.

También podemos proporcionar incrustaciones directamente a Vector Store, en lugar de pasarle los documentos. Al igual que el parámetro del documento en crear_coleccion, tenemos una incrustación parámetro, al que le pasamos las incrustaciones que queremos almacenar en la Base de Datos Vectorial.

Así que ahora el modelo ha almacenado con éxito nuestros tres documentos en forma de incrustaciones de vectores en el almacén de vectores. Ahora, veremos cómo recuperar documentos relevantes de ellos. Pasaremos una consulta y buscaremos los documentos que son relevantes para ella. El código correspondiente para esto será

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

Consulta una tienda de vectores

  • Para consultar una tienda de vectores, tenemos un consulta() función proporcionada por las colecciones que nos permite consultar la base de datos de vectores para documentos relevantes. En esta función, proporcionamos dos parámetros.
  • consulta_textos – A este parámetro, le damos una lista de consultas para las que necesitamos extraer los documentos relevantes.
  • n_resultados – 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 el siguiente resultado
consulta una tienda de vectores | base de datos de croma

Vemos que la tienda de vectores devuelve dos documentos asociados con id1 y id3. id1 es el documento sobre los coches y el id3 es el documento cantidad vehículos de cuatro ruedas, que se relaciona con un automóvil nuevamente. Así que cuando dimos un pregunta, Chrom DB convierte la consulta en una incrustación de vector con el modelo de incrustación que proporcionamos al principio. Luego, esta incrustación de vectores realiza una búsqueda semántica (vecinos más cercanos similares) en todos los documentos disponibles. La consulta aquí”de” es más relevante para los documentos id1 e id3, por lo que obtenemos el siguiente resultado para la consulta.

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

Actualización y eliminación de datos

No siempre añadimos toda la información a la vez a Vector Store. En la mayoría de los casos, solo tenemos datos/documentos limitados al principio, que agregamos tal cual a Vector Store. Más adelante en el tiempo, cuando obtengamos más datos, será necesario actualizar las incrustaciones de datos/vectores existentes presentes en Vector Store. Para actualizar datos en Chroma DB, hacemos lo siguiente

collection.update( ids=["id2"], documents=["This is a document containing information about Cats"], metadatas=[{"source": "Cat Book"}],
)

Previamente, 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 dentro de Vector Store, pasamos la identificación del documento, el documento actualizado y los metadatos actualizados del documento al actualizar() Función de las colecciones. Esto ahora actualizará el id2 to Cats, que anteriormente trataba sobre Dogs.

Consulta en base de datos

results = collection.query( query_texts=["Felines"], n_results=1
) print(results)
consulta en base de datos | base de datos de croma

Pasamos en Felinos como la consulta a la Tienda Vector. Los gatos pertenecen a la familia de mamíferos llamados felinos. Por lo tanto, la colección debe devolvernos el documento Cat como el documento relevante. En la salida, podemos ver exactamente lo mismo. El almacén de vectores pudo realizar una búsqueda semántica entre la consulta y el contenido de los documentos y pudo devolver el documento perfecto a la consulta proporcionada.

La función molesta

Hay una función similar a la función de actualización llamada insertar() función. La única diferencia entre ambos actualizar() y insertar() función es, si el ID del documento especificado en el actualizar() la función no existe, la actualizar() la función generará un error. Pero en el caso de la insertar() función, si la identificación del documento no existe en la colección, entonces se agregará a la colección similar a la añadir() función.

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

collection.delete(ids = ['id1']) results = collection.query( query_texts=["Car"], n_results=2
) print(results)
la función trastornada | base de datos de croma

La función de eliminación

Para eliminar un elemento de una colección, tenemos el eliminar () función. En lo anterior, estamos eliminando el primer documento asociado con id1 que era sobre autos. Ahora para verificar, consultamos la colección con el "de” como la consulta y luego ver los resultados. Vemos que solo 2 documentos id2 y id3 aparecer, donde el id2 es el documento sobre los cuatriciclos que más se acercan a los coches y id3 es el documento sobre gatos que menos se acerca a los coches, pero como especificamos n_resultados = 2 obtenemos el id3 también. Si no especificamos ninguna variable a la eliminar () función, entonces todos los elementos se eliminarán de esa colección

Funciones de colección

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

Veamos algunas otras funcionalidades proporcionadas por Chroma DB

new_collections = client.create_collection("new_collection") new_collections.add( documents=["This is Python Documentation", "This is a Javascript Documentation", "This document contains Flast API Cheatsheet"], metadatas=[{"source": "Python For Everyone"}, {"source": "JS Docs"}, {'source':'Everything Flask'}], ids=["id1", "id2", "id3"]
) print(new_collections.count())
print(new_collections.get())
funciones de cobro | base de datos de croma

La función de conteo

La contar() La función 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 que la salida será 3. Llegando a la get () función, devolverá todos los artículos que están presentes en nuestra colección junto con el metadatos, idsy incrustaciones Si alguna. En la salida, vemos que todos los artículos que tenemos en nuestra colección tienen que pasar por el get () dominio. Veamos ahora cómo modificar el nombre de la colección.

collection.modify(name="new_collection_name")

La función de modificación

Ingrese al modificar() función from collections para cambiar el nombre de la colección que se le dio al inicio de la creación de la colección. Cuando se ejecute, cambie el nombre de la colección del antiguo nombre que se definió al principio al nuevo nombre proporcionado en el modificar() función bajo la variable de nombre. Supongamos ahora que tenemos varias colecciones en nuestra Tienda de vectores. ¿Cómo trabajar en una colección específica, es decir, cómo obtener una colección específica de 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 obtener_coleccion() La función buscará una colección existente siempre que el nombre , de la Tienda de vectores. Si la colección proporcionada no existe, la función generará un error para la misma. Aquí el obtener_coleccion() tratará de conseguir el mi_información_2 colección y asignarlo a la variable mi colección. Para eliminar una colección existente, tenemos la eliminar_colección() función, que toma el nombre de la colección como parámetro (mi informacion en este caso) y luego lo 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 las incrustaciones de vectores, por qué son necesarias para los modelos de IA generativa y cómo las tiendas de vectores ayudan a estos modelos generativos de lenguaje grande. Luego profundizamos en Chroma y hemos visto cómo crear colecciones en Chroma. Luego analizamos cómo agregar datos como documentos a Chroma y cómo Chroma DB crea incrustaciones de vectores a partir de ellos. Finalmente, hemos visto cómo recuperar información relevante relacionada con la consulta dada de una colección particular presente en Vector Store.

Algunos de los puntos clave de esta guía incluyen:

  • Las incrustaciones de vectores son representaciones numéricas (vectores numéricos) de datos no numéricos como texto, imágenes, audio, etc.
  • Las tiendas de vectores son las bases de datos que se utilizan para almacenar las incrustaciones de vectores en forma de colecciones.
  • Proporcionan un almacenamiento y una recuperación eficientes de la información de los datos incorporados.
  • Chroma DB puede funcionar como base de datos en memoria y como backend
  • Chroma DB tiene la funcionalidad de almacenar los datos al salir y cargar los datos en la memoria al iniciar una conexión, conservando así los datos
  • Con Vector Stores, extraer información de documentos, generar recomendaciones y crear aplicaciones de chatbot será mucho más sencillo

Preguntas frecuentes

Q1. ¿Qué son las bases de datos de vectores/almacenes de vectores?

A. Las bases de datos de vectores son el lugar donde se almacenan las incrustaciones de vectores. Estos existen porque proporcionan una recuperación eficiente de incrustaciones de vectores. Se utilizan para extraer información relevante para la consulta de su base de datos a través de la búsqueda semántica.

Q2. ¿Qué son las incrustaciones de vectores?

A. Las incrustaciones de vectores son representaciones de texto/imagen/audio/videos en un formato numérico en un espacio n-dimensional, generalmente como un vector numérico. Esto se hace porque las computadoras no entienden texto, imágenes o cualquier otro dato no numérico de forma nativa. Entonces, estas incrustaciones les permiten comprender bien los datos porque se presentan en un formato numérico.

Q3. ¿Qué son los modelos incrustados?

R. Los modelos de incrustación son los que convierten datos no numéricos como texto/imágenes en un formato numérico que son incrustaciones de vectores. Chroma DB utiliza de forma predeterminada el modelo all-MiniLM-L6-v2 para crear incrustaciones. Además de estos modelos, hay muchos otros como Word2Vec de Google, el modelo OpenAI Embedding, otros Sentence Transformers de HuggingFace y muchos más.

Q4. ¿Dónde se podrían usar estos vectores incorporados/bases de datos vectoriales?

R. Estas tiendas de vectores encuentran sus aplicaciones en casi todo lo que implica modelos de IA generativa. Como extraer información de documentos, generar imágenes a partir de indicaciones dadas, crear un sistema de recomendaciones, agrupar datos relevantes y mucho más.

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

punto_img

Información más reciente

punto_img