Overview
このガイドでは、Diango MongoDBバックエンドを使用して MongoDB ベクトル検索クエリを実行する方法を説明します。この機能を使用すると、ドキュメントに対してセマンティック検索を実行できます。セマンティック検索とは、指定した検索タームやフレーズと意味が似ているが、必ずしも同一ではない情報を検索するタイプの検索です。
サンプル データ
このガイドの例では、Atlasサンプルデータセット の sample_mflix.embedded_moviesコレクションを表す MovieWithEmbeddings モデルを使用します。MovieWithEmbeddings モデルクラスには、次の定義があります。
from django.db import models from django_mongodb_backend.fields import ArrayField class MovieWithEmbeddings(models.Model): title = models.CharField(max_length=200) runtime = models.IntegerField(default=0) plot_embedding = ArrayField(models.FloatField(), size=1536, null=True, blank=True) class Meta: db_table = "embedded_movies" managed = False def __str__(self): return self.title
MovieWithEmbeddings モデルには、モデルメタデータを指定する内部 Metaクラスと、モデルの string 表現を定義する __str__() メソッドが含まれています。 これらのモデル機能について詳しくは、「 モデルの作成ガイドでモデルを定義する 」を参照してください。
コード例の実行
Pythonインタラクティブシェル を使用してコード例を実行できます。 シェルを入力するには、プロジェクトの ルートディレクトリから次のコマンドを実行します。
python manage.py shell
Python シェルを入力したら、次のモデルとモジュールをインポートしていることを確認します。
from <your application name>.models import MovieWithEmbeddings
Movie モデルとPython対話型シェル を使用してMongoDBドキュメントを操作する Dlangoアプリケーションを作成する方法については、使い始める チュートリアルをご覧ください。
ベクトル検索の実行
重要
クエリ要件
MongoDB ベクトル検索クエリを実行する前に、コレクションにベクトル検索インデックスを作成する必要があります。 Dpango MongoDBバックエンド を使用してベクトル検索インデックスを作成する方法については、 インデックスの作成ガイドの「 ベクトル検索インデックス 」を参照してください。
Dpango MongoDBバックエンド を使用すると、セマンティック意味に基づいてデータをクエリできます。 MongoDB ベクトル検索クエリは、クエリベクトル、または検索タームやフレーズの意味を表す数値の配列に基づいて結果を返します。 MongoDB は、このクエリベクトルをドキュメントのベクトルフィールドに保存されているベクトルと比較します。
ベクトル検索条件を指定するには、 SearchVectorモジュールが提供するdjango_mongodb_backend.expressions$vectorSearch 式クラスのインスタンスを作成します。この式は、 MongoDBパイプラインステージに対応します。次の引数をSearchVector() コンストラクターに渡します。
path: クエリするフィールド。query_vector: 検索条件を表す数値の配列。クエリ ベクトルの詳細については、 MongoDB Atlasドキュメントの「 ベクトル 」を参照してください。limit: 返される結果の最大数。num_candidates: (任意)クエリで考慮するドキュメントの数。exact: (任意) 完全近傍(enn)検索を実行するかどうかを示すブール値値。デフォルト値はFalseです。ENN 検索の詳細については、 MongoDB Atlasドキュメントの ENN(完全近傍)検索 を参照してください。filter: (任意)クエリ結果に適用するフィルター。
次に、SearchVector annotateインスタンスをDpango のQuerySet APIから メソッドに渡してベクトル検索クエリを実行します。次のコードは、ベクトル検索クエリを実行するための構文を示しています。
from django_mongodb_backend.expressions import SearchVector Model.objects.annotate( score=SearchVector( path="<field name>", query_vector=[<vector values>], limit=<number>, num_candidates=<number>, exact=<boolean>, filter=<filter expression> ) )
基本的なベクトル検索の例
この例では、 sample_mflix.embedded_moviesコレクションに対してMongoDB ベクトル検索クエリを実行します。クエリは、次のアクションを実行します。
plot_embeddingベクトルフィールドをクエリします。結果を
5ドキュメントに制限します。150候補を考慮する近似最近傍(ANN)ベクトル検索を指定します。ANN 検索の詳細については、 MongoDB AtlasドキュメントのANN(近似近傍)検索を参照してください。
vector_values = [float(i % 10) * 0.1 for i in range(1536)] MovieWithEmbeddings.objects.annotate( score=SearchVector( path="plot_embedding", query_vector=vector_values, limit=5, num_candidates=150, exact=False, ) )
<QuerySet [<MovieWithEmbeddings: Berserk: The Golden Age Arc I - The Egg of the King>, <MovieWithEmbeddings: Rollerball>, <MovieWithEmbeddings: After Life>, <MovieWithEmbeddings: What Women Want>, <MovieWithEmbeddings: Truth About Demons>]>
Tip
上記のコード例では、任意のベクトルをquery_vector 引数に渡します。検索タームやフレーズの意味を表すベクトルを生成する方法については、 MongoDB Atlasドキュメントの「 ベクトル埋め込みの作成方法 」を参照してください。
ベクトル検索のスコアの例
MongoDB は、ベクトル検索クエリで返されるすべてのドキュメントに関連性スコアを割り当てます。結果セットに含まれるドキュメントは、関連性スコアの高いものから低いものの順に並べられます。
このスコアをクエリ結果に含めるには、Diango の QuerySet APIの values() メソッドを使用できます。scoreフィールドをvalues() メソッドの引数として渡します。
次の例は、前の例と同じベクトル検索クエリーを実行し、ドキュメントのベクトル検索関連性スコアを出力する方法を示しています。
vector_values = [float(i % 10) * 0.1 for i in range(1536)] MovieWithEmbeddings.objects.annotate( score=SearchVector( path="plot_embedding", query_vector=vector_values, limit=5, num_candidates=150, exact=False, ) ).values("title", "score")
<QuerySet [{'title': 'Berserk: The Golden Age Arc I - The Egg of the King', 'score': 0.47894009947776794}, {'title': 'Rollerball', 'score': 0.45006513595581055}, {'title': 'After Life', 'score': 0.42825883626937866}, {'title': 'What Women Want', 'score': 0.4211753308773041}, {'title': 'Truth About Demons', 'score': 0.4194544851779938}]>
詳細情報
MongoDB ベクトル検索の詳細については、 MongoDB Atlasドキュメントの次のリソースを参照してください。