Chroma to otwarta baza danych wektorowej, która wykorzystuje technologię wyszukiwania podobieństw wektorowych do efektywnego przechowywania i odzyskiwania dużych zbiorów danych wektorowych o wysokiej wymiarowości.

Chroma to baza danych osadzona w aplikacji, która jest osadzona w naszym kodzie w formie pakietu. Jej zaletą jest prostota. Jeśli tworzysz aplikację LLM, która wymaga bazy danych wektorowej do implementacji pamięci LLM i obsługi wyszukiwania języka podobieństwa tekstu, a nie chcesz instalować niezależnej bazy danych wektorowej, Chroma jest dobrym wyborem. Ten samouczek oparty jest głównie na języku JavaScript.

1. Instalacja pakietu

npm install --save chromadb # yarn add chromadb

2. Inicjalizacja klienta Chroma

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

3. Utworzenie kolekcji

Kolekcja w bazie danych Chroma jest podobna do tabeli w Mysql, gdzie przechowywane są dane wektorowe (w tym dokumenty i inne dane źródłowe). Poniżej tworzona jest kolekcja:

const {OpenAIEmbeddingFunction} = require('chromadb');
const embedder = new OpenAIEmbeddingFunction({openai_api_key: "twój_klucz_api"})
const kolekcja = await klient.createCollection({name: "moja_kolekcja", embeddingFunction: embedder})

Tutaj do obliczania wektorów tekstu używany jest model wbudowany w openai text embedding, dlatego musisz podać swój klucz api openai. Oczywiście możesz także pominię parametr embeddingFunction i użyć wbudowanego modelu w Chroma do obliczania wektorów lub zastąpić go innym otwartym modelem do osadzania tekstu.

4. Dodawanie danych

Po zdefiniowaniu kolekcji dodawane są dane do kolekcji, a Chroma przechowuje nasze dane i tworzy dedykowany indeks wektorowy na podstawie wektorów danych tekstowych, co ułatwia późniejsze zapytania.

await kolekcja.add({
    ids: ["id1", "id2"],
    metadatas: [{"source": "my_source"}, {"source": "my_source"}],
    documents: ["To jest dokument", "To jest kolejny dokument"],
}) 

Wykorzystując wstępnie obliczone wektory tekstu, bez używania wbudowanej funkcji osadzania w Chromie do obliczeń:

await kolekcja.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: ["To jest dokument", "To jest kolejny dokument"]
}) 

5. Zapytanie o dane kolekcji

Na podstawie ustawionych tekstów zapytań, Chroma zwróci najbardziej podobne wyniki nResults.

const wyniki = await kolekcja.query({
    nResults: 2, 
    queryTexts: ["To jest dokument zapytania"]
})