Visão geral
Neste guia, você pode aprender como usar o backend do Django MongoDB para executar queries de pesquisa do MongoDB 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 de pesquisa do MongoDB pesquisa vetorial, você deve criar um índice de pesquisa vetorial em sua coleção. Para aprender como usar o backend do MongoDB do Django para criar um índice de pesquisa vetorial, veja Índices de pesquisa vetorial no guia Criar índices.
Você pode usar o Django MongoDB backend para fazer query em seus dados com base em seu significado semântico. Uma query do MongoDB pesquisa vetorial retorna resultados com base em um vetor de query ou em um array de números que representa o significado do 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 da pesquisa vetorial, 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ãoFalseé. Para saber mais sobre pesquisas ENN, consulte ENN Search na documentação do MongoDB Atlas .filter: (Opcional) Um filtro para aplicar aos resultados da consulta.
Em seguida, execute sua query de pesquisa vetorial passando sua instância SearchVector para o método annotate da API QuerySet do Django. O seguinte código mostra a sintaxe para executar uma query da pesquisa vetorial:
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 MongoDB pesquisa vetorial na coleção sample_mflix.embedded_movies. A query executa as seguintes ações:
Executa query do campo vetorial
plot_embedding.Limita os resultados a
5documentos.Especifica uma pesquisa vetorial do vizinho mais próximo (ANN) que considera
150candidatos. Para saber mais sobre pesquisas de ANN, consulte Pesquisa de ANN 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 da pesquisa vetorial. 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 a pesquisa vetorial do MongoDB, consulte o seguinte recurso na documentação do MongoDB Atlas: