Megosztás a következőn keresztül:


Az App Service hitelesítése és engedélyezése vektoradatbázis számára

Ez a cikk bemutatja, hogyan kezelheti az App Service .NET-alkalmazás és egy vektoradatbázis-megoldás közötti kapcsolatot. Ez magában foglalja a Microsoft Entra által felügyelt identitások támogatott szolgáltatásokhoz való használatát, valamint a kapcsolati sztring biztonságos tárolását mások számára.

Ha vektoradatbázist ad hozzá az alkalmazáshoz, engedélyezheti a [szemantikai emlékeket vagy vektortárolókat](vektortárolókat) az AI-hez. A Szemantic Kernel SDK for .NET lehetővé teszi a memória tárolásának és visszahívásának egyszerű megvalósítását az előnyben részesített vektoradatbázis-megoldással.

Előfeltételek

A Microsoft Entra által felügyelt identitás használata hitelesítéshez

Ha egy vektoradatbázis-szolgáltatás támogatja a Microsoft Entra-hitelesítést, az App Service-vel felügyelt identitással biztonságosan hozzáférhet a vektoradatbázishoz anélkül, hogy manuálisan kellene kiépítenie vagy elforgatnia a titkos kulcsokat. A Microsoft Entra-hitelesítést támogató Azure-szolgáltatások listáját a Microsoft Entra-hitelesítést támogató Azure-szolgáltatásokban találja.

Felügyelt identitás hozzáadása az App Service-hez

Az alkalmazás számára kétféle identitástípust lehet megadni:

  • A rendszer által hozzárendelt identitás az alkalmazáshoz kötött, és adott esetben azzal együtt törlődik. Egy alkalmazás csak egy rendszer által hozzárendelt identitással rendelkezhet.
  • A felhasználó által hozzárendelt identitás különálló Azure-erőforrás, amely hozzárendelhető az alkalmazáshoz. Egy alkalmazás több felhasználó által hozzárendelt identitással is rendelkezhet.

Rendszer által hozzárendelt identitás hozzáadása

  1. Lépjen az alkalmazás lapjára az Azure Portalon, majd görgessen le a Beállítások csoporthoz.
  2. Válassza ki az Identitás elemet.
  3. A Rendszerhez rendelt lapon állítsa be az Állapot beállítást Be állásba, majd válassza a Mentés lehetőséget.

Futtassa a az webapp identity assign parancsot egy rendszer által hozzárendelt identitás létrehozásához:

az webapp identity assign --name <appName> --resource-group <groupName>

Felhasználó által hozzárendelt identitás hozzáadása

Ha felhasználó által hozzárendelt identitást szeretne hozzáadni az alkalmazáshoz, hozza létre az identitást, majd adja hozzá az erőforrás-azonosítóját az alkalmazáskonfigurációhoz.

  1. Hozzon létre egy felhasználó által hozzárendelt felügyelt identitáserőforrást az alábbi utasítások követésével.

  2. Az alkalmazás oldalának bal oldali navigációs paneljén görgessen le a Beállítások csoporthoz.

  3. Válassza ki az Identitás elemet.

  4. Válassza a Felhasználó által hozzárendelt>Hozzáadás lehetőséget.

  5. Keresse meg a korábban létrehozott identitást, jelölje ki, majd válassza a Hozzáadás lehetőséget.

    Fontos

    A Hozzáadás lehetőség kiválasztása után az alkalmazás újraindul.

  1. Felhasználó által hozzárendelt identitás létrehozása:

    az identity create --resource-group <groupName> --name <identityName>
    
  2. Rendelje hozzá az identitást az alkalmazáshoz:

    az webapp identity assign --resource-group <groupName> --name <appName> --identities <identityId>
    

