本文翻译自Bruno Capuano的Exploring Microsoft.Extensions.VectorData with Qdrant and Azure AI Search
了解如何使用 Microsoft.Extensions.VectorData并通过 Qdrant 和 Azure AI 搜索实现语义搜索。
使用 Microsoft.Extensions.VectorData 深入了解语义搜索:Qdrant 和 Azure AI 搜索
语义搜索正在改变应用程序查找和解释数据的方式,它专注于含义,而不仅仅是关键字匹配。随着 Microsoft.Extensions.VectorData 的发布,.NET 开发人员拥有了一组新的构建模块,用于将基于向量的搜索功能集成到其应用程序中。在本文中,我们将探讨使用本地Qdrant和Azure AI搜索这两种实现方式来进行语义搜索。
Microsoft.Extensions.VectorData 快速介绍
Microsoft.Extensions.VectorData 是一组 .NET代码库,旨在管理 .NET 应用程序中基于向量的数据。这些库为与向量存储交互提供了一个统一的 C# 抽象层,使开发人员能够有效地处理嵌入并执行向量相似性查询。
要详细了解该库的架构和功能,推荐阅读 Luis 的精彩博客文章。
在这篇博客文章中,我们将展示两个实际用例:
- 在本地使用 Qdrant 进行语义搜索。
- 利用 Azure AI 搜索进行企业级向量搜索。
要运行这些演示,您需要使用 Ollama 为生成嵌入提供的模型之一。在本示例中,使用的模型是 all-minilm。
- 安装 Ollama。
- 下载 all-minilm 模型。
- 准备一个符合 OCI 标准的容器运行时,例如:
使用 Qdrant 进行语义搜索
什么是 Qdrant?
Qdrant 是一个向量相似性搜索引擎,它提供了一个生产就绪的服务,拥有便捷的 API来存储、搜索和管理带有额外负载的点(即向量)。它非常适合需要高效相似性搜索的应用程序。您可以轻松地在 Docker 容器中本地运行 Qdrant,这使其成为对开发人员友好的选择。
有关设置说明,请参阅 Qdrant 快速入门指南。作为参考,以下是运行本地容器实例的示例命令:
docker run -p 6333:6333 -p 6334:6334 -v $(pwd)/qdrant_storage:/qdrant/storage:z qdrant/qdrant
容器创建后,您可以在 Docker 中对其进行检查。
Qdrant 和 Semantic Kernel
Semantic Kernel 为 Qdrant 提供了一个内置连接器,使 .NET 开发人员能够无缝地存储嵌入并执行基于向量的查询。该连接器基于Microsoft.Extensions.VectorData和官方的 .NET Qdrant 客户端构建。
这种集成结合了 Qdrant 的高性能和Semantic Kernel 的易用性。
要了解有关连接器的更多信息,请访问语义内核向量存储 Qdrant 连接器的官方文档。
场景概述 – Qdrant
- 设置:在Docker 容器中本地运行Qdrant实例。
- 功能:一个使用语义内核 Qdrant 连接器的.NET控制台应用程序以用于:
- 存储影片嵌入。
- 执行语义搜索查询。
让我们看一个实现并运行此演示的示例类。
using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;
var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"));
// get movie list
var movies = vectorStore.GetCollection<ulong, MovieVector<ulong>>("movies");
await movies.CreateCollectionIfNotExistsAsync();
var movieData = MovieFactory<ulong>.GetMovieVectorList();
// get embeddings generator and generate embeddings for movies
IEmbeddingGenerator<string, Embedding<float>> generator =
new OllamaEmbeddingGenerator(new Uri("http://localhost:11434/"), "all-minilm");
foreach (var movie in movieData)
{
movie.Vector = await generator.GenerateEmbeddingVectorAsync(movie.Description);
await movies.UpsertAsync(movie);
}
// perform the search
var query = "A family friendly movie that includes ogres and dragons";
var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query);
var searchOptions = new VectorSearchOptions()
{
Top = 2,
VectorPropertyName = "Vector"
};
var results = await movies.VectorizedSearchAsync(queryEmbedding, searchOptions);
await foreach (var result in results.Results)
{
Console.WriteLine($"Title: {result.Record.Title}");
Console.WriteLine($"Description: {result.Record.Description}");
Console.WriteLine($"Score: {result.Score}");
Console.WriteLine();
}
演示运行后,示例输出如下:
Title: Shrek
Description: 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.
Score: 0.5013245344161987
Title: Lion King
Description: 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.
Score: 0.3225690722465515
为什么选择 Qdrant?
使用 Qdrant 进行语义搜索具有可扩展、高速相似性搜索的优势,使其成为需要大规模向量数据管理的应用程序的绝佳选择。此外,您还可以选择在 Microsoft Azure 上运行 Qdrant Cloud。
使用 Azure AI 搜索进行语义搜索
什么是 Azure AI 搜索?
Azure AI 搜索是 Microsoft 的搜索即服务产品。它将传统的搜索功能与 AI 驱动的功能(如语义和向量搜索)集成在一起。它专为可扩展性和可靠性而构建,是需要高级搜索功能的企业应用程序的理想解决方案。您可以了解有关 Azure AI 搜索的详细信息。
在本示例中,我们将使用 Azure AI 搜索中的集成向量化,它通过将文档和查询转换为向量来改进索引和查询。
Azure AI 搜索和语义内核
此连接器基于Microsoft.Extensions.VectorData 和适用于 .NET 的Azure AI 搜索库构建。
有关更多信息,请参阅 Azure AI 搜索连接器文档。
场景概述 – Azure AI 搜索
- 设置:在您的 Azure 订阅中创建 Azure AI 搜索服务。
- 功能:控制台应用程序:
- 存储影片的向量嵌入。
- 执行基于向量的语义搜索查询。
- 要求:必须将 Azure AI 搜索端点作为用户密钥添加到应用程序中。如果仅使用端点,应用程序将创建一个 Azure 默认凭据以连接到服务。如果您需要使用密钥访问 Azure AI 搜索,则还需要将该值也添加为用户密钥。
以下是有关如何添加用户密钥的控制台命令示例:
dotnet user-secrets init
dotnet user-secrets set "AZURE_AISEARCH_URI" "https://<AI Search Name>.search.windows.net"
dotnet user-secrets set "AZURE_AISEARCH_SECRET" "AI Search Secret"
让我们看一个实现并运行此演示的示例类。
using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Azure;
using Azure.Search.Documents.Indexes;
using Microsoft.SemanticKernel.Connectors.AzureAISearch;
using Microsoft.Extensions.Configuration;
using Azure.Identity;
using Azure.Core;
// get the search index client using Azure Default Credentials or Azure Key Credential with the service secret
var client = GetSearchIndexClient();
var vectorStore = new AzureAISearchVectorStore(searchIndexClient: client);
// get movie list
var movies = vectorStore.GetCollection<string, MovieVector<string>>("movies");
await movies.CreateCollectionIfNotExistsAsync();
var movieData = MovieFactory<string>.GetMovieVectorList();
// get embeddings generator and generate embeddings for movies
IEmbeddingGenerator<string, Embedding<float>> generator =
new OllamaEmbeddingGenerator(new Uri("http://localhost:11434/"), "all-minilm");
foreach (var movie in movieData)
{
movie.Vector = await generator.GenerateEmbeddingVectorAsync(movie.Description);
await movies.UpsertAsync(movie);
}
// perform the search
var query = "A family friendly movie that includes ogres and dragons";
var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query);
// show the results...
演示运行后,示例输出如下:
Title: Shrek
Description: 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.
Score: 0.6672559
我们可以在Azure 门户中的Azure AI 搜索服务里看到包含 movies 字段的新索引。
为什么选择 Azure AI 搜索?
Azure AI 搜索提供企业级的可扩展性和集成,使其成为在生产环境中需要高级语义搜索的应用程序的强大解决方案。此外,AI Search 还具有内置的安全功能,例如加密和安全身份验证,以保护您的数据。它还遵守合规性标准,确保您的搜索解决方案满足监管要求。
代码解释
用于演示的控制台应用程序
每个语义搜索演示都以 .NET 9 控制台应用程序的形式实现。示例的代码库可以追溯到 Luis 提供的原始演示,并针对 Azure AI 搜索和 Qdrant 场景进行了拓展。
用于数据表示的共享类
共享类表示 Movie 实体,其中包括:
- 向量嵌入的字段:这些嵌入用于执行语义搜索。
- 电影列表:作为示例数据而生成的静态电影列表。
- 键的类型工厂:该类实现工厂模式来处理键数据类型的差异。
处理键的不同数据类型
- Qdrant:使用
ulong
作为键字段的数据类型。 - Azure AI 搜索:使用
string
作为键字段的数据类型。 - MovieFactory:确保应用程序为每种场景生成正确的数据类型,保持实现的灵活性。
Movie Factory 实现
public class MovieFactory<T>
{
public static List<Movie<T>> GetMovieList()
{
var movieData = new List<Movie<T>>()
{
// all movie sample collection is defined here
};
return movieData;
}
public static List<MovieVector<T>> GetMovieVectorList()
{
var movieData = GetMovieList();
var movieVectorData = new List<MovieVector<T>>();
foreach (var movie in movieData)
{
movieVectorData.Add(new MovieVector<T>
{
Key = movie.Key,
Title = movie.Title,
Description = movie.Description
});
}
return movieVectorData;
}
您可以浏览包含完整代码示例的 github 存储库。
接下来会发生什么?
Microsoft.Extensions.VectorData 的旅程并不止于此。您可以选择其他连接器,比如内存中的 SQLite、Pinecone 或 Redis; 使开发人员能够在本地运行轻量级的语义搜索解决方案。此功能非常适用于性能和简洁性至关重要的场景。
我们还与合作伙伴合作,比如Elasticsearch 已经在 Microsoft.Extensions.VectorData 的基础上进行构建。您可以在客户案例研究:宣布推出 Microsoft Semantic Kernel Elasticsearch Connector 中了解有关此用例的更多信息。
结论
Microsoft.Extensions.VectorData 和 Semantic Kernel 的组合使 .NET 开发人员能够构建智能、可缩放和上下文感知的应用程序。无论您是在处理小型项目还是大型企业系统,这些工具都为提供尖端的语义搜索体验奠定了基础。
了解更多信息
总结
敬请关注更多的教程和资源,并随时在社交媒体上与我们联系以提出问题或反馈。 祝编码愉快!
0 comments
Be the first to start the discussion.