共用方式為


建置 .NET AI 向量搜尋應用程式

在本快速入門中,您會建立 .NET 控制台應用程式,在向量存放區上執行語意搜尋,以尋找使用者查詢的相關結果。 您將瞭解如何為使用者提示產生內嵌,並使用這些內嵌來查詢向量數據存放區。 向量搜尋功能也是檢索強化生成(RAG)場景的重要組成部分。 應用程式會使用 Microsoft.Extensions.AIMicrosoft.Extensions.VectorData.Abstractions 連結庫,讓您可以使用 AI 抽象概念撰寫程式代碼,而不是使用特定的 SDK 撰寫程式代碼。 AI 抽象概念可協助您建立鬆散結合的程式代碼,讓您使用最少的應用程式變更來變更基礎 AI 模型。

必要條件

必要條件

複製範例存放庫

您可以使用先前各節中的步驟建立自己的應用程式,也可以複製包含所有快速入門已完成範例應用程式的 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 控制台應用程式:

  • 藉由產生數據集的內嵌來建立和填入向量存放區
  • 產生使用者提示的內嵌
  • 使用使用者提示內嵌查詢向量存放區
  • 顯示向量搜尋的相關結果
  1. 在您的電腦上的空白目錄中,使用 dotnet new 命令來建立新的控制台應用程式:

    dotnet new console -o VectorDataAI
    
  2. 將目錄變更為應用程式資料夾:

    cd VectorDataAI
    
  3. 安裝必要的套件:

    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 應用程式中每個套件的用途:

    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 應用程式中每個套件的用途:

  4. 在 Visual Studio Code 中開啟應用程式(或您選擇的編輯器)。

    code .
    

建立 AI 服務

範例 GitHub 存放庫的結構是 Azure 開發人員 CLI (azd) 範本, azd 可用來為您布建 Azure OpenAI 服務和模型。

  1. 從終端機或命令提示字元中,流覽至 src\quickstarts\azure-openai 範例存放庫的目錄。

  2. azd up執行 命令來布建 Azure OpenAI 資源。 建立 Azure OpenAI 服務並部署模型可能需要幾分鐘的時間。

    azd up
    

    azd 也會為範例應用程式設定必要的用戶密碼,例如 Azure OpenAI 端點和模型名稱。

設定應用程式

  1. 請從終端機或命令提示字元導航至您的 .NET 專案根目錄。

  2. 執行下列命令,將 OpenAI API 金鑰設定為範例應用程式的祕密:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    dotnet user-secrets set ModelName <your-openai-model-name>
    

新增應用程式程序代碼

  1. 使用下列屬性,將名為 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 屬性會儲存產生的內嵌,代表向量搜尋 NameDescription 的語意意義
  2. 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."
            }
    
  3. 建立和設定 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);
    
  4. 使用雲端服務數據建立和填入向量存放區。 使用 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);
    }
    

    內嵌是每個數據記錄之語意意義的數值表示法,這使得它們與向量搜尋功能相容。

  5. 建立搜尋查詢的內嵌,並用它來在向量存放區上執行向量搜尋:

    // 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();
    }
    
  6. 使用 dotnet run 命令來執行應用程式:

    dotnet run
    

    應用程式會列印向量搜尋的最上層結果,這是最與原始查詢相關的雲端服務。 您可以修改查詢來嘗試不同的搜尋案例。

清除資源

當您不再需要範例應用程式或資源時,請移除對應的部署和所有資源。

azd down

下一步