Chromaは、ベクトル類似検索技術を利用して大規模な高次元ベクトルデータを効率的に格納および取得するオープンソースのベクトルデータベースです。

Chromaは、パッケージの形でコードに埋め込まれるアプリケーション組み込みデータベースです。その利点はそのシンプルさにあります。独立したベクトルデータベースをインストールしたくないが、LLMメモリを実装しテキストの類似性言語検索をサポートするベクトルデータベースが必要なLLMアプリケーションを開発している場合、Chromaは良い選択肢です。このチュートリアルは主にJavaScriptに基づいています。

1. パッケージのインストール

npm install --save chromadb # yarn add chromadb

2. Chromaクライアントの初期化

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

3. コレクションの作成

Chromaデータベースのコレクションは、Mysqlのテーブルと同様であり、ベクトルデータ(ドキュメントやその他のソースデータを含む)が格納されます。以下はコレクションの作成です:

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

ここでは、テキストベクトルを計算するためにopenaiテキスト埋め込みモデルが使用されているため、openaiのAPIキーを提供する必要があります。もちろん、embeddingFunctionパラメータを省略し、Chroma内蔵のモデルを使用してベクトルを計算するか、別のオープンソースのテキスト埋め込みモデルに置き換えることもできます。

4. データの追加

コレクションを定義した後、データをコレクションに追加し、Chromaはデータを格納し、テキストデータのベクトルに基づいた専用のベクトルインデックスを作成し、後で簡単にクエリできるようにします。

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

事前に計算されたテキストベクトルを使用し、Chromaの内蔵された埋め込み機能を使用せずに計算する場合:

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. コレクションデータのクエリ

クエリ条件として設定されたqueryTextsに基づいて、Chromaは最も類似したnResultsの結果を返します。

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