Chroma è un database vettoriale open source che utilizza la tecnologia di ricerca di similarità vettoriale per memorizzare ed estrarre in modo efficiente dati vettoriali ad alta dimensione su larga scala.

Chroma è un database incorporato nell'applicazione che viene integrato nel nostro codice sotto forma di un pacchetto. Il suo vantaggio risiede nella sua semplicità. Se stai sviluppando un'applicazione LLM che richiede un database vettoriale per implementare la memoria LLM e supportare la ricerca di similarità di testo, senza desiderare di installare un database vettoriale indipendente, Chroma è una buona scelta. Questo tutorial si basa principalmente su JavaScript.

1. Installazione del pacchetto

npm install --save chromadb # yarn add chromadb

2. Inizializzare il client Chroma

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

3. Creare una collezione

Una collezione nel database Chroma è simile a una tabella in MySQL, in cui vengono memorizzati dati vettoriali (inclusi documenti e altri dati di origine). Di seguito si crea una collezione:

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

Qui viene utilizzato un modello di incorporamento di testo openai per calcolare vettori di testo, quindi è necessario fornire la tua chiave API di openai. Naturalmente, è anche possibile omettere il parametro embeddingFunction e utilizzare il modello incorporato in Chroma per calcolare i vettori, o sostituirlo con un altro modello di incorporamento di testo open source.

4. Aggiungere dati

Dopo aver definito una collezione, i dati vengono aggiunti alla collezione e Chroma memorizzerà i nostri dati e creerà un indice vettoriale dedicato basato sui vettori dei dati di testo per facilitare le ricerche in seguito.

await collection.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["Questo è un documento", "Questo è un altro documento"],
}) 

Utilizzando vettori di testo pre-calcolati, senza utilizzare la funzione di incorporamento interna di Chroma per calcolare:

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: ["Questo è un documento", "Questo è un altro documento"]
}) 

5. Query dei dati della collezione

In base ai queryText impostati per le condizioni di interrogazione, Chroma restituirà i risultati più simili nResults.

const results = await collection.query({
    nResults: 2, 
    queryTexts: ["Questo è un documento di query"]
})