矢量搜索
注释
矢量支持是在 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 进行近似搜索的函数(预览版)。