Chroma est une base de données vectorielle open source qui utilise la technologie de recherche de similarité vectorielle pour stocker et récupérer efficacement des données vectorielles de grande dimension.

Chroma est une base de données intégrée à l'application qui est incorporée dans notre code sous forme de package. Son avantage réside dans sa simplicité. Si vous développez une application LLM qui nécessite une base de données vectorielle pour implémenter la mémoire LLM et prendre en charge la recherche de similarité de langage basée sur du texte, sans vouloir installer une base de données vectorielle indépendante, Chroma est un bon choix. Ce tutoriel est principalement basé sur JavaScript.

1. Installation du package

npm install --save chromadb # yarn add chromadb

2. Initialiser le client Chroma

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

3. Créer une collection

Une collection dans la base de données Chroma est similaire à une table dans Mysql, où sont stockées les données vectorielles (y compris les documents et autres données sources). Voici comment créer une collection :

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

Ici, un modèle d'encastrement de texte openai est utilisé pour calculer des vecteurs de texte, donc vous devez fournir votre clé d'api openai. Bien sûr, vous pouvez également omettre le paramètre embeddingFunction et utiliser le modèle intégré dans Chroma pour calculer des vecteurs, ou le remplacer par un autre modèle d'encastrement de texte open source.

4. Ajouter des données

Après avoir défini une collection, des données sont ajoutées à la collection, et Chroma stockera nos données et créera un index vectoriel dédié basé sur les vecteurs de données de texte pour une interrogation ultérieure facilitée.

await collection.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["Ceci est un document", "Ceci est un autre document"],
}) 

Utilisation de vecteurs de texte précalculés, sans utiliser la fonction d'encastrement intégrée de Chroma pour le calcul :

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: ["Ceci est un document", "Ceci est un autre document"]
}) 

5. Interroger les données de la collection

Sur la base des queryTexts définis pour les conditions d'interrogation, Chroma retournera les nResults résultats les plus similaires.

const results = await collection.query({
    nResults: 2, 
    queryTexts: ["Ceci est un document de requête"]
})