Visão geral
Neste guia, você pode aprender a usar o Mongoid para executar query de pesquisa vetorial do MongoDB. A pesquisa vetorial do MongoDB permite que você consulte seus documentos com base em seu significado semântico usando embedding vetoriais.
O Mongoid fornece o método vector_search, que cria e executa um estágio de agregação $vectorSearch para você. Para saber mais sobre o estágio de agregação $vectorSearch, consulte o guia Operações de agregação.
Observação
Compatibilidade de implantação
Para usar a pesquisa vetorial do MongoDB, você deve se conectar a um cluster do MongoDB Atlas ou a uma implantação autogerenciada executando o MongoDB 8.2 ou posterior.
Para saber mais sobre a pesquisa vetorial do MongoDB, consulte a Visão geral da pesquisa vetorial do MongoDB na documentação do Atlas.
Pré-requisitos
Antes de executar uma query de pesquisa vetorial do MongoDB, você deve definir um campo vetorial e um índice de pesquisa vetorial em seu modelo e, em seguida, criar o índice em sua coleção. Para aprender a declarar e criar índice de pesquisa vetorial, consulte a seção Índice de pesquisa vetorial do MongoDB do guia Índice.
Os exemplos neste guia usam o seguinte modelo Movie, que mapeia para a coleção embedded_movies no banco de dados sample_mflix. O campo plot_embedding armazena embeddings de vetor do enredo de cada filme.
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
Dica
Dados de amostra do Atlas
Para aprender a carregar os dados de amostra sample_mflix, consulte o tutorial Carregar dados no Atlas na documentação do Atlas.
Executar uma consulta do Vector Search
Para executar uma query de pesquisa vetorial do MongoDB, chame o método da classe vector_search em seu modelo e passe um vetor de query como o primeiro argumento. O vetor de query é um embedding vetorial que representa sua entrada de pesquisa.
O exemplo de código a seguir executa uma query do MongoDB pesquisa vetorial no campo plot_embedding e imprime o título de cada filme correspondente. Como o modelo Movie declara apenas um índice de pesquisa vetorial, o Mongoid seleciona automaticamente o índice e o campo de vetor a serem usados.
# 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
Thrill Seekers About Time The Time Machine Timecop Crusade in Jeans
O método vector_search retorna um array de Movie documentos. Por padrão, ele retorna os 10 documentos mais semelhantes. Para alterar o número de resultados, defina a opção limit. O exemplo anterior especifica um limite de 5 resultados.
Pontuação de pesquisa vetorial
Cada documento que vector_search retorna tem um atributo vector_search_score, que descreve o quão bem o documento corresponde ao vetor de query. Uma pontuação mais alta indica uma correspondência mais próxima.
O código a seguir executa a mesma query do exemplo anterior, mas imprime o título e a pontuação de cada filme correspondente:
movies = Movie.vector_search(query_vector, limit: 5) movies.each do |movie| puts "#{movie.title}: #{movie.vector_search_score}" end
Thrill Seekers: 0.9253387451171875 About Time: 0.9246978759765625 The Time Machine: 0.9229583740234375 Timecop: 0.9228057861328125 Crusade in Jeans: 0.9222259521484375
Pesquisar documentos semelhantes
Você também pode chamar o método vector_search em uma instância de documento para encontrar documentos semelhantes a esse documento. Quando você chama vector_search em um documento, o Mongoid usa o vetor armazenado do próprio documento como o vetor de query e exclui o próprio documento dos resultados.
O código a seguir encontra os cinco filmes mais semelhantes a um documento Movie existente:
movie = Movie.find_by(title: "About Time") neighbors = movie.vector_search(limit: 5) neighbors.each do |neighbor| puts neighbor.title end
Thrill Seekers The Time Machine Timecop Crusade in Jeans Frequency
Opções de Vector Search
Você pode passar os seguintes argumentos de palavra-chave para o método vector_search para customizar sua query:
Opção | Tipo | Descrição | Valor padrão |
|---|---|---|---|
|
| Nome do índice de pesquisa vetorial a ser usado. Obrigatório somente se o modelo declarar mais de um índice de pesquisa vetorial. | Inferido do modelo |
|
| Campo que contém o embedding vetorial. Necessário somente se o campo vetorial não puder ser inferido a partir da definição do índice. | Inferido do índice |
|
| Número máximo de documentos a retornar. |
|
|
| Número de vizinhos mais próximos a serem considerados durante a pesquisa. |
|
|
| Query usada para pré-filtro documentos antes da pesquisa. | Sem filtragem |
|
| Estágios de agregação adicionais a serem anexados após a pesquisa vetorial. | Nenhum estágio adicional |
O código a seguir executa uma query de pesquisa vetorial do MongoDB que considera 150 candidatos e retorna apenas filmes lançados após o ano 2000:
movies = Movie.vector_search( query_vector, limit: 5, num_candidates: 150, filter: { year: { "$gt" => 2000 } } )
Para saber mais sobre essas opções, consulte a seção Campos da referência do operador $vectorSearch na documentação do Atlas.
Informações adicionais
Para aprender a declarar e criar índices de pesquisa vetorial, consulte a seção Índices de pesquisa vetorial do MongoDB do guia Índices.
Para aprender mais sobre os conceitos mencionados neste guia, consulte as seguintes páginas na documentação do Atlas:
Documentação da API
Para saber mais sobre os métodos mencionados neste guia, consulte a seguinte documentação da API: