Visão geral
Você pode usar o MongoDB pesquisa vetorial com o provedor EF Core para realizar pesquisas semânticas em dados armazenados no Atlas. A query de pesquisa vetorial seus dados com base no significado semântico, em vez de correspondências de palavras-chave, permitindo que você recupere resultados mais relevantes. Você pode usar o MongoDB pesquisa vetorial para oferecer suporte a casos de uso como pesquisa semântica, pesquisa híbrida e geração aumentada de recuperação (RAG).
Para saber mais sobre a pesquisa vetorial do MongoDB, consulte a Visão geral da pesquisa vetorial do MongoDB na documentação do Atlas.
Dados de amostra
Os exemplos neste guia usam a coleção embedded_movies do banco de dados sample_mflix . Os documentos nesta coleção utilizam a seguinte classe Movie como um modelo:
public class Movie { public ObjectId Id { get; set; } public string Title { get; set; } = null!; public string Plot { get; set; } = null!; public float[] PlotEmbedding { get; set; } = null!; }
A coleção embedded_movies faz parte dos conjuntos de dados de amostra fornecidos pelo Atlas. Para configurar um cluster e carregar esses dados de amostra, consulte o guia Início rápido.
Definição do modelo
Para usar o MongoDB pesquisa vetorial com o EF Core provedor, defina um campo vetorial em sua classe de entidade. Configure um índice vetorial nesse campo usando o método de API fluente IsVectorIndex().
O exemplo a seguir define uma entidade Movie com um campo vetorial chamado PlotEmbedding e configura um índice vetorial nesse campo.
public class MoviesDbContext : DbContext { public DbSet<Movie> Movies { get; init; } = null!; public MoviesDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Movie>(entity => { entity.ToCollection("embedded_movies"); entity.Property(m => m.Title).HasElementName("title"); entity.Property(m => m.Plot).HasElementName("plot"); entity.Property(m => m.PlotEmbedding).HasElementName("plot_embedding") .HasBinaryVectorDataType(BinaryVectorDataType.Float32); entity.HasIndex(m => m.PlotEmbedding, "vector_index") .IsVectorIndex(VectorSimilarity.Cosine, 1536); }); } }
Observação
Você não pode alterar ou excluir índice usando o provedor EF Core depois que eles são criados. Para alterar ou excluir um índice, use o driver .NET/C#. Para aprender mais, consulte o guia MongoDB Search e MongoDB Vector Search índices de pesquisa na documentação do driver .NET/C#.
Tipos de incorporação de vetor compatíveis
O provedor do EF Core suporta embedding vetorial dos seguintes tipos:
Representações de array
O provedor do EF Core suporta os seguintes tipos de array como embedding de vetor:
float[]double[]Memory<float>e aReadOnlyMemory<float>Memory<double>e aReadOnlyMemory<double>
Representações binárias
O provedor EF Core oferece suporte aos seguintes tipos de vetor binário, que reduzem o armazenamento e melhoram o desempenho da query em comparação com os tipos de array:
BinaryVectorFloat32— floats de 32bits de precisão totalBinaryVectorInt8— Inteiros quantizados de 8bitsBinaryVectorPackedBit— valores binários compactados de 1bits
O namespace MongoDB.Driver do driver .NET/C# contém os enums VectorQuantization e VectorSimilarity usados para configurar índices de vetor binário.
Exemplo de consulta de pesquisa vetorial
Você pode usar o método VectorSearch() para executar uma query de pesquisa vetorial. O exemplo a seguir consulta a coleção embedded_movies para filmes com um valor de campo PlotEmbedding semanticamente semelhante a "aventura de viagem no tempo" e, em seguida, retorna até 10 documentos correspondentes.
// Replace queryVector with a 1536-dimension embedding vector from your model float[] queryVector = new float[] { 0.1f, -0.2f, 0.3f, ... }; var results = context.Movies .VectorSearch(m => m.PlotEmbedding, queryVector, limit: 10) .ToList();
Informações adicionais
Para saber mais sobre a pesquisa vetorial do MongoDB, consulte a documentação da pesquisa vetorial do MongoDB.
Para documentação da API, consulte os seguintes recursos: