作者:Luis Quintanilla- 项目经理
排版:Alan Wang
我们很高兴推出 Microsoft.Extensions.VectorData.Abstractions 库,该库现已提供预览版。
正如 Microsoft.Extensions.AI 库(https://devblogs.microsoft.com/dotnet/introducing-microsoft-extensions-ai-preview/)为使用 AI 服务提供了一个统一层一样,此包为 .NET 生态系统提供了抽象,有助于将矢量存储集成到 .NET 应用程序和库中。
为什么选择矢量存储?
矢量数据库对于搜索和生成 AI 响应等任务非常重要。
与关系数据库和文档数据库针对结构化和半结构化数据进行优化的方式类似,矢量数据库的构建旨在高效存储、索引和管理以嵌入矢量表示的数据。因此,矢量数据库使用的索引算法经过优化,可高效检索在应用程序下游使用的数据。
什么是 Microsoft.Extensions.VectorData?
Microsoft.Extensions.VectorData 是一组由 Semantic Kernel 和更广泛的 .NET 生态系统一起合作开发的核心 .NET 库。这些库提供了一个统一的 C# 抽象层,用于与矢量存储交互。
Microsoft.Extensions.VectorData 中的抽象为库作者和开发人员提供了以下功能:
能够对矢量存储执行创建-读取-更新-删除 (CRUD) 操作
能够在矢量存储上使用矢量和文本搜索。
如何开始?
开始使用 Microsoft.Extensions.VectorData 抽象的最简单方法是使用任何一种 语义内核矢量存储连接器(https://learn.microsoft.com/en-us/semantic-kernel/concepts/vector-store-connectors/out-of-the-box-connectors/)。
在此示例中,我将使用内存矢量存储的实现。
为了完善此示例并使其更具真实感,我们还将使用 Microsoft.Extensions.AI 中的 Ollama 参考实现。不过,任何其他支持嵌入生成的实现也同样有效。
创建应用程序并添加 NuGet 包
1. 创建 一个 C# 控制台应用程序。
2. 安装以下 NuGet 包
Microsoft.SemanticKernel.Connectors.InMemory
https://www.nuget.org/packages/Microsoft.SemanticKernel.Connectors.InMemory
Microsoft.Extensions.VectorData.Abstractions
https://www.nuget.org/packages/Microsoft.Extensions.VectorData.Abstractions/
Microsoft.Extensions.AI.Ollama
https://www.nuget.org/packages/Microsoft.Extensions.AI.Ollama
3. 将以下 using 语句添加到您的应用程序。
存储数据
此示例使用的场景是对电影集合执行语义搜索。
存储数据
首先定义一个类来表示您的电影数据。
[ VectorStoreRecordData] publicstringTitle { get; set;}
[ VectorStoreRecordData] publicstringDeion { get; set;}
[ VectorStoreRecordVector(384, DistanceFunction.CosineSimilarity)] publicReadOnlyMemory< float> Vector { get; set;} }
通过使用 VectoStoreRecordKey、VectorStoreRecordVector 和 VectorStoreRecordData 等属性,您可以对数据模型进行注释,以便矢量存储实现更轻松地将 POCO 对象映射到其底层数据模型。有关每个属性所支持选项的更多信息,请参阅 语义内核矢量存储数据模型学习页面(https://learn.microsoft.com/en-us/semantic-kernel/concepts/vector-store-connectors/defining-your-data-model?pivots=programming-language-csharp#attributes)。
创建矢量存储和电影集合
现在您已经定义了数据模型,请创建一个带有集合的矢量存储来存储电影数据。
varvectorStore = newInMemoryVectorStore;
varmovies = vectorStore.GetCollection< int, Movie>( "movies");
awaitmovies.CreateCollectionIfNotExistsAsync;
创建嵌入生成器
若要生成嵌入,请使用 Ollama 提供的托管模型之一。在此示例中,使用的模型是 all-minilm,但任何模型都可以使用。
安装 Ollama。
https://ollama.com/download
下载 all-minilm 模型。
https://ollama.com/library/all-minilm
在您的应用程序中配置 OllamaEmbeddingGenerator:
生成嵌入
现在您有了一个嵌入生成器,请使用它为您的电影数据生成嵌入并将它们存储在矢量存储中。
查询数据
现在您的数据存储中已经有了数据,您可以查询它了。
生成查询嵌入
为查询“一部适合家庭观看的电影”生成一个嵌入。
查询数据存储
现在您已经有了查询的嵌入内容,您可以使用它在数据存储中搜索相关结果。
varresults = awaitmovies.VectorizedSearchAsync(queryEmbedding, searchOptions);
awaitforeach( varresult inresults.Results) {Console.WriteLine( $"Title: {result.Record.Title}" ); Console.WriteLine( $"Deion: {result.Record.Deion}" ); Console.WriteLine( $"Score: {result.Score}" ); Console.WriteLine;}
结果应如下所示:
继续学习
有关使用抽象的详细文档,请参阅 语义内核矢量存储学习网站(https://learn.microsoft.com/en-us/semantic-kernel/concepts/vector-store-connectors/)。
从以下示例中了解更多信息:
RAG 示例
https://github.com/microsoft/semantic-kernel/tree/main/dotnet/samples/Demos/VectorStoreRAG
Microsoft.Extensions.VectorData 核心概念
https://learn.microsoft.com/en-us/semantic-kernel/concepts/vector-store-connectors/code-samples?pivots=programming-language-csharp
Microsoft.Extensions.VectorData 的下一步计划是什么?
与 Microsoft.Extensions.AI 类似,我们计划: