矢量搜索
警告
Azure Cosmos DB 矢量搜索目前以预览版提供。 因此,使用 EF 的矢量搜索 API 将生成必须抑制的“试验性 API”警告 (EF9103
)。 API 和功能在未来可能会发生重大更改。
Azure Cosmos DB 对矢量相似性搜索的支持现为预览版。 矢量搜索是某些应用程序类型的基本部分,包括 AI、语义搜索等。 Azure Cosmos DB 允许将矢量与其他数据一起直接存储在文档中,这意味着可以对单个数据库执行所有查询。 这可以大大简化体系结构,并消除对堆栈中额外的专用矢量数据库解决方案的需求。 若要了解有关 Azure Cosmos DB 矢量搜索的详细信息,请参阅文档。
若要使用矢量搜索,必须先注册预览功能。 然后,在容器上定义矢量策略,确定文档中的哪个 JSON 属性包含矢量、这些属性的各种矢量相关信息(维度、数据类型、距离函数)。
正确设置容器后,在容器策略中定义的路径中将矢量属性添加到模型,并将 EF 配置为矢量:
public class Blog
{
...
public float[] Vector { get; set; }
}
public class BloggingContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Embeddings)
.IsVector(DistanceFunction.Cosine, dimensions: 1536);
}
}
此时,模型已经配置好了。 矢量数据的插入与 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
数据的相似性返回前五个博客。