矢量搜索

注释

下面介绍了 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 数据的相似性返回前五个博客。

矢量相似性搜索可以与全文搜索结合在同一个查询中(即混合搜索),方法是使用VectorDistanceFullTextScore 函数的结果结合起来,并通过使用RRF(倒数排名融合)函数进行处理。

请参阅 文档 ,了解如何在 EF 模型中启用全文搜索支持,以及如何在查询中使用混合搜索。