Chroma ist eine Open-Source-Vektordatenbank, die die Technologie der Vektorähnlichkeitssuche nutzt, um große Mengen hochdimensionaler Vektordaten effizient zu speichern und abzurufen.

Chroma ist eine in Form eines Pakets in unsere Anwendung eingebettete Datenbank. Ihr Vorteil liegt in ihrer Einfachheit. Wenn Sie eine LLM-Anwendung entwickeln, die eine Vektordatenbank zur Implementierung von LLM-Speicher und Unterstützung der sprachähnlichen Textsuche benötigt, ohne eine unabhängige Vektordatenbank installieren zu wollen, ist Chroma eine gute Wahl. Dieses Tutorial basiert hauptsächlich auf JavaScript.

1. Paketinstallation

npm install --save chromadb # yarn add chromadb

2. Initialisieren des Chroma-Clients

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

3. Erstellen einer Sammlung

Eine Sammlung in der Chroma-Datenbank ähnelt einer Tabelle in Mysql, in der Vektordaten (einschließlich Dokumenten und anderer Quelldaten) gespeichert werden. Unten wird eine Sammlung erstellt:

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

Hier wird ein OpenAI-Text-Einbettungsmodell verwendet, um Textvektoren zu berechnen. Daher müssen Sie Ihren OpenAI-API-Schlüssel angeben. Sie können natürlich auch den Parameter embeddingFunction weglassen und das integrierte Modell in Chroma zur Berechnung von Vektoren verwenden oder es durch ein anderes Open-Source-Texteinbettungsmodell ersetzen.

4. Daten hinzufügen

Nach Definition einer Sammlung werden Daten zur Sammlung hinzugefügt, und Chroma speichert unsere Daten und erstellt einen dedizierten Vektorindex basierend auf den Textdatenvektoren für spätere einfache Abfragen.

await collection.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["This is a document", "This is another document"],
}) 

Verwenden vorberechneter Textvektoren, ohne die eingebaute Einbettungsfunktion von Chroma zur Berechnung zu verwenden:

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: ["This is a document", "This is another document"]
}) 

5. Abfrage von Sammlungsdaten

Basierend auf den für die Abfragebedingungen festgelegten queryTexts gibt Chroma die ähnlichsten nResults-Ergebnisse zurück.

const results = await collection.query({
    nResults: 2, 
    queryTexts: ["This is a query document"]
})