埋め込みベクトルは、人工知能が任意のタイプのデータを表現するためのネイティブな方法であり、多くのアルゴリズムがデータを表現するために特徴ベクトルを使用しています。これらはテキスト、画像、音声、およびビデオを表現することができます。特徴ベクトルを計算するための多くの方法があり、オープンソースの埋め込みモデルやOpenAI APIなどのクラウドサービスのAPIを使用する方法があります。
Chromaは、人気のある埋め込みモデル向けの軽量ラッパーを提供し、それらをアプリケーションで簡単に使用できるようにしています。
Transformers.js
Chromaは、Transformers.jsを使用してローカルマシン上で埋め込みモデルを実行し、特徴ベクトルを生成できます。Transformersは "Xenova/all-MiniLM-L6-v2" モデルを使用しています。これを実行するには、コマンドラインで npm install @xenova/transformers
を実行して、Transformers.jsライブラリをインストールしてください。
const {ChromaClient} = require('chromadb');
const client = new ChromaClient({path: "http://localhost:8000"});
const {TransformersEmbeddingFunction} = require('chromadb');
const embedder = new TransformersEmbeddingFunction();
(async () => {
// embeddingFunctionパラメータを介して使用する埋め込み関数を指定します
const collection = await client.getOrCreateCollection({name: "name", embeddingFunction: embedder})
// ベクトルを指定せずにデータを追加します。追加関数は、テキストベクトルを計算するためにembeddingFunction関数を呼び出します
await collection.add({
ids: ["id1", "id2", "id3"],
metadatas: [{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}],
documents: ["lorem ipsum...", "doc2", "doc3"],
})
// クエリデータ。これにより、queryTextsのベクトルを計算するためにもembeddingFunction関数が呼び出され、類似データを検索します
const results = await collection.query({
nResults: 2,
queryTexts: ["lorem ipsum"]
})
})();
OPENAI
Chromaは、OpenAIの埋め込みモデルAPIの便利なラッパーを提供しています。OpenAI APIを使用するためには、OpenAIアカウントに登録してAPIキーを取得する必要があります。
const {OpenAIEmbeddingFunction} = require('chromadb');
const embedder = new OpenAIEmbeddingFunction({openai_api_key: "apiKey"})
// 直接使用
const embeddings = embedder.generate(["document1","document2"])
// embeddingFunctionパラメータを使用して埋め込み関数を指定します
const collection = await client.createCollection({name: "name", embeddingFunction: embedder})
const collection = await client.getCollection({name: "name", embeddingFunction: embedder})
オプションでmodel_nameパラメータを渡すことで、使用するOpenAI埋め込みモデルを選択できます。デフォルトでは、Chromaはtext-embedding-ada-002を使用します。
カスタム埋め込み関数
他の埋め込みモデルを使用する場合、EmbeddingFunctionベースクラスを統合して任意の選択したモデルを呼び出してベクトルを生成できます。
注意: カスタム埋め込み関数は必須ではありません。独自の埋め込みモデルを使用して事前にベクトルを計算し、それを使用してChromaデータを読み書きすることができます。
class MyEmbeddingFunction {
private api_key: string;
constructor(api_key: string) {
this.api_key = api_key;
}
public async generate(texts: string[]): Promise<number[][]> {
// 独自のモデルを呼び出してベクトルを計算します
return embeddings;
}
}