Overview
En esta guía, aprenderá a usar Mongoid para ejecutar consultas de búsqueda vectorial de MongoDB. La búsqueda vectorial de MongoDB le permite query sus documentos en función de su significado semántico mediante el uso de incrustaciones vectoriales.
Mongoid proporciona el método vector_search, que compila y ejecuta una etapa de agregación $vectorSearch para usted. Para aprender más sobre la etapa de agregación $vectorSearch, consulte la guía de operaciones de agregación.
Nota
Compatibilidad de implementación
Para usar la búsqueda vectorial de MongoDB, debe conectarse a un clúster de MongoDB Atlas o a una implementación autogestionada que ejecute MongoDB 8.2 o posterior.
Para aprender más sobre MongoDB Vector Search, se puede consultar MongoDB Vector Search Overview en la documentación de Atlas.
Requisitos previos
Antes de ejecutar una query de búsqueda vectorial de MongoDB, debe definir un campo vectorial y un índice de búsqueda vectorial en su modelo y, a continuación, crear el índice en su colección. Para aprender a declarar y crear índices de búsqueda vectorial, consulte la sección Índices de búsqueda vectorial de MongoDB de la guía de índices.
Los ejemplos de esta guía utilizan el siguiente modelo Movie, que se asigna a la colección embedded_movies de la base de datos sample_mflix. El campo plot_embedding almacena incrustaciones vectoriales de la trama de cada película.
class Movie include Mongoid::Document store_in collection: "embedded_movies", database: "sample_mflix" field :title, type: String field :plot, type: String field :year, type: Integer field :plot_embedding, type: Array # Declare a vector search index on the `plot_embedding` field. The `_id` # and `year` filter fields enable instance-level and filtered queries. vector_search_index :plot_embedding_index, fields: [ { type: "vector", path: "plot_embedding", numDimensions: 1536, similarity: "cosine" }, { type: "filter", path: "_id" }, { type: "filter", path: "year" } ] end
Tip
Datos de muestra de Atlas
Para aprender a cargar los sample_mflix datos de muestra, consulte el tutorial Cargar datos en Atlas en la documentación de Atlas.
Ejecutar una consulta de búsqueda vectorial
Para ejecutar una query de búsqueda vectorial de MongoDB, llama al método de clase vector_search en tu modelo y pasa un vector de query como primer argumento. El vector de query es una incrustación vectorial que representa tu entrada de búsqueda.
El siguiente ejemplo de código ejecuta una MongoDB búsqueda vectorial query en el campo plot_embedding e imprime el título de cada película coincidente. Debido a que el modelo Movie declara solo un índice de búsqueda vectorial, Mongoid selecciona automáticamente el índice y el campo vectorial que se utilizarán.
# The query vector must have the same number of dimensions as the # vector search index (1536, in this example). query_vector = [ -0.0016261312, -0.028070757, -0.011342932, ..., -0.009710136 ] movies = Movie.vector_search(query_vector, limit: 5) movies.each do |movie| puts movie.title end
El método vector_search devuelve un arreglo de documentos Movie. Por defecto, devuelve los 10 documentos más similares. Para cambiar el número de resultados, establezca la opción limit. El ejemplo anterior especifica un límite de 5 resultados.
Puntaje de búsqueda vectorial
Cada documento que devuelve vector_search tiene un atributo vector_search_score, que describe lo bien que el documento coincide con el vector de query. Una puntuación más alta indica una coincidencia más cercana.
El siguiente código ejecuta la misma query que el ejemplo anterior, pero imprime el título y la puntuación de cada película coincidente:
movies = Movie.vector_search(query_vector, limit: 5) movies.each do |movie| puts "#{movie.title}: #{movie.vector_search_score}" end
Buscar documentos similares
También puede llamar al método vector_search en una instancia de documento para buscar documentos similares a ese documento. Cuando llama a vector_search en un documento, Mongoid utiliza el vector almacenado del propio documento como vector de query y excluye el propio documento de los resultados.
El siguiente código busca las cinco películas más similares a un documento Movie existente:
movie = Movie.find_by(title: "About Time") neighbors = movie.vector_search(limit: 5) neighbors.each do |neighbor| puts neighbor.title end
Opciones de búsqueda vectorial
Puede pasar los siguientes argumentos de palabra clave al método vector_search para personalizar su query:
Opción | Tipo | Descripción | Valor por defecto |
|---|---|---|---|
|
| Nombre del índice de búsqueda vectorial a usar. Solo es necesario si el modelo declara más de un índice de búsqueda vectorial. | Inferido del modelo |
|
| Campo que contiene las incrustaciones vectoriales. Obligatorio solo si el campo vectorial no se puede inferir a partir de la definición del índice. | Inferido del índice |
|
| Número máximo de documentos para devolver. |
|
|
| Número de vecinos más cercanos a considerar durante la búsqueda. |
|
|
| query utilizada para el filtro previo de documentos antes de la búsqueda. | Sin filtrado |
|
| Etapas de agregación adicionales para anexar después de la búsqueda vectorial. | Sin etapas adicionales |
El siguiente código ejecuta una query de búsqueda vectorial de MongoDB que considera 150 candidatos y devuelve solo las películas estrenadas después del año 2000:
movies = Movie.vector_search( query_vector, limit: 5, num_candidates: 150, filter: { year: { "$gt" => 2000 } } )
To learn more about these options, see the Fields section of the $vectorSearch operator reference in the Atlas documentation.
Información Adicional
Para aprender a declarar y crear índices de búsqueda vectorial, consulte la sección Índices de búsqueda vectorial de MongoDB de la guía Índices.
Para aprender más sobre los conceptos mencionados en esta guía, consulte las siguientes páginas de la documentación de Atlas:
Documentación de la API
Para obtener más información sobre los métodos mencionados en esta guía, consulta la siguiente documentación de la API: