当前位置:首页|资讯

技术速递|Microsoft.Extensions.VectorData 预览版简介

作者:微软中国MSDN发布时间:2024-11-20

作者: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 语句添加到您的应用程序。

usingSystem.Collections.ObjectModel; usingMicrosoft.Extensions.AI; usingMicrosoft.Extensions.VectorData; usingMicrosoft.SemanticKernel; usingMicrosoft.SemanticKernel.Connectors.InMemory;

存储数据

此示例使用的场景是对电影集合执行语义搜索。

存储数据

首先定义一个类来表示您的电影数据。

publicclassMovie{[ VectorStoreRecordKey] publicintKey { get; set;}

[ 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)

创建矢量存储和电影集合

现在您已经定义了数据模型,请创建一个带有集合的矢量存储来存储电影数据。

varmovieData = newList<Movie> {newMovie {Key= 0, Title= "Lion King", Deion= "The Lion King is a classic Disney animated film that tells the story of a young lion named Simba who embarks on a journey to reclaim his throne as the king of the Pride Lands after the tragic death of his father."},newMovie {Key= 1, Title= "Inception", Deion= "Inception is a science fiction film directed by Christopher Nolan that follows a group of thieves who enter the dreams of their targets to steal information."},newMovie {Key= 2, Title= "The Matrix", Deion= "The Matrix is a science fiction film directed by the Wachowskis that follows a computer hacker named Neo who discovers that the world he lives in is a simulated reality created by machines."},newMovie {Key= 3, Title= "Shrek", Deion= "Shrek is an animated film that tells the story of an ogre named Shrek who embarks on a quest to rescue Princess Fiona from a dragon and bring her back to the kingdom of Duloc."}};

varvectorStore = newInMemoryVectorStore;

varmovies = vectorStore.GetCollection< int, Movie>( "movies");

awaitmovies.CreateCollectionIfNotExistsAsync;

创建嵌入生成器

若要生成嵌入,请使用 Ollama 提供的托管模型之一。在此示例中,使用的模型是 all-minilm,但任何模型都可以使用。

  1. 安装 Ollama

    https://ollama.com/download

  2. 下载 all-minilm 模型

    https://ollama.com/library/all-minilm

  3. 在您的应用程序中配置 OllamaEmbeddingGenerator:

生成嵌入

现在您有了一个嵌入生成器,请使用它为您的电影数据生成嵌入并将它们存储在矢量存储中。

foreach( varmovie inmovieData) {movie.Vector = awaitgenerator.GenerateEmbeddingVectorAsync(movie.Deion); awaitmovies.UpsertAsync(movie); }

查询数据

现在您的数据存储中已经有了数据,您可以查询它了。

生成查询嵌入

为查询“一部适合家庭观看的电影”生成一个嵌入。

varquery = "A family friendly movie"; varqueryEmbedding = awaitgenerator.GenerateEmbeddingVectorAsync(query);

查询数据存储

现在您已经有了查询的嵌入内容,您可以使用它在数据存储中搜索相关结果。

varsearchOptions = newVectorSearchOptions {Top = 1, VectorPropertyName = "Vector"};

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 类似,我们计划:


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1