Azure-szerepkör hozzáadása a felügyelt identitáshoz

  1. Az Azure Portalon lépjen arra a hatókörre, amelyhez vektoradatbázis-hozzáférést szeretne biztosítani. A hatókör lehet felügyeleti csoport, előfizetés, erőforráscsoport vagy egy adott Azure-erőforrás.
  2. A bal oldali navigációs panelen válassza a Hozzáférés-vezérlés (IAM) lehetőséget.
  3. Válassza a Hozzáadás, majd a Szerepkör-hozzárendelés hozzáadása lehetőséget.
  4. A Szerepkör lapon válassza ki a megfelelő szerepkört, amely olvasási hozzáférést biztosít a vektoradatbázishoz.
  5. A Tagok lapon válassza ki a felügyelt identitást.
  6. A szerepkör hozzárendeléséhez a Felülvizsgálat + hozzárendelés lapon válassza a Felülvizsgálat + hozzárendelés lehetőséget.

Erőforrás hatóköre

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>/providers/<providerName>/<resourceType>/<resourceSubType>/<resourceName>"

Erőforráscsoport hatóköre

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>/resourcegroups/<resourceGroupName>"

Előfizetés hatóköre

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/subscriptions/<subscriptionId>"

Felügyeleti csoport hatóköre

az role assignment create --assignee "<managedIdentityObjectID>" \
--role "<myVectorDbReaderRole>" \
--scope "/providers/Microsoft.Management/managementGroups/<managementGroupName>"

Jogkivonatalapú hitelesítés implementálása a vektoradatbázissal

