SQL Server EF Core 提供程序中的矢量搜索

注释

矢量支持是在 EF Core 10.0 中引入的,并且仅支持 SQL Server 2025 及更高版本。

SQL Server 向量数据类型允许存储 嵌入内容,这些嵌入表示形式意味着可以有效地搜索相似性,为 AI 工作负载(如语义搜索和检索扩充生成(RAG)提供支持。

若要使用数据类型,只需将 vector 类型 SqlVector<float> 为 .NET 属性添加到实体类型,并指定维度,如下所示:

public class Blog
{
    // ...

    [Column(TypeName = "vector(1536)")]
    public SqlVector<float> Embedding { get; set; }
}

添加属性并在数据库中创建的相应列后,可以开始插入嵌入内容。 嵌入生成是在数据库外部完成的,通常是通过服务完成的,执行此作的详细信息超出了本文档的范围。 但是, .NET Microsoft.Extensions.AI 库 包含,它是嵌入生成器的 IEmbeddingGenerator抽象,其中包含主要提供程序的实现。

选择嵌入生成器并对其进行设置后,使用它生成嵌入内容并将其插入,如下所示

IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = /* Set up your preferred embedding generator */;

var embedding = await embeddingGenerator.GenerateVectorAsync("Some text to be vectorized");
context.Blogs.Add(new Blog
{
    Name = "Some blog",
    Embedding = new SqlVector<float>(embedding)
});
await context.SaveChangesAsync();

最后,使用 EF.Functions.VectorDistance() 函数对给定的用户查询执行相似性搜索:

var sqlVector = new SqlVector<float>(await embeddingGenerator.GenerateVectorAsync("Some user query to be vectorized"));
var topSimilarBlogs = context.Blogs
    .OrderBy(b => EF.Functions.VectorDistance("cosine", b.Embedding, sqlVector))
    .Take(3)
    .ToListAsync();

注释

EF 10 中的内置支持取代了以前的 EFCore.SqlServer.VectorSearch 扩展,该扩展允许在引入数据类型之前 vector 执行矢量搜索。 作为升级到 EF 10 的一部分,请从项目中删除扩展。

目前 VECTOR_SEARCH() 不支持使用 DiskANN 进行近似搜索的函数(预览版)。