微软为.NET引入矢量数据抽象库

微软发布Microsoft.Extensions.VectorData.Abstractions库预览版

2024年10月29日,微软发布了.NET的Microsoft.Extensions.VectorData.Abstractions库预览版。该库旨在简化.NET解决方案与AI语义内核SDK(Semantic Kernel SDK)的集成,通过对具体AI实现和模型的抽象来实现。

背景:微软语义内核

微软语义内核(Semantic Kernel)是一个企业级SDK,允许开发者插入不同的LLM模型和语言,并提供对这些插件的自动编排功能。作为语义内核与.NET团队合作的结果,微软发布了多个辅助和抽象库,第一个是Microsoft.Extensions.AI库,用于抽象常见的AI服务,例如聊天客户端。

Microsoft.Extensions.VectorData.Abstractions库

第二个包是Microsoft.Extensions.VectorData.Abstractions库,专注于抽象用于LLM嵌入的向量存储。嵌入(Embedding)是数据记录在高维向量空间中的表示,使LLM模型能够将离散数据转换为可由LLM神经网络进一步处理的格式。语义相似的记录在向量空间中的嵌入会更接近,从而实现语义搜索而非简单的文本匹配。

该库支持的操作包括CRUD和搜索操作。开发者使用带有向量属性的.NET POCO对象,例如VectorStoreRecordKeyVectorStoreRecordDataVectorStoreRecordVector

示例代码

public class Movie
{
    [VectorStoreRecordKey]
    public int Key {get;set;}

    [VectorStoreRecordData] 
    public string Title {get;set;}

    [VectorStoreRecordData]
    public string Description {get;set;}

    [VectorStoreRecordVector(384, DistanceFunction.CosineSimilarity)]
    public ReadOnlyMemory<float> Vector {get;set;}
}

Movie类指定了一个键、两个字符串属性作为数据,以及一个表示LLM中记录向量嵌入的Vector属性(维度为384,使用余弦相似度距离函数)。

存储和嵌入

该库使用IEmbeddingGeneratorIVectorStore接口来存储和嵌入记录。存储是由语义内核提供的内存向量存储。嵌入示例使用了Ollama预制的LLM包,运行在开发者机器上,并使用all-minilm小型嵌入模型。

IEmbeddingGenerator<string,Embedding<float>> generator = new OllamaEmbeddingGenerator(new Uri("http://localhost:11434/"), "all-minilm");

记录存储在向量存储中,Vector属性由IEmbeddingGenerator.GenerateEmbeddingVectorAsync方法生成。

movie.Vector = await generator.GenerateEmbeddingVectorAsync(movie.Description);
await movies.UpsertAsync(movie);

查询嵌入记录

查询是一个LLM提示文本,使用相同的接口嵌入为向量。

var query = "A family friendly movie";
var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query);

向量数据存储接口提供了VectorizedSearchAsync方法,用于检索与搜索提示文本最接近的项。

var searchOptions = new VectorSearchOptions()
{
    Top = 1,
    VectorPropertyName = "Vector"
};

var results = await movies.VectorizedSearchAsync(queryEmbedding, searchOptions);

应用场景

该库的直接应用是扩展LLM与自定义数据存储,使用检索增强生成(Retrieval-Augmented Generation, RAG)技术,允许LLM查询特定知识库,而无需重新训练模型。微软提供了完整的向量存储RAG示例。

未来计划

该库目前处于预览阶段,预计在.NET 9发布之前保持预览状态。开发者可以通过GitHub仓库的issue列表提供反馈。

微软未来的计划包括:

  • 继续与语义内核合作,构建更多抽象,并在RAG场景中提供更流畅的体验。
  • 与生态系统中的向量存储合作伙伴合作,推动Microsoft.Extensions.VectorData的采用。
阅读 53
0 条评论