Chroma é um banco de dados de vetores de código aberto que utiliza a tecnologia de busca de similaridade de vetores para armazenar e recuperar eficientemente dados de vetor de alta dimensão em grande escala.

Chroma é um banco de dados incorporado à aplicação que é incorporado em nosso código na forma de um pacote. Sua vantagem reside em sua simplicidade. Se você estiver desenvolvendo uma aplicação de LLM que requer um banco de dados de vetor para implementar a memória LLM e suportar a pesquisa de linguagem de similaridade de texto, sem querer instalar um banco de dados de vetor independente, Chroma é uma boa escolha. Este tutorial é principalmente baseado em JavaScript.

1. Instalação do pacote

npm install --save chromadb # yarn add chromadb

2. Inicializar cliente Chroma

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

3. Criar uma coleção

Uma coleção no banco de dados Chroma é similar a uma tabela no Mysql, onde dados de vetor (incluindo documentos e outros dados de origem) são armazenados. Abaixo cria uma coleção:

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

Aqui, um modelo de incorporação de texto da openai é usado para calcular vetores de texto, então você precisa fornecer sua chave de api da openai. Claro, você também pode omitir o parâmetro embeddingFunction e usar o modelo incorporado no Chroma para calcular vetores, ou substituí-lo por outro modelo de incorporação de texto de código aberto.

4. Adicionar dados

Após definir uma coleção, os dados são adicionados à coleção e o Chroma irá armazenar nossos dados e criar um índice de vetores dedicado com base nos vetores de dados de texto para uma consulta posterior fácil.

await collection.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["Este é um documento", "Este é outro documento"],
}) 

Usando vetores de texto pré-calculados, sem usar a função de incorporação incorporada do 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 é um documento", "Este é outro documento"]
}) 

5. Consultar dados da coleção

Com base nos queryTexts definidos para condições de consulta, o Chroma retornará os resultados mais similares nResults.

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