Overview
在本指南中,您可以学习;了解如何使用 Django MongoDB后端执行 Atlas Vector Search查询。此功能允许您对文档执行语义搜索。语义搜索是一种搜索,可查找与您提供的搜索术语或短语含义相似但不一定相同的信息。
样本数据
本指南中的示例使用 MovieWithEmbeddings
模型,它表示Atlas示例数据集的 sample_mflix.embedded_movies
集合。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
类(用于指定模型元数据)和一个 __str__()
方法(用于定义模型的字符串表示形式)。 要学习;了解这些模型功能,请参阅创建模型指南中的 定义模型。
运行代码示例
您可以使用Python交互式Shell来运行代码示例。 要进入Shell ,请从项目的根目录运行以下命令:
python manage.py shell
进入Python Shell后,请确保导入以下模型和模块:
from <your application name>.models import MovieWithEmbeddings
要学习;了解如何创建使用 Movie
模型和Python交互式Shell与MongoDB文档交互的Django应用程序,请访问入门教程。
执行向量搜索
重要
查询要求
在执行Atlas Vector Search查询之前,您必须在集合上创建Atlas Vector Search索引。要学习;了解如何使用 Django MongoDB后端创建Atlas Vector Search索引,请参阅创建索引指南中的Atlas Vector Search索引。
您可以使用 Django MongoDB后端根据数据的语义查询数据。Atlas Vector Search查询根据查询向量或表示搜索术语或短语含义的数字大量返回结果。MongoDB将此查询向量与存储在文档向量字段中的向量进行比较。
要指定Atlas Vector Search标准,请创建 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 Vector Search查询。该查询执行以下操作:
查询
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>]>
提示
前面的代码示例将任意向量传递给 query_vector
参数。要学习;了解如何生成表示搜索术语或短语含义的向量,请参阅MongoDB Atlas文档中的如何创建向量嵌入。
Vector Search Score 示例
MongoDB会为Atlas Search查询中返回的每个文档分配一个相关性分数。结果设立包含的文档按相关性分数从高到低排序。
要在查询结果中包含此分数,可以使用 Django 的 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 Vector Search 的更多信息,请参阅MongoDB Atlas文档中的以下资源: