Overview
EF Core プロバイダーとともに MongoDB ベクトル検索 を使用して、Atlas に保存されているデータに対してセマンティック検索を実行できます。ベクトル検索では、キーワードの一致ではなく、意味に基づいてデータを検索クエリするため、より関連性の高い結果を検索できます。MongoDB Vector Search を使用すると、セマンティック検索、ハイブリッド検索、検索拡張生成(RAG)などのユースケースをサポートできます。
MongoDB ベクトル検索の詳細については、Atlas ドキュメントの「MongoDB ベクトル検索の概要」を参照してください。
サンプル データ
このガイドの例では、 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 が提供するサンプル データセットの一部です。クラスターを設定してこのサンプル データをロードするには、クイック スタートガイドを参照してください。
モデル定義
EF Core プロバイダー で MongoDB ベクトル検索 を使用するには、エンティティ クラスで フィールド を定義します。IsVectorIndex() フルーエント 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 Search および MongoDB Vector Search 検索インデックス」ガイドを参照してください。
サポートされているベクトル埋め込みタイプ
EF Core プロバイダーは、次のタイプのベクトル埋め込みをサポートしています。
配列表現
EF Core Provider は、ベクトル埋め込みとして次の配列型をサポートします。
float[]double[]Memory<float>およびReadOnlyMemory<float>Memory<double>およびReadOnlyMemory<double>
バイナリ表現
EF Core Provider は、次のバイナリベクトル型をサポートしています。これらの型は、配列型と比較してストレージを削減し、クエリパフォーマンスを向上させます。
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 ドキュメントについては、次のリソースを参照してください。