ベクトル量子化
項目一覧
注意
次の Atlas ベクトル検索サポートはプレビュー機能として利用できます。
BSON BinData
vector
サブタイプint1
の取り込み。自動スカラー量子化。
自動バイナリ量子化。
Atlas ベクトル検索は、ベクトル埋め込み内の double または 32 ビットの浮動小数点数の自動量化をサポートします。また、埋め込みプロバイダーからスカラーおよびバイナリ量子化ベクトルを取り込んでインデックスを作成することもできます。
量子化について
量子化とは、完全忠実なベクトルをより小さなビットに縮小するプロセスです。表現ベクトルをインデックス化することで、ベクトル検索インデックスに各ベクトルを保存するために必要なメインメモリの量が減少し、より多くのベクトルやより次元の高いベクトルをストレージできるようになります。このように、定量化によりリソースの消費が削減され、速度が向上します。したがって、多数のベクトル数を持つアプリケーション(通常は 10 M ベクトルを超える)に量子化をお勧めします。
スカラー量化
スカラー量子化では、まずインデックスベクトルの各次元の最小値と最大値を識別して、次元の値の範囲を確立します。次に、範囲は同じサイズの間隔またはビンに分割されます。最後に、各浮動小数値はビンにマッピングされ、連続した浮動小数値を別個の整数に変換します。 Atlas ベクトル検索では、この量子化によりベクトル埋め込みのRAMコストが 1 4 分の 1(1/4
)にコストされます。
バイナリ量子化
バイナリ量化では、各次元に対して 0
1
の中間点を想定する必要があります。これは通常、OpenAItext-embedding-3-large
の など、長さ に正規化された埋め込みに適しています。次に、ベクトルの各値は中間点と比較され、中間点より大きい場合は のバイナリ値が割り当てられ、中間点以下の場合は1
0
のバイナリ値が割り当てられます。 Atlas ベクトル検索では、この量子化により、ベクトル埋め込みのRAMコストは 1 つの 24 分の 1(1/24
)にコストされます。1/32
ではない理由は、ベクトル値とは別の Hierarchical Navigable Small Worlds グラフ自体を含むデータ構造が圧縮されていないためです。
クエリを実行すると、Atlas ベクトル検索は、クエリベクトルとインデックス付きバイナリ ベクトルを効率的に比較するために、同じ中点を使用してクエリベクトル内の浮動小数点数をバイナリベクトルに変換します。次に、バイナリインデックスの結果に関連付けられた元の浮動小数値を使用して、バイナリ比較で識別された候補を再評価し、結果をさらに絞り込むことで再スコアリングします。完全な忠実度ベクトルは、ディスク上の独自のデータ構造に保存され、バイナリ量子化を構成する場合、またはバイナリもしくはスカラーの量子化ベクトルに対して完全検索を実行する場合にのみ参照されます。
要件
次の表は、自動量化と量化ベクトルの取り込みに関する要件を示しています。
要件 | で int1 取り込み | で int8 取り込み | 自動スカラー量子化用 | 自動バイナリ量子化用 |
---|---|---|---|---|
インデックス定義設定が必要です | No | No | はい | はい |
BSON binData 形式が必要です | はい | はい | 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 検索をサポート | の ENN int1 | の ENN int8 | の ENN float32 | の ENN float32 |
ベクトルの自動数量化を有効にする方法
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
サブタイプfloat32
、int1
、またはint8
ベクトルに変換できます。
ユースケース
次のユースケースにはBSONbinData
vector
サブタイプが推奨されています。
埋め込みモデルから量子化されたベクトル出力をインデックスする必要があります。
多数の浮動小数ベクトルがあるが、
mongod
のストレージと WiredTiger のフットプリント(ディスクやメモリ使用量など)を削減したい場合
メリット
BinDatavector
形式では、要素の配列と比較して、クラスター内の約 3 倍のディスク領域が必要です。これにより、 ベクトルやint1
int8
ベクトルなどの代替タイプでベクトルをインデックス化でき、コレクションの Atlas ベクトル検索インデックスの構築に必要なメモリが削減されます。これにより、mongot
3.7524のRAMは、スカラーの場合は x だけ、バイナリの場合は4 x ずつ削減されます。ベクトル値はそれぞれ x と32 x だけ縮小されますが、 Hierarchical Navigable Small Worldsグラフ自体は縮小されません。
binData
ベクトルをまだ作成していない場合は、データをコレクションに書き込む前に、サポートされているドライバーを使用して埋め込みをこの形式に変換できます。このページでは、埋め込みを BinData の vector
サブタイプに変換する手順について説明します。
対応ドライバー
BSON BinData vector
サブタイプfloat32
、int1
、および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_airbnb
binData
データベース内の コレクションの埋め込みがないドキュメントのサブセットが使用されます。これは独自のデータベースとコレクション(埋め込みの有無にかかわらず)に置き換えることができます。新しいデータ用の ベクトルを作成するか、Atlas クラスターにすでに存在するデータ用に[] タブを選択します。
.ipynb
拡張機能のファイルを保存してインタラクティブPythonノートを作成し、ノート内で次の手順を実行します。の例を試すには、プレースホルダーを有効な値に置き換えます。
必要なライブラリをインストールします。
以下のコマンドを実行して、 PyMongoドライバー をインストールします。必要に応じて、埋め込みモデル プロバイダーからライブラリをインストールすることもできます。この操作が完了するまでに数分かかる場合があります。
pip install pymongo
PyMongo v4.10 以降のドライバーをインストールする必要があります。
例
PyMongo と Cohere のインストール
pip --quiet install pymongo cohere
BSON ベクトルを生成するデータをノートブックにロードします。
例
インポートするサンプルデータ
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.", ]
(条件付き)データから埋め込みを生成します。
データから埋め込みをまだ生成していない場合は、この手順が必要です。すでに埋め込みを生成している場合は、この手順をスキップしてください。データから埋め込みを生成する方法の詳細については、「ベクトル埋め込みを作成する方法」を参照してください。
例
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
埋め込みから BSON ベクトルを作成します。
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))
BSON ベクトル埋め込みを使用してドキュメントを作成します。
コレクションのドキュメント内に 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)
データを Atlas クラスターにロードします。
Atlas UI から、およびプログラムでデータを読み込むことができます。Atlas UI からデータをロードする方法については、「データの挿入」を参照してください。次の手順と関連する例は、PyMongo ドライバーを使用してプログラムでデータをロードする方法を示しています。
Atlas クラスターに接続します。
プレースホルダー有効な値<ATLAS-CONNECTION-STRING>
Atlas接続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") 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)
コレクションに Atlas Vector Search インデックスを作成します。
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)
Atlas Vector Search クエリを実行するための関数を定義します。
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)
Atlas Vector Search クエリを実行します。
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}]
必要なライブラリをインストールします。
以下のコマンドを実行して、 PyMongoドライバー をインストールします。必要に応じて、埋め込みモデル プロバイダーからライブラリをインストールすることもできます。この操作が完了するまでに数分かかる場合があります。
pip install pymongo
PyMongo v4.10 以降のドライバーをインストールする必要があります。
例
PyMongo と Cohere のインストール
pip --quiet install pymongo cohere
ベクトル埋め込みを生成し、埋め込みをBSON互換形式に変換するための関数を定義します。
埋め込みモデルを使用して、次の操作を実行する関数を定義する必要があります。
既存のデータに埋め込みがない場合は、既存のデータから埋め込みを生成します。
埋め込みをBSONベクトルに変換する。
例
埋め込みを生成および変換する関数
プレースホルダー | 有効な値 |
---|---|
<COHERE-API-KEY> | Coordinate のAPIキー。 |
1 import os 2 import pymongo 3 import cohere 4 from bson.binary import Binary, BinaryVectorDtype 5 6 # Specify your OpenAI API key and embedding model 7 os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>" 8 cohere_client = cohere.Client(os.environ["COHERE_API_KEY"]) 9 10 # Function to generate embeddings using Cohere 11 def 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 22 def generate_bson_vector(vector, vector_dtype): 23 return Binary.from_vector(vector, vector_dtype)
1 import os 2 import pymongo 3 import cohere 4 from bson.binary import Binary, BinaryVectorDtype 5 6 # Specify your OpenAI API key and embedding model 7 os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>" 8 cohere_client = cohere.Client(os.environ["COHERE_API_KEY"]) 9 10 # Function to generate embeddings using Cohere 11 def 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 22 def generate_bson_vector(vector, vector_dtype): 23 return Binary.from_vector(vector, vector_dtype)
1 import os 2 import pymongo 3 import cohere 4 from bson.binary import Binary, BinaryVectorDtype 5 6 # Specify your OpenAI API key and embedding model 7 os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>" 8 cohere_client = cohere.Client(os.environ["COHERE_API_KEY"]) 9 10 # Function to generate embeddings using Cohere 11 def 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 22 def generate_bson_vector(vector, vector_dtype): 23 return Binary.from_vector(vector, vector_dtype)
Atlas クラスターに接続し、既存のデータを取得します。
以下を提供する必要があります。
埋め込みを生成するデータベースとコレクションを含む Atlas クラスターに接続するための接続文字列。
埋め込みを生成するコレクションを含むデータベースの名前。
埋め込みを生成するコレクションの名前。
例
データにアクセスするための Atlas クラスターへの接続
プレースホルダー | 有効な値 |
---|---|
<ATLAS-CONNECTION-STRING> | Atlas接続string 。 詳しくは、「ドライバーによる接続 」を参照してください。 |
1 # Connect to your Atlas cluster 2 mongo_client = pymongo.MongoClient("<ATLAS-CONNECTION-STRING>") 3 db = mongo_client["sample_airbnb"] 4 collection = db["listingsAndReviews"] 5 6 # Filter to exclude null or empty summary fields 7 filter = { "summary": {"$nin": [None, ""]} } 8 9 # Get a subset of documents in the collection 10 documents = collection.find(filter).limit(50) 11 12 # Initialize the count of updated documents 13 updated_doc_count = 0
コレクションへの埋め込みを生成、変換、ロードします 。
データにまだ埋め込みがない場合は、任意の埋め込みモデルを使用してデータから埋め込みを生成します。データから埋め込みを生成する方法の詳細については、「 ベクトル埋め込みの作成方法 」を参照してください。
埋め込みをBSONベクトルに変換します(次の例の 7に表示されているように)。
Atlas クラスターのコレクションに埋め込みをアップロードします。
これらの操作が完了するまでに数分かかる場合があります。
例
コレクションへの埋め込みの生成、変換、ロード
1 for 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 16 print(f"Updated {updated_doc_count} documents with BSON embeddings.")
1 for 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 16 print(f"Updated {updated_doc_count} documents with BSON embeddings.")
1 for 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 16 print(f"Updated {updated_doc_count} documents with BSON embeddings.")
コレクションに Atlas Vector Search インデックスを作成します。
Atlas Vector Search インデックスは、 Atlas UI、 Atlas CLI、 Atlas Administration API 、および希望言語のMongoDBドライバー を使用して、Atlas ベクトル検索インデックスを作成できます。詳細については、「ベクトル検索のフィールドにインデックスを作成する方法 」を参照してください。
例
コレクションの インデックスを作成する
プレースホルダー | 有効な値 |
---|---|
<INDEX-NAME> | vector 型インデックスの名前。 |
1 from pymongo.operations import SearchIndexModel 2 3 vector_search_index_definition = { 4 "fields":[ 5 { 6 "type": "vector", 7 "path": "embedding", 8 "similarity": "euclidean", 9 "numDimensions": 1024, 10 } 11 ] 12 } 13 14 search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch") 15 16 collection.create_search_index(model=search_index_model)
インデックスの構築には約 1 分かかります。 構築中、インデックスは最初の同期状態になります。 構築が完了したら、コレクション内のデータのクエリを開始できます。
Atlas Vector Search クエリを実行するための関数を定義します。
Atlas ベクトル検索クエリを実行する関数は、次のアクションを実行する必要があります。
クエリテキストの埋め込みを生成します。
クエリテキストを BSON ベクトルに変換する。
Atlas Vector Search クエリのパイプラインを定義する。
例
Atlas ベクトル検索クエリを実行する関数
プレースホルダー | 有効な値 |
---|---|
<INDEX-NAME> | vector 型インデックスの名前。 |
<NUMBER-OF-CANDIDATES-TO-CONSIDER> | 検索中に使用する最近傍の数。 |
<NUMBER-OF-DOCUMENTS-TO-RETURN> | 結果で返されるドキュメントの数。 |
1 def 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)
1 def 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)
1 def 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)
Atlas Vector Search クエリを実行します。
Atlas Vector Search クエリをプログラムで実行できます。詳細については、「ベクトル検索クエリの実行」を参照してください。
例
サンプル Atlas ベクトル検索クエリの実行
1 from pprint import pprint 2 3 query_text = "ocean view" 4 query_results = run_vector_search(query_text, collection, "embedding") 5 6 print("results from your embeddings") 7 pprint(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 検索の結果に最近傍 を含む頻度を測定できます。
クエリ結果を評価する方法のデモについては、「 クエリ結果の精度を測定する方法 」を参照してください。