Chroma es una base de datos de vectores de código abierto que utiliza la tecnología de búsqueda de similitud de vectores para almacenar y recuperar eficientemente datos vectoriales de gran escala y alta dimensionalidad.

Chroma es una base de datos incrustada en la aplicación que se integra en nuestro código en forma de paquete. Su ventaja radica en su simplicidad. Si estás desarrollando una aplicación LLM que requiere una base de datos de vectores para implementar la memoria LLM y admitir la búsqueda de lenguaje de similitud de texto, sin desear instalar una base de datos de vectores independiente, Chroma es una buena opción. Este tutorial se basa principalmente en JavaScript.

1. Instalación del paquete

npm install --save chromadb # yarn add chromadb

2. Inicializar el cliente Chroma

const {ChromaClient} = require('chromadb');
const client = new ChromaClient();

3. Crear una colección

Una colección en la base de datos de Chroma es similar a una tabla en Mysql, donde se almacenan datos vectoriales (incluidos documentos y otros datos fuente). A continuación se crea una colección:

const {OpenAIEmbeddingFunction} = require('chromadb');
const embedder = new OpenAIEmbeddingFunction({openai_api_key: "your_api_key"})
const collection = await client.createCollection({name: "my_collection", embeddingFunction: embedder})

Aquí, se utiliza un modelo de inserción de texto de openai para calcular vectores de texto, por lo que debes proporcionar tu clave de api de openai. Por supuesto, también puedes omitir el parámetro embeddingFunction y usar el modelo incorporado en Chroma para calcular vectores, o reemplazarlo por otro modelo de inserción de texto de código abierto.

4. Agregar datos

Después de definir una colección, se agregan datos a la colección, y Chroma almacenará nuestros datos y creará un índice vectorial dedicado basado en los vectores de datos de texto para facilitar consultas posteriores.

await collection.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["Este es un documento", "Este es otro documento"],
}) 

Usando vectores de texto precalculados, sin usar la función de inserción incorporada de Chroma para calcular:

await collection.add({
    ids: ["id1", "id2"],
    embeddings: [[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
    where: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["Este es un documento", "Este es otro documento"]
}) 

5. Consultar datos de la colección

Basándose en los queryTexts establecidos para las condiciones de consulta, Chroma devolverá los resultados más similares nResults.

const results = await collection.query({
    nResults: 2, 
    queryTexts: ["Este es un documento de consulta"]
})