Visão geral
Neste guia, você pode aprender como usar o Django MongoDB Backend para executar queries do Atlas Vector Search. Esse recurso permite realizar uma pesquisa semântica em seus documentos. Uma pesquisa semântica é um tipo de pesquisa que localiza informações com significado semelhante, mas não necessariamente idênticas, ao termo ou frase de pesquisa fornecida.
Dados de amostra
Os exemplos nesta aba usam o modelo MovieWithEmbeddings
, que representa a collection sample_mflix.embedded_movies
dos conjuntos de dados de amostra do Atlas. A classe de modelo MovieWithEmbeddings
tem a seguinte definição:
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
O modelo MovieWithEmbeddings
inclui uma classe Meta
interna, que especifica os metadados do modelo, e um método __str__()
, que define a representação de string do modelo. Para saber mais sobre essas funcionalidades de modelo, consulte Definir um modelo no guia Criar modelos.
Exemplos de código de execução
Você pode usar o shell interativo do Python para executar os exemplos de código. Para entrar na shell, execute o seguinte comando no diretório raiz do seu projeto:
python manage.py shell
Depois de inserir o shell do Python, certifique-se de importar os seguintes modelos e módulos:
from <your application name>.models import MovieWithEmbeddings
Para saber como criar um aplicação Django que use o modelo Movie
e o shell interativo Python para interagir com documentos do MongoDB, acesse o tutorial de Introdução.
Realizar uma Vector Search
Importante
Requisitos de query
Antes de executar queries do Atlas Vector Search , você deve criar um índice do Atlas Vector Search em sua collection. Para saber como usar o Django MongoDB Backend para criar um índice do Atlas Vector Search, consulte Índices do Atlas Vector Search no guia Criar índices.
Você pode usar o Django MongoDB Backend para consultar seus dados com base em seu significado semântica. Uma query do Atlas Vector Search retorna resultados com base em um vetor de query ou em uma array de números que representa o significado de seu termo ou frase de pesquisa. O MongoDB compara esse vetor de query com os vetores armazenados nos campos de vetor de seus documentos.
Para especificar seus critérios do Atlas Vector Search , crie uma instância da classe de expressão SearchVector
fornecida pelo módulo django_mongodb_backend.expressions
. Esta expressão corresponde ao estágio de pipeline MongoDB $vectorSearch
. Passe os seguintes argumentos para o construtor SearchVector()
:
path
: O campo a ser consultado.query_vector
: uma array de números que representa seus critérios de pesquisa. Para saber mais sobre vetores de query, consulte vetores na documentação do MongoDB Atlas.limit
: o número máximo de resultados a serem retornados.num_candidates
: (Opcional) O número de documentos a considerar para a query.exact
: (Opcional) Um valor booleano que indica se deve ser executada uma pesquisa pelo vizinho mais próximo (ENN). O valor padrão éFalse
. Para saber mais sobre pesquisas ENN, consulte Pesquisa ENN (Exact nearest Neighbor) na documentação do MongoDB Atlas.filter
: (Opcional) Um filtro para aplicar aos resultados da consulta.
Em seguida, execute sua query do Atlas Vector Search passando sua SearchVector
instância para o annotate
método da QuerySet
API do Django. O seguinte código mostra a sintaxe para executar uma query do Atlas Vector Search :
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> ) )
Exemplo de Vector Search básica
Este exemplo executa uma query do Atlas Vector Search na collection sample_mflix.embedded_movies
. A query executa as seguintes ações:
Executa query do campo vetorial
plot_embedding
.Limita os resultados a
5
documentos.Especifica uma pesquisa vetorial do vizinho mais próximo (ANN) que considera
150
candidatos. Para saber mais sobre pesquisas de ANN, consulte Pesquisa ANN (Approximate nearest Neighbor) na documentação do MongoDB Atlas.
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>]>
Dica
O exemplo de código anterior passa um vetor arbitrário para o argumento query_vector
. Para saber como gerar um vetor que representa o significado de um termo ou frase de pesquisa, consulte Como criar incorporações vetoriais na documentação do MongoDB Atlas.
Exemplo de pontuação do Vector Search
O MongoDB atribui uma pontuação de relevância a cada documento retornado em uma query do Atlas Search . Os documentos incluídos em um conjunto de resultados são ordenados da pontuação de relevância mais alta para a mais baixa.
Para incluir essa pontuação nos resultados da query, você pode usar o método values()
da API QuerySet
do Django. Passe o campo score
como um argumento para o método values()
.
O exemplo a seguir mostra como executar a mesma query de pesquisa vetorial do exemplo anterior e imprimir as pontuações de relevância da pesquisa vetorial dos documentos:
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}]>
Informações adicionais
Para saber mais sobre o Atlas Vector Search, consulte os seguintes recursos na documentação do MongoDB Atlas :