建置 .NET AI 向量搜尋應用程式
在本快速入門中,您會建立 .NET 控制台應用程式,在向量存放區上執行語意搜尋,以尋找使用者查詢的相關結果。 您將瞭解如何為使用者提示產生內嵌,並使用這些內嵌來查詢向量數據存放區。 向量搜尋功能也是檢索強化生成(RAG)場景的重要組成部分。 應用程式會使用 Microsoft.Extensions.AI 和 Microsoft.Extensions.VectorData.Abstractions 連結庫,讓您可以使用 AI 抽象概念撰寫程式代碼,而不是使用特定的 SDK 撰寫程式代碼。 AI 抽象概念可協助您建立鬆散結合的程式代碼,讓您使用最少的應用程式變更來變更基礎 AI 模型。
必要條件
- .NET 8.0 SDK 或更高版本 - 安裝 .NET 8.0 SDK。
- OpenAI 中的 API 金鑰,因此您可以執行此範例。
必要條件
- .NET 8.0 SDK 或更高版本 - 安裝 .NET 8 SDK。
- Azure 訂用帳戶 - 建立免費帳戶。
- 存取 Azure OpenAI 服務。
- Azure 開發人員 CLI (選擇性) - 安裝或更新 Azure 開發人員 CLI。
複製範例存放庫
您可以使用先前各節中的步驟建立自己的應用程式,也可以複製包含所有快速入門已完成範例應用程式的 GitHub 存放庫。 如果您打算使用 Azure OpenAI,範例存放庫也會結構化為可為您布建 Azure OpenAI 資源的 Azure 開發人員 CLI 範本。
git clone https://github.com/dotnet/ai-samples.git
使用向量資料庫與您的數據互動
向量存放區或向量資料庫對於語意搜尋、檢索增強生成(RAG)和其他需要對生成式 AI 回應進行基礎性支持的案例而言非常重要。 雖然關係資料庫和文件資料庫已針對結構化和半結構化數據進行優化,但會建置向量資料庫,以有效率地儲存、編製索引及管理以內嵌向量表示的數據。 因此,向量資料庫所使用的索引和搜尋演算法會優化,以有效率地擷取可在應用程式中下游使用的數據。
探索 Microsoft.Extensions.VectorData.Abstractions
Microsoft.Extensions.VectorData.Abstractions 是一個 .NET 連結庫,是與語意核心和更廣泛的 .NET 生態系統共同開發的 .NET 連結庫,可提供統一的抽象層,以便與向量存放區互動。
Microsoft.Extensions.VectorData.Abstractions
中的抽象提供程式庫作者和開發者以下功能:
- 在向量存放區上執行 Create-Read-Update-Delete (CRUD) 作業
- 在向量存放區上使用向量和文字搜尋
注意
Microsoft.Extensions.VectorData.Abstractions 程式庫目前處於預覽狀態。
建立應用程式
完成下列步驟以建立可完成下列作業的 .NET 控制台應用程式:
- 藉由產生數據集的內嵌來建立和填入向量存放區
- 產生使用者提示的內嵌
- 使用使用者提示內嵌查詢向量存放區
- 顯示向量搜尋的相關結果
在您的電腦上的空白目錄中,使用
dotnet new
命令來建立新的控制台應用程式:dotnet new console -o VectorDataAI
將目錄變更為應用程式資料夾:
cd VectorDataAI
安裝必要的套件:
dotnet add package Azure.Identity dotnet add package Azure.AI.OpenAI dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
下列清單描述
VectorDataAI
應用程式中每個套件的用途:-
Azure.Identity
使用Microsoft Entra ID
等類別,在 Azure SDK 上提供DefaultAzureCredential
令牌驗證支援。 -
Azure.AI.OpenAI
是正式套件,用於配合 Azure OpenAI 服務使用 OpenAI 的 .NET 程式庫。 -
Microsoft.SemanticKernel.Connectors.InMemory
提供記憶體內部向量存放區類別,以保存可查詢的向量數據記錄。 -
Microsoft.Extensions.VectorData.Abstractions
可在向量存放區上啟用 Create-Read-Update-Delete (CRUD) 和搜尋作業。 - Microsoft.Extensions.Configuration 提供索引鍵/值組型組態的實作。
-
Microsoft.Extensions.Configuration.UserSecrets
是Microsoft.Extensions.Configuration
的使用者秘密組態提供者實作。
dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
下列清單描述
VectorDataAI
應用程式中每個套件的用途:-
Microsoft.Extensions.AI.OpenAI
提供 OpenAI 相容模型或端點的 AI 抽象概念。 此函式庫也包含 OpenAI 服務 API 的官方OpenAI
函式庫作為依賴項。 -
Microsoft.SemanticKernel.Connectors.InMemory
提供記憶體內部向量存放區類別,以保存可查詢的向量數據記錄。 -
Microsoft.Extensions.VectorData.Abstractions
可在向量存放區上啟用 Create-Read-Update-Delete (CRUD) 和搜尋作業。 - Microsoft.Extensions.Configuration 提供索引鍵/值組型組態的實作。
-
Microsoft.Extensions.Configuration.UserSecrets
是Microsoft.Extensions.Configuration
的使用者秘密組態提供者實作。
-
在 Visual Studio Code 中開啟應用程式(或您選擇的編輯器)。
code .
建立 AI 服務
範例 GitHub 存放庫的結構是 Azure 開發人員 CLI (azd
) 範本, azd
可用來為您布建 Azure OpenAI 服務和模型。
從終端機或命令提示字元中,流覽至
src\quickstarts\azure-openai
範例存放庫的目錄。azd up
執行 命令來布建 Azure OpenAI 資源。 建立 Azure OpenAI 服務並部署模型可能需要幾分鐘的時間。azd up
azd
也會為範例應用程式設定必要的用戶密碼,例如 Azure OpenAI 端點和模型名稱。
設定應用程式
請從終端機或命令提示字元導航至您的 .NET 專案根目錄。
執行下列命令,將 OpenAI API 金鑰設定為範例應用程式的祕密:
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key> dotnet user-secrets set ModelName <your-openai-model-name>
新增應用程式程序代碼
使用下列屬性,將名為 CloudService 的新類別新增至您的專案:
using Microsoft.Extensions.VectorData; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace VectorDataAI { internal class CloudService { [VectorStoreRecordKey] public int Key { get; set; } [VectorStoreRecordData] public string Name { get; set; } [VectorStoreRecordData] public string Description { get; set; } [VectorStoreRecordVector(384, DistanceFunction.CosineSimilarity)] public ReadOnlyMemory<float> Vector { get; set; } } }
在上述程式代碼中:
-
Microsoft.Extensions.VectorData
提供的 C# 屬性會影響在向量存放區中使用時如何處理每個屬性 - Vector 屬性會儲存產生的內嵌,代表向量搜尋 Name 和 Description 的語意意義
-
在 Program.cs 檔案中,新增下列程式代碼來建立描述雲端服務集合的數據集:
var cloudServices = new List<CloudService>() { new CloudService { Key=0, Name="Azure App Service", Description="Host .NET, Java, Node.js, and Python web applications and APIs in a fully managed Azure service. You only need to deploy your code to Azure. Azure takes care of all the infrastructure management like high availability, load balancing, and autoscaling." }, new CloudService { Key=1, Name="Azure Service Bus", Description="A fully managed enterprise message broker supporting both point to point and publish-subscribe integrations. It's ideal for building decoupled applications, queue-based load leveling, or facilitating communication between microservices." }, new CloudService { Key=2, Name="Azure Blob Storage", Description="Azure Blob Storage allows your applications to store and retrieve files in the cloud. Azure Storage is highly scalable to store massive amounts of data and data is stored redundantly to ensure high availability." }, new CloudService { Key=3, Name="Microsoft Entra ID", Description="Manage user identities and control access to your apps, data, and resources.." }, new CloudService { Key=4, Name="Azure Key Vault", Description="Store and access application secrets like connection strings and API keys in an encrypted vault with restricted access to make sure your secrets and your application aren't compromised." }, new CloudService { Key=5, Name="Azure AI Search", Description="Information retrieval at scale for traditional and conversational search applications, with security and options for AI enrichment and vectorization." }
建立和設定
IEmbeddingGenerator
實作,以將要求傳送至內嵌 AI 模型:// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string endpoint = config["AZURE_OPENAI_ENDPOINT"]; string model = config["AZURE_OPENAI_GPT_NAME"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new AzureOpenAIClient( new Uri(endpoint), new DefaultAzureCredential())
注意
DefaultAzureCredential 從本地工具中搜尋身份驗證憑證。 如果您未使用
azd
範本來布建 Azure OpenAI 資源,您必須將Azure AI Developer
角色指派給您用來登入 Visual Studio 或 Azure CLI 的帳戶。 如需更多資訊,請參閱 使用 .NET 向 Azure AI 服務進行驗證。// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string model = config["ModelName"]; string key = config["OpenAIKey"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new OpenAIClient(new ApiKeyCredential(key)) .AsEmbeddingGenerator(modelId: model);
使用雲端服務數據建立和填入向量存放區。 使用
IEmbeddingGenerator
實作,為雲端服務數據中的每個記錄建立並指派內嵌向量:// Create and populate the vector store var vectorStore = new InMemoryVectorStore(); var cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices"); await cloudServicesStore.CreateCollectionIfNotExistsAsync(); foreach (var service in cloudServices) { service.Vector = await generator.GenerateEmbeddingVectorAsync(service.Description); await cloudServicesStore.UpsertAsync(service); }
內嵌是每個數據記錄之語意意義的數值表示法,這使得它們與向量搜尋功能相容。
建立搜尋查詢的內嵌,並用它來在向量存放區上執行向量搜尋:
// Convert a search query to a vector and search the vector store var query = "Which Azure service should I use to store my Word documents?"; var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query); var results = await cloudServicesStore.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions() { Top = 1, VectorPropertyName = "Vector" }); await foreach (var result in results.Results) { Console.WriteLine($"Name: {result.Record.Name}"); Console.WriteLine($"Description: {result.Record.Description}"); Console.WriteLine($"Vector match score: {result.Score}"); Console.WriteLine(); }
使用
dotnet run
命令來執行應用程式:dotnet run
應用程式會列印向量搜尋的最上層結果,這是最與原始查詢相關的雲端服務。 您可以修改查詢來嘗試不同的搜尋案例。
清除資源
當您不再需要範例應用程式或資源時,請移除對應的部署和所有資源。
azd down