Overview
En esta guía, puede aprender a usar Django MongoDB Backend para realizar MongoDB Vector Search queries. Esta funcionalidad te permite realizar una búsqueda semántica en tus documentos. Una búsqueda semántica es un tipo de búsqueda que localiza información que es similar en significado, pero no necesariamente idéntica, al término o frase de búsqueda que has proporcionado.
Datos de muestra
Los ejemplos de esta guía utilizan el MovieWithEmbeddings el modelo, que representa la colección sample_mflix.embedded_movies de los Conjuntos de datos de muestra de Atlas. La clase del modelo MovieWithEmbeddings tiene la siguiente definición:
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
El modelo MovieWithEmbeddings incluye una clase interna Meta, que especifica los metadatos del modelo, y un método __str__(), que define la representación de cadena del modelo. Para obtener más información sobre estas características del modelo, consulte Defina un modelo en la guía Crear modelos.
Ejecutar ejemplos de código
Puedes usar la shell interactiva de Python para ejecutar los ejemplos de código. Para ingresar a la shell, ejecute el siguiente comando desde el directorio raíz de su Proyecto:
python manage.py shell
Después de ingresar al shell de Python, asegúrese de importar los siguientes modelos y módulos:
from <your application name>.models import MovieWithEmbeddings
Para aprender a crear una aplicación de Django que use el modelo Movie y el shell interactivo de Python para interactuar con documentos de MongoDB, visita el tutorial de Introducción a Django MongoDB Backend.
Realiza una búsqueda vectorial
Importante
Requisitos de consulta
Antes de que se puedan realizar consultas de MongoDB Vector Search, se debe crear un índice de búsqueda vectorial en su colección. Para aprender a usar Django MongoDB backend para crear un índice de búsqueda vectorial, consulta Índices de búsqueda vectorial en la guía Crear Índices.
Puede usar Django MongoDB Backend para query sus datos según su significado semántico. Una query de MongoDB Vector Search devuelve resultados basados en un vector de query, es decir, un arreglo de números que representa el significado de tu término o frase de búsqueda. MongoDB compara este vector de query con los vectores almacenados en los campos vector de tus documentos.
Para especificar tus criterios de búsqueda vectorial, crea una instancia de la clase de expresión SearchVector proporcionada por el módulo django_mongodb_backend.expressions. Esta expresión corresponde a la etapa de pipeline de MongoDB $vectorSearch. Pasa los siguientes argumentos al constructor de SearchVector():
path: El campo a query.query_vector: Un arreglo de números que representan sus criterios de búsqueda. Para obtener más información sobre los vectores de query, consulta vectores en la documentación de MongoDB Atlas.limit: El número máximo de resultados a devolver.num_candidates: (Opcional) El número de documentos a considerar para la consulta.exact: (Opcional) Un valor booleano que indica si se debe realizar una búsqueda de vecino más cercano exacto (ENN). El valor predeterminadoFalsees. Para obtener más información sobre las búsquedas ENN, consulte Búsqueda ENN en la documentación de MongoDB Atlas.filter: (Opcional) Un filtro para aplicar a los resultados de la query.
Luego, ejecute su consulta de búsqueda vectorial pasando su SearchVector instancia al annotate método desde la API de Django.QuerySet El siguiente código muestra la sintaxis para realizar una consulta de búsqueda vectorial:
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> ) )
Ejemplo básico de búsqueda vectorial
Este ejemplo ejecuta una consulta de búsqueda vectorial de MongoDB en la colección sample_mflix.embedded_movies. La consulta realiza las siguientes acciones:
Consulta el campo vectorial
plot_embedding.Limita los resultados a
5documentos.Especifica una búsqueda vectorial de Vecino Más Cercano Aproximado (ANN) que considera
150candidatos. Para obtener más información sobre las búsquedas ANN, consulta Búsqueda ANN en la documentación de 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>]>
Tip
El ejemplo de código anterior pasa un vector arbitrario al argumento query_vector. Para aprender cómo generar un vector que represente el significado de un término o frase de búsqueda, consulta Cómo crear incrustaciones vectoriales manualmente en la documentación de MongoDB Atlas.
Ejemplo de puntuación de búsqueda vectorial
MongoDB asigna una puntuación de relevancia a cada documento devuelto en una búsqueda vectorial query. Los documentos incluidos en un conjunto de resultados se ordenan desde el puntaje de relevancia más alto hasta el más bajo.
Para incluir esta puntuación en los resultados de tu query, puedes utilizar el método values() de la API QuerySet de Django. Pasa el campo score como argumento al método values().
El siguiente ejemplo muestra cómo ejecutar la misma query de búsqueda vectorial que el ejemplo anterior e imprimir las puntuaciones de relevancia de búsqueda vectorial de los 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}]>
Información Adicional
Para obtener más información sobre MongoDB Vector Search, consulte los siguientes recursos de la documentación de MongoDB Atlas: