注释
下面介绍了 EF 10 中的矢量搜索支持。 EF 9 包含具有略有不同的方法命名的类似实验支持。
Azure Cosmos DB 现在支持矢量相似性搜索。 矢量搜索是某些应用程序类型的基本部分,包括 AI、语义搜索等。 Azure Cosmos DB 允许将矢量与其他数据一起直接存储在文档中,这意味着可以对单个数据库执行所有查询。 这可以大大简化体系结构,并消除对堆栈中额外的专用矢量数据库解决方案的需求。 若要了解有关 Azure Cosmos DB 矢量搜索的详细信息,请参阅文档。
在OnModelCreating内部可以配置向量属性。
public class Blog
{
...
public float[] Vector { get; set; }
}
public class BloggingContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>(b =>
{
b.Property(b => b.Vector).IsVectorProperty(DistanceFunction.Cosine, dimensions: 1536);
b.HasIndex(x => x.Vector).IsVectorIndex(VectorIndexType.Flat);
});
}
}
此时,模型已经配置好了。 矢量数据的插入与 EF 中的任何其他数据类型一样:
float[] vector = /* generate vector data from text, image, etc. */
context.Add(new Blog { Vector = vector });
await context.SaveChangesAsync();
最后,使用 LINQ 查询中的 EF.Functions.VectorDistance() 函数执行矢量相似性搜索:
float[] anotherVector = /* generate vector data from text, image, etc. */
var blogs = await context.Blogs
.OrderBy(s => EF.Functions.VectorDistance(s.Vector, anotherVector))
.Take(5)
.ToListAsync();
这将根据其 Vector 属性和外部提供的 anotherVector 数据的相似性返回前五个博客。
混合搜索
矢量相似性搜索可以与全文搜索结合在同一个查询中(即混合搜索),方法是使用VectorDistance 和FullTextScore 函数的结果结合起来,并通过使用RRF(倒数排名融合)函数进行处理。
请参阅 文档 ,了解如何在 EF 模型中启用全文搜索支持,以及如何在查询中使用混合搜索。