Docs Menu
Docs Home
/
MongoDB Atlas
/

ベクトル量子化

項目一覧

  • 量子化について
  • スカラー量化
  • バイナリ量子化
  • 要件
  • ベクトルの自動数量化を有効にする方法
  • メリット
  • ユースケース
  • 手順
  • 事前量別ベクトルの取り込み方法
  • ユースケース
  • メリット
  • 対応ドライバー
  • 前提条件
  • 手順
  • クエリ結果を評価する

注意

次の Atlas ベクトル検索サポートはプレビュー機能として利用できます。

  • BSON BinDatavector サブタイプint1 の取り込み。

  • 自動スカラー量子化。

  • 自動バイナリ量子化。

Atlas ベクトル検索は、ベクトル埋め込み内の double または 32 ビットの浮動小数点数の自動量化をサポートします。また、埋め込みプロバイダーからスカラーおよびバイナリ量子化ベクトルを取り込んでインデックスを作成することもできます。

量子化とは、完全忠実なベクトルをより小さなビットに縮小するプロセスです。表現ベクトルをインデックス化することで、ベクトル検索インデックスに各ベクトルを保存するために必要なメインメモリの量が減少し、より多くのベクトルやより次元の高いベクトルをストレージできるようになります。このように、定量化によりリソースの消費が削減され、速度が向上します。したがって、多数のベクトル数を持つアプリケーション(通常は 10 M ベクトルを超える)に量子化をお勧めします。

スカラー量子化では、まずインデックスベクトルの各次元の最小値と最大値を識別して、次元の値の範囲を確立します。次に、範囲は同じサイズの間隔またはビンに分割されます。最後に、各浮動小数値はビンにマッピングされ、連続した浮動小数値を別個の整数に変換します。 Atlas ベクトル検索では、この量子化によりベクトル埋め込みのRAMコストが 1 4 分の 1(1/4 )にコストされます。

バイナリ量化では、各次元に対して 01の中間点を想定する必要があります。これは通常、OpenAItext-embedding-3-large の など、長さ に正規化された埋め込みに適しています。次に、ベクトルの各値は中間点と比較され、中間点より大きい場合は のバイナリ値が割り当てられ、中間点以下の場合は1 0のバイナリ値が割り当てられます。 Atlas ベクトル検索では、この量子化により、ベクトル埋め込みのRAMコストは 1 つの 24 分の 1(1/24 )にコストされます。1/32 ではない理由は、ベクトル値とは別の Hierarchical Navigable Small Worlds グラフ自体を含むデータ構造が圧縮されていないためです。

クエリを実行すると、Atlas ベクトル検索は、クエリベクトルとインデックス付きバイナリ ベクトルを効率的に比較するために、同じ中点を使用してクエリベクトル内の浮動小数点数をバイナリベクトルに変換します。次に、バイナリインデックスの結果に関連付けられた元の浮動小数値を使用して、バイナリ比較で識別された候補を再評価し、結果をさらに絞り込むことで再スコアリングします。完全な忠実度ベクトルは、ディスク上の独自のデータ構造に保存され、バイナリ量子化を構成する場合、またはバイナリもしくはスカラーの量子化ベクトルに対して完全検索を実行する場合にのみ参照されます。

Tip

以下も参照してください。

次の表は、自動量化と量化ベクトルの取り込みに関する要件を示しています。

要件
int1 取り込み
int8 取り込み
自動スカラー量子化用
自動バイナリ量子化用
インデックス定義設定が必要です
No
No
はい
はい
BSONbinData 形式が必要です
はい
はい
No
No
mongodでのストレージ
binData(int1)
binData(int8)
binData(float32)
array(float32)
binData(float32)
array(float32)
サポートされている類似性メソッド
euclidean
cosine
euclidean
dotProduct
cosine
euclidean
dotProduct
cosine
euclidean
dotProduct
サポートされている次元数
8 の倍数
1から4096
1から4096
8 の倍数
ENN 検索をサポート
ENNint1
ENNint8
ENNfloat32
ENNfloat32

Atlas ベクトル検索を構成して、ベクトル埋め込み内の double または 32 ビットの浮動小数点数を int8(スカラー)や binary などのより小さい数値型に自動的に定量化します。

ほとんどの埋め込みモデルには、 再スコアリングを使用したバイナリ数量化 をお勧めします。 QAT ではない低次元モデルを使用する場合は、表現損失が少ないため、表現キャパシティーの損失が少なくなるようにスカラー量化を使用してください。

Atlas ベクトル検索は、スカラー量子化のネイティブ機能と、再スコアリング付きのバイナリ量化のネイティブ機能を提供します。自動量化は、ベクトルを効率的に処理するためにストレージと計算リソースを削減することで、アプリケーションのスケーラビリティとコストを節約します。自動量化により、mongot 3.7524432のRAMは、スカラーの場合は x だけ、バイナリの場合は x だけ減少します。ベクトル値はそれぞれ x と x によって縮小されますが、 Hierarchical Navigable Small Worldsグラフ自体は縮小されません。これにより、最大のボリュームと増やすにおいてでも、パフォーマンスが向上します。

多数の完全忠実度ベクトル(通常は 10M ベクトルを超える場合)がある場合は、 自動量化 を推奨します。量子化後、ベクトル検索の際の精度を失うことなく、削減された表現ベクトルをインデックス化します。

double または 32 ビット float の値を自動的に定量化するには、インデックス定義で fields.quantization の値として必要な量化のタイプを指定します。値として、次のいずれかのタイプの量子化を指定できます。

  • scalar 32 ビット入力ベクトルからバイトベクトルを生成するための量子化。

  • binary 32 ビット入力ベクトルからビットベクトルを生成するための量子化。

doubles または 32 ビット float 値の配列ではないデータに自動量子化を指定すると、Atlas ベクトル検索はそのベクトルをインデックスするのではなく無視し、それらのベクトルはスキップします。

Atlas ベクトル検索は、埋め込みプロバイダーからのスカラーとバイナリ量子化ベクトルの取り込みとインデックス作成もサポートしています。量子化されたベクトルがまだない場合は、埋め込みをBSON BinDatavector サブタイプfloat32int1 、またはint8 ベクトルに変換できます。

次のユースケースにはBSONbinDatavector サブタイプが推奨されています。

  • 埋め込みモデルから量子化されたベクトル出力をインデックスする必要があります。

  • 多数の浮動小数ベクトルがあるが、mongod のストレージと WiredTiger のフットプリント(ディスクやメモリ使用量など)を削減したい場合

BinDatavector 形式では、要素の配列と比較して、クラスター内の約 3 倍のディスク領域が必要です。これにより、 ベクトルやint1 int8ベクトルなどの代替タイプでベクトルをインデックス化でき、コレクションの Atlas ベクトル検索インデックスの構築に必要なメモリが削減されます。これにより、mongot 3.7524のRAMは、スカラーの場合は x だけ、バイナリの場合は4 x ずつ削減されます。ベクトル値はそれぞれ x と32 x だけ縮小されますが、 Hierarchical Navigable Small Worldsグラフ自体は縮小されません。

binData ベクトルをまだ作成していない場合は、データをコレクションに書き込む前に、サポートされているドライバーを使用して埋め込みをこの形式に変換できます。このページでは、埋め込みを BinDatavector サブタイプに変換する手順について説明します。

BSON BinData vector サブタイプfloat32int1 、およびint8 ベクトル変換はPyMongo Driver v4.10 以降でサポートされています。

埋め込みを BSON BinData vector サブタイプに変換するには、次の操作が必要です。

  • MongoDB バージョン 6.0.11、7.0.2、またはそれ以降を実行している Atlas クラスター。

    IP アドレスが Atlas プロジェクトのアクセスリストに含まれていることを確認する。

  • Comb などのインタラクティブ Python ノートを実行するための環境。

  • バイトベクトル出力をサポートする埋め込みモデルへのアクセス。

    次の埋め込みモデル プロバイダーは、int8 または int1 binData ベクトルをサポートしています。

    埋め込みモデルプロバイダー
    埋め込みモデル
    embed-english-v3.0
    nomic-embed-text-v1.5
    jina-embeddings-v2-base-en
    mxbai-embed-large-v1

    これらの埋め込みモデル プロバイダーのいずれかを使用して、binData ベクトルを生成できます。これらのモデルはすべて量子化を認識するように訓練されているため、スカラー量化によりこれらのモデルの再現率が維持されます。 したがって、これらのモデルによって生成されるスカラー数量化された埋め込みの再現率の低下は、384 のような低次元でも最小限に抑えられます。

この手順の例では、新しいデータまたは既存のデータと Cohere のembed-english-v3.0 モデルのいずれかを使用します。新しいデータの例では、独自のデータに置き換えることができるサンプルテキスト文字列が使用されています。既存データの例では、listingsAndReviews sample_airbnbbinDataデータベース内の コレクションの埋め込みがないドキュメントのサブセットが使用されます。これは独自のデータベースとコレクション(埋め込みの有無にかかわらず)に置き換えることができます。新しいデータ用の ベクトルを作成するか、Atlas クラスターにすでに存在するデータ用に[] タブを選択します。

.ipynb 拡張機能のファイルを保存してインタラクティブPythonノートを作成し、ノート内で次の手順を実行します。の例を試すには、プレースホルダーを有効な値に置き換えます。

1

以下のコマンドを実行して、 PyMongoドライバー をインストールします。必要に応じて、埋め込みモデル プロバイダーからライブラリをインストールすることもできます。この操作が完了するまでに数分かかる場合があります。

pip install pymongo

PyMongo v4.10 以降のドライバーをインストールする必要があります。

PyMongo と Cohere のインストール

pip --quiet install pymongo cohere
2

インポートするサンプルデータ

data = [
"The Great Wall of China is visible from space.",
"The Eiffel Tower was completed in Paris in 1889.",
"Mount Everest is the highest peak on Earth at 8,848m.",
"Shakespeare wrote 37 plays and 154 sonnets during his lifetime.",
"The Mona Lisa was painted by Leonardo da Vinci.",
]
3

データから埋め込みをまだ生成していない場合は、この手順が必要です。すでに埋め込みを生成している場合は、この手順をスキップしてください。データから埋め込みを生成する方法の詳細については、「ベクトル埋め込みを作成する方法」を参照してください。

Cohere を使用したサンプルデータからの埋め込みの生成

プレースホルダー
有効な値
<COHERE-API-KEY>
Coordinate のAPIキー。
import cohere
api_key = "<COHERE-API-KEY>"
co = cohere.Client(api_key)
generated_embeddings = co.embed(
texts=data,
model="embed-english-v3.0",
input_type="search_document",
embedding_types=["float", "int8", "ubinary"]
).embeddings
float32_embeddings = generated_embeddings.float
int8_embeddings = generated_embeddings.int8
int1_embeddings = generated_embeddings.ubinary
4

PyMongo ドライバーを使用して、ネイティブのベクトル埋め込みを BSON ベクトルに変換できます。

関数の定義と実行による BSON ベクトルの生成

from bson.binary import Binary, BinaryVectorDtype
def generate_bson_vector(vector, vector_dtype):
return Binary.from_vector(vector, vector_dtype)
# For all vectors in your collection, generate BSON vectors of float32, int8, and int1 embeddings
bson_float32_embeddings = []
bson_int8_embeddings = []
bson_int1_embeddings = []
for i, (f32_emb, int8_emb, int1_emb) in enumerate(zip(float32_embeddings, int8_embeddings, int1_embeddings)):
bson_float32_embeddings.append(generate_bson_vector(f32_emb, BinaryVectorDtype.FLOAT32))
bson_int8_embeddings.append(generate_bson_vector(int8_emb, BinaryVectorDtype.INT8))
bson_int1_embeddings.append(generate_bson_vector(int1_emb, BinaryVectorDtype.PACKED_BIT))
5

コレクションのドキュメント内に BSON のベクトル埋め込みがすでに存在する場合は、この手順をスキップします。

サンプルデータからのドキュメントの作成

プレースホルダー
有効な値
<FIELD-NAME-FOR-FLOAT32-TYPE>
float32 値を持つフィールドの名前。
<FIELD-NAME-FOR-INT8-TYPE>
int8 値を持つフィールドの名前。
<FIELD-NAME-FOR-INT1-TYPE>
int1 値を持つフィールドの名前。
def create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data):
docs = []
for i, (bson_f32_emb, bson_int8_emb, bson_int1_emb, text) in enumerate(zip(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data)):
doc = {
"_id":i,
"data": text,
"<FIELD-NAME-FOR-FLOAT32-TYPE>":bson_f32_emb,
"<FIELD-NAME-FOR-INT8-TYPE>":bson_int8_emb,
"<FIELD-NAME-FOR-INT1-TYPE>":bson_int1_emb,
}
docs.append(doc)
return docs
documents = create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data)
6

Atlas UI から、およびプログラムでデータを読み込むことができます。Atlas UI からデータをロードする方法については、「データの挿入」を参照してください。次の手順と関連する例は、PyMongo ドライバーを使用してプログラムでデータをロードする方法を示しています。

  1. Atlas クラスターに接続します。

    プレースホルダー
    有効な値
    <ATLAS-CONNECTION-STRING>

    import pymongo
    MONGO_URI = "<ATLAS-CONNECTION-STRING>"
    def get_mongo_client(mongo_uri):
    # establish the connection
    client = pymongo.MongoClient(mongo_uri)
    if not MONGO_URI:
    print("MONGO_URI not set in environment variables")
  2. Atlas クラスターにデータを読み込みます。

    プレースホルダー
    有効な値
    <DB-NAME>
    データベースの名前。
    <COLLECTION-NAME>
    指定されたデータベース内のコレクションの名前。

    client = pymongo.MongoClient(MONGO_URI)
    db = client["<DB-NAME>"]
    db.create_collection("<COLLECTION-NAME>")
    col = db["<COLLECTION-NAME>"]
    col.insert_many(documents)
7

Atlas UI、Atlas CLI、Atlas Administration API、MongoDB ドライバーを使用して、Atlas Vector Search インデックスを作成できます。詳細については、「ベクトル検索のフィールドにインデックスを付ける方法」を参照してください。

サンプルコレクションのインデックスの作成

プレースホルダー
有効な値
<FIELD-NAME-FOR-FLOAT32-TYPE>
float32 値を持つフィールドの名前。
<FIELD-NAME-FOR-INT8-TYPE>
int8 値を持つフィールドの名前。
<FIELD-NAME-FOR-INT1-TYPE>
int1 値を持つフィールドの名前。
import time
from pymongo.operations import SearchIndexModel
vector_search_index_definition = {
"fields":[
{
"type": "vector",
"path": "<FIELD-NAME-FOR-FLOAT32-TYPE>",
"similarity": "dotProduct",
"numDimensions": 1024,
},
{
"type": "vector",
"path": "<FIELD-NAME-FOR-INT8-TYPE>",
"similarity": "dotProduct",
"numDimensions": 1024,
},
{
"type": "vector",
"path": "<FIELD-NAME-FOR-INT1-TYPE>",
"similarity": "euclidean",
"numDimensions": 1024,
}
]
}
search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch")
col.create_search_index(model=search_index_model)
8

Atlas ベクトル検索クエリを実行する関数は、次のアクションを実行する必要があります。

  • クエリテキストを BSON ベクトルに変換する。

  • Atlas Vector Search クエリのパイプラインを定義する。

プレースホルダー
有効な値
<FIELD-NAME-FOR-FLOAT32-TYPE>
float32 値を持つフィールドの名前。
<FIELD-NAME-FOR-INT8-TYPE>
int8 値を持つフィールドの名前。
<FIELD-NAME-FOR-INT1-TYPE>
int1 値を持つフィールドの名前。
<INDEX-NAME>
vector 型インデックスの名前。
<NUMBER-OF-CANDIDATES-TO-CONSIDER>
検索中に使用する最近傍の数。
<NUMBER-OF-DOCUMENTS-TO-RETURN>
結果で返されるドキュメントの数。
def run_vector_search(query_text, collection, path):
query_text_embeddings = co.embed(
texts=[query_text],
model="embed-english-v3.0",
input_type="search_query",
embedding_types=["float", "int8", "ubinary"]
).embeddings
if path == "<FIELD-NAME-FOR-FLOAT32-TYPE>":
query_vector = query_text_embeddings.float[0]
vector_dtype = BinaryVectorDtype.FLOAT32
elif path == "<FIELD-NAME-FOR-INT8-TYPE>":
query_vector = query_text_embeddings.int8[0]
vector_dtype = BinaryVectorDtype.INT8
elif path == "<FIELD-NAME-FOR-INT1-TYPE>":
query_vector = query_text_embeddings.ubinary[0]
vector_dtype = BinaryVectorDtype.PACKED_BIT
bson_query_vector = generate_bson_vector(query_vector, vector_dtype)
pipeline = [
{
'$vectorSearch': {
'index': '<INDEX-NAME>',
'path': path,
'queryVector': bson_query_vector,
'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>,
'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN>
}
},
{
'$project': {
'_id': 0,
'data': 1,
'score': { '$meta': 'vectorSearchScore' }
}
}
]
return collection.aggregate(pipeline)
9

Atlas Vector Search クエリをプログラムで実行できます。詳細については、「ベクトル検索クエリの実行」を参照してください。

from pprint import pprint
query_text = "tell me a science fact"
float32_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-FLOAT32-TYPE>")
int8_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-INT8-TYPE>")
int1_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-INT1-TYPE>")
print("results from float32 embeddings")
pprint(list(float32_results))
print("--------------------------------------------------------------------------")
print("results from int8 embeddings")
pprint(list(int8_results))
print("--------------------------------------------------------------------------")
print("results from int1 embeddings")
pprint(list(int1_results))
results from float32 embeddings
[{'data': 'Mount Everest is the highest peak on Earth at 8,848m.',
'score': 0.6578356027603149},
{'data': 'The Great Wall of China is visible from space.',
'score': 0.6420407891273499}]
--------------------------------------------------------------------------
results from int8 embeddings
[{'data': 'Mount Everest is the highest peak on Earth at 8,848m.',
'score': 0.5149182081222534},
{'data': 'The Great Wall of China is visible from space.',
'score': 0.5136760473251343}]
--------------------------------------------------------------------------
results from int1 embeddings
[{'data': 'Mount Everest is the highest peak on Earth at 8,848m.',
'score': 0.62109375},
{'data': 'The Great Wall of China is visible from space.',
'score': 0.61328125}]
1

以下のコマンドを実行して、 PyMongoドライバー をインストールします。必要に応じて、埋め込みモデル プロバイダーからライブラリをインストールすることもできます。この操作が完了するまでに数分かかる場合があります。

pip install pymongo

PyMongo v4.10 以降のドライバーをインストールする必要があります。

PyMongo と Cohere のインストール

pip --quiet install pymongo cohere
2

埋め込みモデルを使用して、次の操作を実行する関数を定義する必要があります。

  • 既存のデータに埋め込みがない場合は、既存のデータから埋め込みを生成します。

  • 埋め込みをBSONベクトルに変換する。

埋め込みを生成および変換する関数

プレースホルダー
有効な値
<COHERE-API-KEY>
Coordinate のAPIキー。
1import os
2import pymongo
3import cohere
4from bson.binary import Binary, BinaryVectorDtype
5
6# Specify your OpenAI API key and embedding model
7os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
8cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
9
10# Function to generate embeddings using Cohere
11def get_embedding(text):
12 response = cohere_client.embed(
13 texts=[text],
14 model='embed-english-v3.0',
15 input_type='search_document',
16 embedding_types=["float"]
17 )
18 embedding = response.embeddings.float[0]
19 return embedding
20
21# Function to convert embeddings to BSON-compatible format
22def generate_bson_vector(vector, vector_dtype):
23 return Binary.from_vector(vector, vector_dtype)
1import os
2import pymongo
3import cohere
4from bson.binary import Binary, BinaryVectorDtype
5
6# Specify your OpenAI API key and embedding model
7os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
8cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
9
10# Function to generate embeddings using Cohere
11def get_embedding(text):
12 response = cohere_client.embed(
13 texts=[text],
14 model='embed-english-v3.0',
15 input_type='search_document',
16 embedding_types=["int8"]
17 )
18 embedding = response.embeddings.int8[0]
19 return embedding
20
21# Function to convert embeddings to BSON-compatible format
22def generate_bson_vector(vector, vector_dtype):
23 return Binary.from_vector(vector, vector_dtype)
1import os
2import pymongo
3import cohere
4from bson.binary import Binary, BinaryVectorDtype
5
6# Specify your OpenAI API key and embedding model
7os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
8cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
9
10# Function to generate embeddings using Cohere
11def get_embedding(text):
12 response = cohere_client.embed(
13 texts=[text],
14 model='embed-english-v3.0',
15 input_type='search_document',
16 embedding_types=["ubinary"]
17 )
18 embedding = response.embeddings.ubinary[0]
19 return embedding
20
21# Function to convert embeddings to BSON-compatible format
22def generate_bson_vector(vector, vector_dtype):
23 return Binary.from_vector(vector, vector_dtype)
3

以下を提供する必要があります。

  • 埋め込みを生成するデータベースとコレクションを含む Atlas クラスターに接続するための接続文字列。

  • 埋め込みを生成するコレクションを含むデータベースの名前。

  • 埋め込みを生成するコレクションの名前。

データにアクセスするための Atlas クラスターへの接続

プレースホルダー
有効な値
<ATLAS-CONNECTION-STRING>
1# Connect to your Atlas cluster
2mongo_client = pymongo.MongoClient("<ATLAS-CONNECTION-STRING>")
3db = mongo_client["sample_airbnb"]
4collection = db["listingsAndReviews"]
5
6# Filter to exclude null or empty summary fields
7filter = { "summary": {"$nin": [None, ""]} }
8
9# Get a subset of documents in the collection
10documents = collection.find(filter).limit(50)
11
12# Initialize the count of updated documents
13updated_doc_count = 0
4
  1. データにまだ埋め込みがない場合は、任意の埋め込みモデルを使用してデータから埋め込みを生成します。データから埋め込みを生成する方法の詳細については、「 ベクトル埋め込みの作成方法 」を参照してください。

  2. 埋め込みをBSONベクトルに変換します(次の例の 7に表示されているように)。

  3. Atlas クラスターのコレクションに埋め込みをアップロードします。

これらの操作が完了するまでに数分かかる場合があります。

コレクションへの埋め込みの生成、変換、ロード

1for doc in documents:
2 # Generate embeddings based on the summary
3 summary = doc["summary"]
4 embedding = get_embedding(summary) # Get float32 embedding
5
6 # Convert the float32 embedding to BSON format
7 bson_float32 = generate_bson_vector(embedding, BinaryVectorDtype.FLOAT32)
8
9 # Update the document with the BSON embedding
10 collection.update_one(
11 {"_id": doc["_id"]},
12 {"$set": {"embedding": bson_float32}}
13 )
14 updated_doc_count += 1
15
16print(f"Updated {updated_doc_count} documents with BSON embeddings.")
1for doc in documents:
2 # Generate embeddings based on the summary
3 summary = doc["summary"]
4 embedding = get_embedding(summary) # Get int8 embedding
5
6 # Convert the float32 embedding to BSON format
7 bson_int8 = generate_bson_vector(embedding, BinaryVectorDtype.INT8)
8
9 # Update the document with the BSON embedding
10 collection.update_one(
11 {"_id": doc["_id"]},
12 {"$set": {"embedding": bson_int8}}
13 )
14 updated_doc_count += 1
15
16print(f"Updated {updated_doc_count} documents with BSON embeddings.")
1for doc in documents:
2 # Generate embeddings based on the summary
3 summary = doc["summary"]
4 embedding = get_embedding(summary) # Get int1 embedding
5
6 # Convert the float32 embedding to BSON format
7 bson_int1 = generate_bson_vector(embedding, BinaryVectorDtype.PACKED_BIT)
8
9 # Update the document with the BSON embedding
10 collection.update_one(
11 {"_id": doc["_id"]},
12 {"$set": {"embedding": bson_int1}}
13 )
14 updated_doc_count += 1
15
16print(f"Updated {updated_doc_count} documents with BSON embeddings.")
5

Atlas Vector Search インデックスは、 Atlas UI、 Atlas CLI、 Atlas Administration API 、および希望言語のMongoDBドライバー を使用して、Atlas ベクトル検索インデックスを作成できます。詳細については、「ベクトル検索のフィールドにインデックスを作成する方法 」を参照してください。

コレクションの インデックスを作成する

プレースホルダー
有効な値
<INDEX-NAME>
vector 型インデックスの名前。
1from pymongo.operations import SearchIndexModel
2
3vector_search_index_definition = {
4 "fields":[
5 {
6 "type": "vector",
7 "path": "embedding",
8 "similarity": "euclidean",
9 "numDimensions": 1024,
10 }
11 ]
12}
13
14search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch")
15
16collection.create_search_index(model=search_index_model)

インデックスの構築には約 1 分かかります。 構築中、インデックスは最初の同期状態になります。 構築が完了したら、コレクション内のデータのクエリを開始できます。

6

Atlas ベクトル検索クエリを実行する関数は、次のアクションを実行する必要があります。

  • クエリテキストの埋め込みを生成します。

  • クエリテキストを BSON ベクトルに変換する。

  • Atlas Vector Search クエリのパイプラインを定義する。

Atlas ベクトル検索クエリを実行する関数

プレースホルダー
有効な値
<INDEX-NAME>
vector 型インデックスの名前。
<NUMBER-OF-CANDIDATES-TO-CONSIDER>
検索中に使用する最近傍の数。
<NUMBER-OF-DOCUMENTS-TO-RETURN>
結果で返されるドキュメントの数。
1def run_vector_search(query_text, collection, path):
2 query_embedding = get_embedding("query_text")
3 bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.FLOAT32)
4
5 pipeline = [
6 {
7 '$vectorSearch': {
8 'index': '<INDEX-NAME>',
9 'path': path,
10 'queryVector': bson_query_vector,
11 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20
12 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5
13 }
14 },
15 {
16 '$project': {
17 '_id': 0,
18 'name': 1,
19 'summary': 1,
20 'score': { '$meta': 'vectorSearchScore' }
21 }
22 }
23 ]
24
25 return collection.aggregate(pipeline)
1def run_vector_search(query_text, collection, path):
2 query_embedding = get_embedding("query_text")
3 bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.INT8)
4
5 pipeline = [
6 {
7 '$vectorSearch': {
8 'index': '<INDEX-NAME>',
9 'path': path,
10 'queryVector': bson_query_vector,
11 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20
12 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5
13 }
14 },
15 {
16 '$project': {
17 '_id': 0,
18 'name': 1,
19 'summary': 1,
20 'score': { '$meta': 'vectorSearchScore' }
21 }
22 }
23 ]
24
25 return collection.aggregate(pipeline)
1def run_vector_search(query_text, collection, path):
2 query_embedding = get_embedding("query_text")
3 bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.PACKED_BIT)
4
5 pipeline = [
6 {
7 '$vectorSearch': {
8 'index': '<INDEX-NAME>',
9 'path': path,
10 'queryVector': bson_query_vector,
11 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20
12 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5
13 }
14 },
15 {
16 '$project': {
17 '_id': 0,
18 'name': 1,
19 'summary': 1,
20 'score': { '$meta': 'vectorSearchScore' }
21 }
22 }
23 ]
24
25 return collection.aggregate(pipeline)
7

Atlas Vector Search クエリをプログラムで実行できます。詳細については、「ベクトル検索クエリの実行」を参照してください。

サンプル Atlas ベクトル検索クエリの実行

1from pprint import pprint
2
3query_text = "ocean view"
4query_results = run_vector_search(query_text, collection, "embedding")
5
6print("results from your embeddings")
7pprint(list(query_results))
results from your embeddings
[{'name': 'Your spot in Copacabana',
'score': 0.5468248128890991,
'summary': 'Having a large airy living room. The apartment is well divided. '
'Fully furnished and cozy. The building has a 24h doorman and '
'camera services in the corridors. It is very well located, close '
'to the beach, restaurants, pubs and several shops and '
'supermarkets. And it offers a good mobility being close to the '
'subway.'},
{'name': 'Twin Bed room+MTR Mongkok shopping&My',
'score': 0.527062714099884,
'summary': 'Dining shopping conveniently located Mongkok subway E1, airport '
'shuttle bus stops A21. Three live two beds, separate WC, 24-hour '
'hot water. Free WIFI.'},
{'name': 'Quarto inteiro na Tijuca',
'score': 0.5222363471984863,
'summary': 'O quarto disponível tem uma cama de solteiro, sofá e computador '
'tipo desktop para acomodação.'},
{'name': 'Makaha Valley Paradise with OceanView',
'score': 0.5175154805183411,
'summary': 'A beautiful and comfortable 1 Bedroom Air Conditioned Condo in '
'Makaha Valley - stunning Ocean & Mountain views All the '
'amenities of home, suited for longer stays. Full kitchen & large '
"bathroom. Several gas BBQ's for all guests to use & a large "
'heated pool surrounded by reclining chairs to sunbathe. The '
'Ocean you see in the pictures is not even a mile away, known as '
'the famous Makaha Surfing Beach. Golfing, hiking,snorkeling '
'paddle boarding, surfing are all just minutes from the front '
'door.'},
{'name': 'Cozy double bed room 東涌鄉村雅緻雙人房',
'score': 0.5149975419044495,
'summary': 'A comfortable double bed room at G/F. Independent entrance. High '
'privacy. The room size is around 100 sq.ft. with a 48"x72" '
'double bed. The village house is close to the Hong Kong Airport, '
'AsiaWorld-Expo, HongKong-Zhuhai-Macau Bridge, Disneyland, '
'Citygate outlets, 360 Cable car, shopping centre, main tourist '
'attractions......'}]

ステップ 3 で sample_airbnb.listingsAndReviews名前空間から 50 ドキュメントをランダムに選択したため、結果が異なる場合があります。選択されたドキュメントと生成された埋め込みは、環境によって異なる場合があります。

Cohereの embed-english-v3.0 埋め込みモデルを使ったサンプルデータでの、この手順の高度なデモンストレーションについては、このノートブックを参照してください。

Atlas ベクトル検索クエリの精度は、量子化されたベクトルに対する NN 検索の結果が ENN 検索の結果とどの程度一致しているかを評価することで測定できます。つまり、同じクエリ条件の ANN 検索の結果と ENN 検索の結果と比較し、ANN 検索結果が ENN 検索の結果に最近傍 を含む頻度を測定できます。

クエリ結果を評価する方法のデモについては、「 クエリ結果の精度を測定する方法 」を参照してください。

戻る

クエリの作成および実行