Overview
您可以将MongoDB Vector Search 与 EF Core 提供程序结合使用,对Atlas中存储的数据执行语义搜索。 Vector 搜索根据语义而不是关键字匹配来查询数据,从而检索更相关的结果。您可以使用MongoDB Vector Search 来支持语义搜索、混合搜索和检索增强生成 (RAG) 等使用案例。
要学习;了解有关MongoDB Vector Search 的更多信息,请参阅Atlas文档中的 MongoDB Vector Search 概述。
样本数据
本指南中的示例使用 sample_mflix数据库中的 embedded_movies集合。此集合中的文档使用以下 Movie 类作为模型:
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!; }
embedded_movies集合是Atlas提供的示例数据集的一部分。要设立集群并加载此示例数据,请参阅 快速入门指南。
模型定义
要将MongoDB Vector Search 与 EF Core 提供程序结合使用,请在实体类上定义向量字段。使用 IsVectorIndex() Fluent API方法配置该字段的向量索引。
以下示例定义了一个具有名为 PlotEmbedding 的向量字段的 Movie 实体,并在该字段上配置了向量索引。
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); }); } }
注意
创建索引后,您无法使用 EF Core 提供程序更改或删除索引。要更改或删除索引,请使用.NET/ C#驱动程序。要学习;了解更多信息,请参阅.NET/ C#驱动程序文档中的MongoDB搜索和MongoDB Vector Search 索引指南。
支持的向量嵌入类型
EF Core 提供程序支持以下类型的向量嵌入:
数组表示
EF Core 提供程序支持以下大量类型作为向量嵌入:
float[]double[]Memory<float>和ReadOnlyMemory<float>Memory<double>和ReadOnlyMemory<double>
二进制表示形式
EF Core 提供程序支持以下二进制向量类型,与大量类型相比,这些类型可减少存储并提高查询性能:
BinaryVectorFloat32— 全精度 32 位浮点数BinaryVectorInt8— 8 位量化整数BinaryVectorPackedBit— 1 位打包二进制值
.NET/ C#驱动程序的 MongoDB.Driver命名空间包含用于配置二进制向量索引的 VectorQuantization 和 VectorSimilarity 枚举。
向量搜索查询示例
您可以使用 VectorSearch() 方法运行向量搜索查询。以下示例查询 embedded_movies集合中 PlotEmbedding字段值在语义上类似于“时间旅行冒险”的电影,然后最多返回 10 个匹配的文档。
// 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();
更多信息
要学习;了解有关MongoDB Vector Search 的更多信息,请参阅MongoDB Vector Search 文档。
有关API文档,请参阅以下资源: