MongoDB Atlas Local で Vector Search Index を初期化する方法
これは何?
この記事では、MongoDB Atlas Local で Vector Search Index を初期化する方法について説明します。
TIP
下記クリップで、実際の流れをデモ的に説明しています: MongoDB Atlas Local を利用してローカル環境で Vector Search Index を初期化する方法 | ジパンク | Quden
item コレクションのデータを itemsSearchView コレクションに移行する
- 下記コマンドを実行すると、item コレクション内にあるデータを itemsSearchView コレクションに移行します
2019-12-31T15:00:00.000+00:00のように ISO8601 形式で日時を指定することで、その日時以降のデータ移行対象とすることができます
bash
yarn dev:run:ts-node ./scripts/batch/20240904-create-item-search-view.ts --exec 2019-12-31T15:00:00.000+00:00CAUTION
このスクリプトは、裏側で embedding を生成する処理を実行しています。そのため、実行には API 使用料が発生します。無闇矢鱈に実行しないように注意してください。
Vector Search Index を作成する
- 下記が、Vector Search Index を作成するための定義です
typeがfilterとなっているものは、ベクトル検索実行時に pre-filter として利用できるようにするためのものです
jsonc
{
name: "vector_search_amazon_titan_v2_1024", // インデックス名を定義します
type: "vectorSearch", // ベクトル検索インデックス
definition: {
fields: [
{
type: "vector", // ベクトルフィールド
path: "embeddingAmazonTitanV2", // Amazon Titan V2 で生成したベクトルが保存されているフィールド名
numDimensions: 1024, // ベクトルの次元数。これは利用する Embedding ごとに規定されています。Amazon Titan V2 の場合は 1024 です
similarity: "cosine", // 類似度の計算方法。ここではコサイン類似度を選択しています
},
{
type: "filter",
path: "permittedShareTargetIds",
},
{
type: "filter",
path: "createdBy",
},
{
type: "filter",
path: "workspace"
},
{
type: "filter",
path: "tags"
},
{
type: "filter",
path: "type",
},
{
type: "filter",
path: "isPublic"
},
{
type: "filter",
path: "deletedAt"
},
{
type: "filter",
path: "deletedCompletelyAt"
},
{
type: "filter",
path: "createdAt"
},
{
type: "filter",
path: "updatedAt"
}
],
},
}テスト用の Vector を作成する
- 下記コマンドのを実行すると
./scripts/vector-search/results/get-embedding-result.jsonにベクトルが保存されます- このベクトルを、MongoDB Compass 上での Aggregation などに活用できます
bash
# コンテナに入る
docker exec -it toruca-backend-core-toruca-core-server-1 sh
# 実行する
yarn run dev:run:get-embedding 検索したいテキスト$vectorSearch ステージを利用した検索
- 下記のようなパイプラインを使って aggregation を実行することで、ベクトル検索を行うことができます
jsonc
{
index: "vector_search_amazon_titan_v2_1024", // 作成したインデックス名を指定します
path: "embeddingAmazonTitanV2", // ベクトルが保存されているフィールド名を指定します
// filter フィールドで、pre-filter の条件を指定します
filter: {
$and: [
// permittedShareTargetIds に shareTargetParentId を指定することで、権限を持つ items を対象とする事ができます
{ permittedShareTargetIds: { $in: [ObjectId('6656e4f29f49077ddcef95a0')]} }
]
},
numCandidates: 50,
limit: 10,
queryVector: [
// ここにベクトルが入ります。
// 作成方法は上記の「テスト用の Vector を作成する」を参照してください。
],
}