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"]
})