A következő kódmintákhoz további kódtárak szükségesek:

  1. Objektum inicializálása DefaultAzureCredential az alkalmazás felügyelt identitásának felvételéhez:

    // Initialize a DefaultAzureCredential.
    // This credential type will try several authentication flows in order until one is available.
    // Will pickup Visual Studio or Azure CLI credentials in local environments.
    // Will pickup managed identity credentials in production deployments.
    TokenCredential credentials = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            // If using a user-assigned identity specify either:
            // ManagedIdentityClientId or ManagedIdentityResourceId.
            // e.g.: ManagedIdentityClientId = "myIdentityClientId".
        }
    );
    
  2. Inicializáljon egy IMemoryStore objektumot a vektoradatbázishoz, majd használja egy ISemanticTextMemory:

    // Retrieve the endpoint obtained from the Azure AI Search deployment.
    // Retrieve the endpoint and deployments obtained from the Azure OpenAI deployment.
    // Must use the deployment name not the underlying model name.
    IConfigurationRoot config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
    string searchEndpoint = config["AZURE_AISEARCH_ENDPOINT"]!;
    string openAiEndpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string embeddingModel = config["AZURE_OPENAI_EMBEDDING_NAME"]!;
    
    // The Semantic Kernel SDK provides a connector extension for Azure AI Search.
    // Initialize an AzureAISearchMemoryStore using your managed identity credentials.
    IMemoryStore memoryStore = new AzureAISearchMemoryStore(searchEndpoint, credentials);
    
    // Build a SemanticMemoryStore with Azure AI Search as the store.
    // Must also include a text embedding generation service.
    ISemanticTextMemory memory = new MemoryBuilder()
        .WithOpenAITextEmbeddingGeneration(embeddingModel, openAiEndpoint)
        .WithMemoryStore(memoryStore)
        .Build();
    
  3. Hozzon létre egy Kernel objektumot, majd importálja az objektumot a ISemanticTextMemory TextMemoryPluginkövetkezővel:

    // Build a Kernel, include a chat completion service.
    string chatModel = config["AZURE_OPENAI_GPT_NAME"]!;
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAIChatCompletion(chatModel, openAiEndpoint, credentials)
        .Build();
    
    // Import the semantic memory store as a TextMemoryPlugin.
    // The TextMemoryPlugin enable recall via prompt expressions.
    kernel.ImportPluginFromObject(new TextMemoryPlugin(memory));
    
  4. Kernel Az objektum használatával meghívhat egy memóriavisszahívást tartalmazó kérést:

    // Must configure the memory collection, number of memories to recall, and relevance score.
    // The {{...}} syntax represents an expression to Semantic Kernel.
    // For more information on this syntax see:
    // https://learn.microsoft.com/semantic-kernel/prompts/prompt-template-syntax
    string memoryCollection = config["AZURE_OPENAI_MEMORY_NAME"]!;
    string? result = await kernel.InvokePromptAsync<string>(
        "{{recall 'where did I grow up?'}}",
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollection,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    Console.WriteLine($"Output: {result}");
    

Kapcsolati titkos kulcsok tárolása a Key Vault használatával

Ha egy vektoradatbázis nem támogatja a Microsoft Entra-hitelesítést, a Key Vault használatával tárolhatja a kapcsolat titkos kulcsait, és lekérheti őket az App Service-alkalmazással. A Key Vault használatával a kapcsolati titkos kulcsokat több alkalmazással is megoszthatja, és alkalmazásonként szabályozhatja az egyes titkos kódokhoz való hozzáférést.

A lépések végrehajtása előtt kérjen le egy kapcsolati sztring a vektoradatbázishoz. Lásd például az Azure Cache for Redis használatát egy ASP.NET Core-webalkalmazással.

Kapcsolati sztring hozzáadása a Key Vaulthoz

Fontos

A lépések végrehajtása előtt győződjön meg arról, hogy létrehozott egy Key Vaultot az Azure Portal használatával.

  1. Lépjen a kulcstartóra az Azure Portalon.
  2. A Key Vault bal oldali navigációs sávjában válassza az Objektumok, majd a Titkos kulcsok lehetőséget.
  3. Válassza a + Létrehozás/Importálás lehetőséget.
  4. A Titkos kód létrehozása képernyőn válassza a következő értékeket:
    • Feltöltési lehetőségek: Manual.
    • Név: Írja be a titkos kulcs nevét. A titkos kulcs nevének egyedinek kell lennie a Key Vaultban.
    • Érték: A vektoradatbázis kapcsolati sztring.
    • A többi értéket hagyja az alapértelmezett értéken. Válassza a Létrehozás lehetőséget.
  5. Amikor megkapja azt az üzenetet, hogy a titkos kód sikeresen létrejött, készen áll a használatra az alkalmazásban.

Fontos

A lépések végrehajtása előtt győződjön meg arról, hogy létrehozott egy Key Vaultot az Azure CLI használatával.

  1. Adjon felhasználói fiókengedélyeket a kulcstartóhoz szerepköralapú hozzáférés-vezérléssel (RBAC), rendeljen hozzá egy szerepkört az Azure CLI paranccsal az role assignment create:

    az role assignment create \
    --role "Key Vault Secrets User" \
    --assignee "<yourEmailAddress>" \
    --scope "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/<keyVaultName>"
    
  2. Adja hozzá a kapcsolati sztring a Key Vaulthoz az Azure CLI paranccsalaz keyvault secret set:

    az keyvault secret set \
    --vault-name "<keyVaultName>" \
    --name "<secretName>" \
    --value "<connectionString>"
    

Az App Service-nek hozzáférés biztosítása a Key Vaulthoz

  1. Hozzárendelhet egy felügyelt identitást az App Service-hez.
  2. Adja hozzá a Key Vault Secrets User szerepköröket a Key Vault Reader felügyelt identitáshoz.

Kapcsolati sztring lekérés implementálása a Key Vaultból

A következő kódminták használatához további kódtárakra van szükség:

Ezek a kódminták Egy Redis-adatbázist használnak, de bármely olyan vektoradatbázisra alkalmazhatja őket, amely támogatja a kapcsolati sztring.

  1. Objektum inicializálása DefaultAzureCredential az alkalmazás felügyelt identitásának felvételéhez:

    // Initialize a DefaultAzureCredential.
    // This credential type will try several authentication flows in order until one is available.
    // Will pickup Visual Studio or Azure CLI credentials in local environments.
    // Will pickup managed identity credentials in production deployments.
    TokenCredential credentials = new DefaultAzureCredential(
        new DefaultAzureCredentialOptions
        {
            // If using a user-assigned identity specify either:
            // ManagedIdentityClientId or ManagedIdentityResourceId.
            // e.g.: ManagedIdentityClientId = "myIdentityClientId".
        }
    );
    
  2. A Konfiguráció létrehozásakor adja hozzá a Key Vaultot, ezzel leképezi a Key Vault titkos kulcsait az IConfigurationRoot objektumra:

    // User secrets let you provide connection strings when testing locally
    // For more info see: https://learn.microsoft.com/aspnet/core/security/app-secrets
    IConfigurationRoot config = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .AddAzureKeyVault(new Uri("{vaultURI}"), credentials)
        .Build();
    
    // Retrieve the Redis connection string obtained from the Key Vault.
    string redisConnectionString = config["AZURE_REDIS_CONNECT_STRING"]!;
    
  3. A Key Vaultból származó vektoradatbázis kapcsolati sztring használatával inicializálhat egy IMemoryStore objektumot, majd a következőt ISemanticTextMemoryhozhatja létre:

    // Use the connection string to connect to the database
    IDatabase database = (
        await ConnectionMultiplexer.ConnectAsync(redisConnectionString)
    ).GetDatabase();
    
    // The Semantic Kernel SDK provides a connector extension for Redis.
    // Initialize an RedisMemoryStore using your managed identity credentials.
    IMemoryStore memoryStore = new RedisMemoryStore(database);
    
    // Retrieve the endpoint and deployments obtained from the Azure OpenAI deployment.
    // Must use the deployment name not the underlying model name.
    string openAiEndpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string embeddingModel = config["AZURE_OPENAI_EMBEDDING_NAME"]!;
    
    // Build a SemanticMemoryStore with Azure AI Search as the store.
    // Must also include a text embedding generation service.
    ISemanticTextMemory memory = new MemoryBuilder()
        .WithOpenAITextEmbeddingGeneration(embeddingModel, openAiEndpoint)
        .WithMemoryStore(memoryStore)
        .Build();
    
  4. Hozzon létre egy Kernel objektumot, majd importálja az objektumot a ISemanticTextMemory TextMemoryPluginkövetkezővel:

    // Build a Kernel, include a chat completion service.
    string chatModel = config["AZURE_OPENAI_GPT_NAME"]!;
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAIChatCompletion(chatModel, openAiEndpoint, credentials)
        .Build();
    
    // Import the semantic memory store as a TextMemoryPlugin.
    // The TextMemoryPlugin enable recall via prompt expressions.
    kernel.ImportPluginFromObject(new TextMemoryPlugin(memory));
    
  5. Kernel Az objektum használatával meghívhat egy memóriavisszahívást tartalmazó kérést:

    // Must configure the memory collection, number of memories to recall, and relevance score.
    // The {{...}} syntax represents an expression to Semantic Kernel.
    // For more information on this syntax see:
    // https://learn.microsoft.com/semantic-kernel/prompts/prompt-template-syntax
    string memoryCollection = config["AZURE_OPENAI_MEMORY_NAME"]!;
    string? result = await kernel.InvokePromptAsync<string>(
        "{{recall 'where did I grow up?'}}",
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollection,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    Console.WriteLine($"Output: {result}");
    

Kapcsolati titkos kulcsok tárolása az alkalmazásbeállítások használatával

Ha egy vektoradatbázis nem támogatja a Microsoft Entra-hitelesítést, az App Service-alkalmazás beállításaival tárolhatja a kapcsolat titkos kulcsait. Az alkalmazásbeállítások használatával további Azure-erőforrások kiépítése nélkül tárolhatja a kapcsolat titkos kulcsait.

A lépések végrehajtása előtt kérjen le egy kapcsolati sztring a vektoradatbázishoz. Lásd például az Azure Cache for Redis használatát .NET-keretrendszer.

Kapcsolati sztring hozzáadása az alkalmazásbeállításokhoz

  1. Lépjen az alkalmazás lapjára az Azure Portalon.
  2. Az alkalmazás bal oldali menüjében válassza a Konfigurációs>alkalmazás beállításai lehetőséget.
    • Alapértelmezés szerint az alkalmazásbeállítások értékei rejtettek a portálon a biztonság érdekében.
    • Egy alkalmazásbeállítás rejtett értékének megtekintéséhez válassza ki annak Érték mezőjét.
  3. Válassza az Új kapcsolat beállítást.
  4. A Hozzáadás/szerkesztés kapcsolati sztring képernyőn válassza a következő értékeket:
    • Név: Írja be a beállítás nevét. A beállítás nevének egyedinek kell lennie.
    • Érték: A vektoradatbázis kapcsolati sztring.
    • Típus: A kapcsolat típusa, Custom ha más nem alkalmazható.
    • A többi értéket hagyja az alapértelmezett értéken. Kattintson az OK gombra.
  5. Válassza a Vissza mentés lehetőséget a Konfiguráció lapon.

Alkalmazásbeállítás hozzáadása vagy szerkesztése az Azure CLI-paranccsal az webapp config connection-string set:

az webapp config connection-string set \
--name "<appName>" \
--resource-group "<groupName>" \
--connection-string-type "<connectionType>" \
--settings <connectionName>='<connectionString>'

Kapcsolati sztring lekérésének implementálása az alkalmazásbeállításokból

A következő kódminták használatához további kódtárakra van szükség:

Ezek a kódminták Egy Redis-adatbázist használnak, de bármely olyan vektoradatbázisra alkalmazhatja őket, amely támogatja a kapcsolati sztring.

  1. Környezeti változók hozzáadása a konfiguráció létrehozásakor, ez megfelelteti a kapcsolati sztring az IConfigurationRoot objektumnak:

    // User secrets let you provide connection strings when testing locally
    // For more info see: https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets
    IConfigurationRoot config = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .AddEnvironmentVariables()
        .Build();
    
    // Retrieve the Redis connection string obtained from the app settings.
    // The connection string name should match the entry in application settings
    string redisConnectionString = config.GetConnectionString("AZURE_REDIS")!;
    
  2. Használja a vektoradatbázist kapcsolati sztring az alkalmazásbeállításokból egy IMemoryStore objektum inicializálásához, majd használja egyISemanticTextMemory:

    // Use the connection string to connect to the database
    IDatabase database = (
        await ConnectionMultiplexer.ConnectAsync(redisConnectionString)
    ).GetDatabase();
    
    // The Semantic Kernel SDK provides a connector extension for Redis.
    // Initialize an RedisMemoryStore using your managed identity credentials.
    IMemoryStore memoryStore = new RedisMemoryStore(database);
    
    // Retrieve the endpoint and deployments obtained from the Azure OpenAI deployment.
    // Must use the deployment name not the underlying model name.
    string openAiEndpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string embeddingModel = config["AZURE_OPENAI_EMBEDDING_NAME"]!;
    
    // Build a SemanticMemoryStore with Azure AI Search as the store.
    // Must also include a text embedding generation service.
    ISemanticTextMemory memory = new MemoryBuilder()
        .WithOpenAITextEmbeddingGeneration(embeddingModel, openAiEndpoint)
        .WithMemoryStore(memoryStore)
        .Build();
    
  3. Hozzon létre egy Kernel objektumot, majd importálja az objektumot a ISemanticTextMemory TextMemoryPluginkövetkezővel:

    // Build a Kernel, include a chat completion service.
    string chatModel = config["AZURE_OPENAI_GPT_NAME"]!;
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAIChatCompletion(chatModel, openAiEndpoint, credentials)
        .Build();
    
    // Import the semantic memory store as a TextMemoryPlugin.
    // The TextMemoryPlugin enable recall via prompt expressions.
    kernel.ImportPluginFromObject(new TextMemoryPlugin(memory));
    
  4. Kernel Az objektum használatával meghívhat egy memóriavisszahívást tartalmazó kérést:

    // Must configure the memory collection, number of memories to recall, and relevance score.
    // The {{...}} syntax represents an expression to Semantic Kernel.
    // For more information on this syntax see:
    // https://learn.microsoft.com/semantic-kernel/prompts/prompt-template-syntax
    string memoryCollection = config["AZURE_OPENAI_MEMORY_NAME"]!;
    string? result = await kernel.InvokePromptAsync<string>(
        "{{recall 'where did I grow up?'}}",
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollection,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    Console.WriteLine($"Output: {result}");