Overview
このガイドでは、Diango MongoDBバックエンドを使用して Atlas ベクトル検索クエリを実行する方法を説明します。この機能を使用すると、ドキュメントに対してセマンティック検索を実行できます。セマンティック検索とは、指定した検索タームやフレーズと意味が似ているが、必ずしも同一ではない情報を検索するタイプの検索です。
サンプル データ
このガイドの例では、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アプリケーションを作成する方法については、使い始める チュートリアルをご覧ください。
ベクトル検索の実行
重要
クエリ要件
Atlas ベクトル検索クエリを実行する前に、コレクションに Atlas ベクトル検索インデックスを作成する必要があります。 Diango MongoDBバックエンド を使用して Atlas ベクトル検索インデックスを作成する方法については、 インデックスの作成ガイドの「 Atlas ベクトル検索インデックス 」を参照してください。
Dpango MongoDBバックエンド を使用すると、セマンティック意味に基づいてデータをクエリできます。Atlas ベクトル検索クエリは、ベクトル、または検索タームやフレーズの意味を表す数値の配列に基づいて結果を返します。 MongoDB は、このクエリベクトルをドキュメントのベクトルフィールドに保存されているベクトルと比較します。
Atlas ベクトル検索条件を指定するには、django_mongodb_backend.expressions
モジュールが提供する SearchVector
式クラスのインスタンスを作成します。 この式は、$vectorSearch
MongoDBパイプラインステージに対応します。次の引数を SearchVector()
コンストラクターに渡します。
path
: クエリするフィールド。query_vector
: 検索条件を表す数値の配列。クエリ ベクトルの詳細については、 MongoDB Atlasドキュメントの「 ベクトル 」を参照してください。limit
: 返される結果の最大数。num_candidates
: (任意)クエリで考慮するドキュメントの数。exact
: (任意) 完全近傍(enn)検索を実行するかどうかを示すブール値値。デフォルト値はFalse
です。ENN 検索の詳細については、 MongoDB Atlasドキュメントの ENN(完全近傍)検索 を参照してください。filter
: (任意)クエリ結果に適用するフィルター。
Then, run your Atlas Vector Search query by passing your SearchVector
instance to the annotate
method from Django's QuerySet
API. The following code shows the syntax for performing an Atlas Vector Search query:
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
コレクションに対して Atlas ベクトル検索クエリを実行します。 クエリは、次のアクションを実行します。
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 は、Atlas Search クエリで返されるすべてのドキュメントに関連性スコアを割り当てます。結果セットに含まれるドキュメントは、関連性スコアの高いものから低いものの順に並べられます。
このスコアをクエリ結果に含めるには、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}]>
詳細情報
Atlas ベクトル検索の詳細については、 MongoDB Atlasドキュメントの次のリソースを参照してください。