Freigeben über


Erste Schritte mit dem Azure OpenAI-Sicherheitsbaustein

In diesem Artikel erfahren Sie, wie Sie das Azure OpenAI-Sicherheitsbausteinebeispiel erstellen und verwenden. Der Zweck besteht darin, die Bereitstellung von Azure OpenAI-Konten mit rollenbasierter Zugriffssteuerung (RBAC) für die Authentifizierung ohne Schlüssel (Microsoft Entra ID) für Azure OpenAI zu demonstrieren. Dieses Beispiel für Eine Chat-App enthält auch alle Infrastruktur und Konfiguration, die für die Bereitstellung von Azure OpenAI-Ressourcen und die Bereitstellung der App in Azure-Container-Apps mit der Azure Developer CLI erforderlich ist.

Indem Sie die Anweisungen in diesem Artikel befolgen, werden Sie:

  • Stellen Sie eine sichere Azure Container-Chat-App bereit.
  • Verwenden Sie verwaltete Identität für den Azure OpenAI-Zugriff.
  • Chatten Sie mit einem Azure OpenAI Large Language Model (LLM) mithilfe der OpenAI-Bibliothek.

Nachdem Sie das Verfahren in diesem Artikel abgeschlossen haben, können Sie mit dem Ändern des neuen Projekts mit Ihrem benutzerdefinierten Code und Ihren Daten beginnen.

Hinweis

In diesem Artikel wird mindestens eine KI-App-Vorlage als Grundlage für die Beispiele und Anleitungen im Artikel verwendet. KI-App-Vorlagen bieten Ihnen gut gepflegte, einfach bereitzustellende Referenzimplementierungen, die helfen, einen qualitativ hochwertigen Ausgangspunkt für Ihre KI-Apps zu gewährleisten.

Übersicht über die Architektur

Eine einfache Architektur der Chat-App wird im folgenden Diagramm gezeigt: Abbildung der Architektur vom Client bis zur Back-End-App

Die Chat-App wird als Azure-Container-App ausgeführt. Die App verwendet verwaltete Identität über Microsoft Entra ID, um sich mit Azure OpenAI zu authentifizieren, anstatt mit einem API-Schlüssel. Die Chat-App verwendet Azure OpenAI, um Antworten auf Benutzernachrichten zu generieren.

Die Anwendungsarchitektur basiert auf den folgenden Diensten und Komponenten:

  • Azure OpenAI stellt den KI-Anbieter dar, an den die Abfragen des Benutzers gesendet werden.
  • Azure Container Apps ist die Containerumgebung, in der die Anwendung gehostet wird.
  • Managed Identity hilft uns dabei, eine erstklassige Sicherheit zu gewährleisten und die Anforderung für Sie als Entwickler zu beseitigen, einen geheimen Schlüssel sicher zu verwalten.
  • Bicep-Dateien für die Bereitstellung von Azure-Ressourcen, einschließlich Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics und RBAC-Rollen.
  • Das Microsoft KI-Chat-Protokoll bietet standardisierte API-Verträge über KI-Lösungen und Sprachen hinweg. Die Chat-App entspricht dem Microsoft KI-Chat-Protokoll, mit dem die Evaluierungs-App für jede Chat-App ausgeführt werden kann, die dem Protokoll entspricht.
  • Ein Python Quart , das das openai Paket verwendet, um Antworten auf Benutzernachrichten zu generieren.
  • Ein einfaches HTML/JavaScript-Frontend, das Antworten aus dem Back-End mithilfe von JSON-Zeilen über einen ReadableStream streamt.
  • Eine Blazor-Web-App, die das Azure.AI.OpenAI NuGet-Paket verwendet, um Antworten auf Benutzernachrichten zu generieren.
  • Eine TypeScript-Web-App, die das openai npm-Paket verwendet, um Antworten auf Benutzernachrichten zu generieren.

Kosten

Bei dem Versuch, die Preise in diesem Beispiel so niedrig wie möglich zu halten, verwenden die meisten Ressourcen ein Einfaches oder Verbrauchspreisniveau. Ändern Sie die Ebenenebene je nach Bedarf basierend auf Ihrer beabsichtigten Verwendung. Löschen Sie die Ressourcen, wenn Sie mit dem Artikel fertig sind, um die Anfallenden Gebühren zu beenden.

Weitere Informationen zu den Kosten im Beispielrepository finden Sie hier.

Weitere Informationen zu den Kosten im Beispielrepository finden Sie hier.

Weitere Informationen zu den Kosten im Beispielrepository finden Sie hier.

Voraussetzungen

Eine Entwicklungscontainerumgebung ist mit allen Abhängigkeiten verfügbar, die zum Abschließen dieses Artikels erforderlich sind. Sie können den Entwicklungscontainer in GitHub Codespaces (in einem Browser) oder lokal mit Visual Studio Code ausführen.

Um diesen Artikel zu verwenden, müssen Sie die folgenden Voraussetzungen erfüllen:

Öffnen Sie die Entwicklungsumgebung

Verwenden Sie die folgenden Anweisungen, um eine vorkonfigurierte Entwicklungsumgebung bereitzustellen, die alle erforderlichen Abhängigkeiten enthält, um diesen Artikel abzuschließen.

GitHub Codespaces führt einen von GitHub verwalteten Entwicklungscontainer mit Visual Studio Code für Web als Benutzeroberfläche aus. Verwenden Sie für die einfachste Entwicklungsumgebung GitHub Codespaces, damit Sie die richtigen Entwicklertools und Abhängigkeiten vorinstalliert haben, um diesen Artikel abzuschließen.

Wichtig

Alle GitHub-Konten können Codespaces für bis zu 60 Stunden pro Monat mit zwei Kerninstanzen kostenlos verwenden. Weitere Informationen finden Sie im Artikel zu monatlich enthaltener Speicherkapazität und Kernstunden in GitHub Codespaces.

Führen Sie die folgenden Schritte aus, um einen neuen GitHub Codespace auf der main Verzweigung des Azure-Samples/openai-chat-app-quickstart GitHub-Repositorys zu erstellen.

  1. Klicken Sie mit der rechten Maustaste auf die folgende Schaltfläche, und wählen Sie im neuen Fenster "Link öffnen" aus. Mit dieser Aktion können Sie die Entwicklungsumgebung und die Dokumentation zur Überprüfung zur Verfügung stellen.

  2. Überprüfen Sie auf der Seite "Codespace erstellen" die Option "Neuen Codespace erstellen", und wählen Sie dann "Neuen Codespace erstellen" aus.

    Screenshot: Bestätigungsbildschirm vor dem Erstellen eines neuen Codespace.

  3. Warten Sie den Start des Codespaces ab. Dieser Startvorgang kann einige Minuten dauern.

  4. Melden Sie sich mit der Azure Developer CLI am unteren Bildschirmrand bei Azure an.

    azd auth login
    
  5. Kopieren Sie den Code vom Terminal und fügen Sie ihn dann in einen Browser ein. Befolgen Sie die Anweisungen zum Authentifizieren mit Ihrem Azure-Konto.

Die verbleibenden Aufgaben in diesem Artikel finden im Kontext dieses Entwicklungscontainers statt.

Führen Sie die folgenden Schritte aus, um einen neuen GitHub Codespace auf der main Verzweigung des Azure-Samples/openai-chat-app-quickstart-dotnet GitHub-Repositorys zu erstellen.

  1. Klicken Sie mit der rechten Maustaste auf die folgende Schaltfläche, und wählen Sie im neuen Fenster "Link öffnen" aus. Mit dieser Aktion können Sie die Entwicklungsumgebung und die Dokumentation zur Überprüfung zur Verfügung stellen.

  2. Überprüfen Sie auf der Seite "Codespace erstellen" die Option "Codespace erstellen", und wählen Sie dann "Codespace erstellen" aus.

    Screenshot: Bestätigungsbildschirm vor dem Erstellen eines neuen Codespace.

  3. Warten Sie den Start des Codespaces ab. Dieser Startvorgang kann einige Minuten dauern.

  4. Melden Sie sich mit der Azure Developer CLI am unteren Bildschirmrand bei Azure an.

    azd auth login
    
  5. Kopieren Sie den Code vom Terminal und fügen Sie ihn dann in einen Browser ein. Befolgen Sie die Anweisungen zum Authentifizieren mit Ihrem Azure-Konto.

Die verbleibenden Aufgaben in diesem Artikel finden im Kontext dieses Entwicklungscontainers statt.

Führen Sie die folgenden Schritte aus, um einen neuen GitHub Codespace auf der main Verzweigung des Azure-Samples/openai-chat-app-quickstart-javascript GitHub-Repositorys zu erstellen.

  1. Klicken Sie mit der rechten Maustaste auf die folgende Schaltfläche, und wählen Sie im neuen Fenster "Link öffnen" aus. Mit dieser Aktion können Sie die Entwicklungsumgebung und die Dokumentation zur Überprüfung zur Verfügung stellen.

In GitHub Codespaces öffnen

  1. Überprüfen Sie auf der Seite "Codespace erstellen" die Option "Neuen Codespace erstellen", und wählen Sie dann "Neuen Codespace erstellen" aus.

    Screenshot: Bestätigungsbildschirm vor dem Erstellen eines neuen Codespace.

  2. Warten Sie den Start des Codespaces ab. Dieser Startvorgang kann einige Minuten dauern.

  3. Melden Sie sich mit der Azure Developer CLI am unteren Bildschirmrand bei Azure an.

    azd auth login
    
  4. Kopieren Sie den Code vom Terminal und fügen Sie ihn dann in einen Browser ein. Befolgen Sie die Anweisungen zum Authentifizieren mit Ihrem Azure-Konto.

Die verbleibenden Aufgaben in diesem Artikel finden im Kontext dieses Entwicklungscontainers statt.

Bereitstellen und Ausführen

Das Beispiel-Repository enthält alle Code- und Konfigurationsdateien für die Azure-Bereitstellung von Chat-Apps. Die folgenden Schritte führen Sie durch den Azure-Bereitstellungsprozess der Beispielchat-App.

Bereitstellen einer Chat-App in Azure

Wichtig

Azure-Ressourcen, die in diesem Abschnitt erstellt wurden, verursachen sofortige Kosten. Diese Ressourcen können Kosten verursachen, selbst wenn Sie den Befehl unterbrechen, bevor er vollständig ausgeführt wird.

  1. Führen Sie den folgenden Azure Developer CLI-Befehl für die Bereitstellung von Azure-Ressourcen und die Quellcodebereitstellung aus:

    azd up
    
  2. Gehen Sie zum Beantworten der Eingabeaufforderungen gemäß der folgenden Tabelle vor:

    Prompt Antwort
    Umgebungsname Halten Sie dies kurz, und verwenden Sie nur Kleinbuchstaben. Fügen Sie Ihren Namen oder Alias hinzu. Beispiel: secure-chat. Er wird als Teil des Ressourcengruppennamens verwendet.
    Abonnement Wählen Sie das Abonnement aus, in dem Sie die Ressourcen erstellen möchten.
    Standort (für Hosting) Wählen Sie aus der Liste einen Standort in Ihrer Nähe aus.
    Standort für das OpenAI-Modell Wählen Sie aus der Liste einen Standort in Ihrer Nähe aus. Wenn derselbe Speicherort wie Ihr erster Speicherort verfügbar ist, wählen Sie diesen Speicherort aus.
  3. Warten Sie, bis die App bereitgestellt wird. Die Bereitstellung dauert in der Regel zwischen 5 und 10 Minuten, bis die Bereitstellung abgeschlossen ist.

Verwenden der Chat-App zum Stellen von Fragen zum Großen Sprachmodell

  1. Das Terminal zeigt eine URL nach erfolgreicher Anwendungsbereitstellung an.

  2. Wählen Sie diese URL aus, die als Deploying service web beschriftet ist, um die Chatanwendung in einem Browser zu öffnen.

    Screenshot der Chat-App im Browser mit mehreren Vorschlägen für Chateingaben und dem Chattextfeld, um eine Frage einzugeben

  3. Geben Sie im Browser eine Frage wie "Warum ist verwaltete Identität besser als Schlüssel?" ein.

  4. Die Antwort stammt aus Azure OpenAI und das Ergebnis wird angezeigt.

Erkunden des Beispielcodes

Während OpenAI und Azure OpenAI Service auf eine allgemeine Python-Clientbibliothek angewiesen sind, werden kleine Codeänderungen bei Verwendung von Azure OpenAI-Endpunkten benötigt. Sehen wir uns an, wie in diesem Beispiel die schlüssellose Authentifizierung mit Microsoft Entra ID konfiguriert und mit Azure OpenAI kommuniziert wird.

Konfigurieren der Authentifizierung mit verwalteter Identität

In diesem Beispiel beginnt die Datei mit der Konfiguration der src\quartapp\chat.py schlüssellosen Authentifizierung.

Der folgende Codeausschnitt verwendet das Modul azure.identity.aio , um einen asynchronen Microsoft Entra-Authentifizierungsfluss zu erstellen.

Der folgende Codeausschnitt verwendet die AZURE_CLIENT_IDazd Umgebungsvariable, um eine ManagedIdentityCredential-Instanz zu erstellen, die über vom Benutzer zugewiesene verwaltete Identität authentifiziert werden kann.

user_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv("AZURE_CLIENT_ID")) 

Hinweis

Die azd Ressourcenumgebungsvariablen werden während der azd App-Bereitstellung bereitgestellt.

Der folgende Codeausschnitt verwendet AZURE_TENANT_IDazd die Ressourcenumgebungsvariable, um eine AzureDeveloperCliCredential-Instanz zu erstellen, die mit dem aktuellen Microsoft Entra-Mandanten authentifiziert werden kann.

azure_dev_cli_credential = AzureDeveloperCliCredential(tenant_id=os.getenv("AZURE_TENANT_ID"), process_timeout=60)  

Die Azure Identity-Clientbibliothek stellt Anmeldeinformationen bereit – öffentliche Klassen, die das TokenCredential-Protokoll der Azure Core-Bibliothek implementieren. Anmeldeinformationen stellen einen eindeutigen Authentifizierungsfluss zum Abrufen eines Zugriffstokens aus der Microsoft Entra-ID dar. Diese Anmeldedaten können miteinander verkettet werden, um eine geordnete Abfolge von Authentifizierungsmechanismen zu bilden, die versucht werden sollen.

Der folgende Codeausschnitt erstellt eine using a ChainedTokenCredentialManagedIdentityCredential und eine AzureDeveloperCliCredential:

  • Dies ManagedIdentityCredential wird für Azure-Funktionen und Azure-App-Dienst verwendet. Eine vom Benutzer zugewiesene verwaltete Identität wird durch übergeben an client_idManagedIdentityCredential.
  • Dies AzureDeveloperCliCredential wird für die lokale Entwicklung verwendet. Sie wurde zuvor basierend auf dem Microsoft Entra-Mandanten festgelegt, der verwendet werden soll.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Tipp

Die Reihenfolge der Anmeldeinformationen ist wichtig, da das erste gültige Microsoft Entra-Zugriffstoken verwendet wird. Weitere Informationen finden Sie im Artikel "ChainedTokenCredential Overview" .

Der folgende Codeausschnitt ruft den Azure OpenAI-Tokenanbieter basierend auf den ausgewählten Azure-Anmeldeinformationen ab. Dieser Wert wird durch Aufrufen der azure.identity.aio.get_bearer_token_provider mit zwei Argumenten abgerufen:

  • azure_credential: Die ChainedTokenCredential zuvor erstellte Instanz, um die Anforderung zu authentifizieren.

  • https://cognitiveservices.azure.com/.default: Erforderlich für einen oder mehrere Bearertokenbereiche. In diesem Fall der Azure Cognitive Services-Endpunkt .

token_provider = get_bearer_token_provider(
    azure_credential, "https://cognitiveservices.azure.com/.default"
)

In den folgenden Zeilen werden die erforderlichen AZURE_OPENAI_ENDPOINT Und AZURE_OPENAI_CHATGPT_DEPLOYMENTazd Ressourcenumgebungsvariablen überprüft, die während der azd App-Bereitstellung bereitgestellt werden. Wenn kein Wert vorhanden ist, wird ein Fehler ausgelöst.

if not os.getenv("AZURE_OPENAI_ENDPOINT"):
    raise ValueError("AZURE_OPENAI_ENDPOINT is required for Azure OpenAI")
if not os.getenv("AZURE_OPENAI_CHATGPT_DEPLOYMENT"):
    raise ValueError("AZURE_OPENAI_CHATGPT_DEPLOYMENT is required for Azure OpenAI")

Dieser Codeausschnitt initialisiert den Azure OpenAI-Client, legt die api_versionParameter und azure_endpointazure_ad_token_provider(client_args) fest:

bp.openai_client = AsyncAzureOpenAI(
    api_version=os.getenv("AZURE_OPENAI_API_VERSION") or "2024-02-15-preview",
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    azure_ad_token_provider=token_provider,
)  

In der folgenden Zeile wird der Bereitstellungsname des Azure OpenAI-Modells für die Verwendung in API-Aufrufen festgelegt:

bp.openai_model = os.getenv("AZURE_OPENAI_CHATGPT_DEPLOYMENT")

Hinweis

OpenAI verwendet das Schlüsselwortargument model für die Angabe, welches Modell verwendet werden soll. Azure OpenAI verfügt über das Konzept einzigartiger Modellimplementierungen. Wenn Sie Azure OpenAI verwenden, sollten Sie sich auf den zugrunde liegenden Bereitstellungsnamen beziehen, model der während der Azure OpenAI-Modellbereitstellung ausgewählt wurde.

Sobald diese Funktion abgeschlossen ist, ist der Client ordnungsgemäß konfiguriert und bereit für die Interaktion mit Azure OpenAI-Diensten.

Antwortdatenstrom mit dem OpenAI-Client und -Modell

Der response_stream Chatabschlussanruf wird in der Route behandelt. Der folgende Codeausschnitt zeigt, wie openai_client und model verwendet wird.

async def response_stream():
    # This sends all messages, so API request may exceed token limits
    all_messages = [
        {"role": "system", "content": "You are a helpful assistant."},
    ] + request_messages

    chat_coroutine = bp.openai_client.chat.completions.create(
        # Azure Open AI takes the deployment name as the model name
        model=bp.openai_model,
        messages=all_messages,
        stream=True,
    )

Untersuchen des Beispielcodes

.NET-Anwendungen basieren auf der Azure.AI.OpenAI-Clientbibliothek für die Kommunikation mit Azure OpenAI-Diensten, die eine Abhängigkeit von der OpenAI-Bibliothek benötigen. Die Beispiel-App konfiguriert die schlüssellose Authentifizierung mithilfe der Microsoft Entra-ID für die Kommunikation mit Azure OpenAI.

Konfigurieren der Authentifizierung und Dienstregistrierung

In diesem Beispiel wird die schlüssellose Authentifizierung in der program.cs Datei konfiguriert. Der folgende Codeausschnitt verwendet die Umgebungsvariable, die AZURE_CLIENT_IDazd festgelegt wurde, um eine ManagedIdentityCredential-Instanz zu erstellen, die über vom Benutzer zugewiesene verwaltete Identität authentifiziert werden kann.

var userAssignedIdentityCredential = 
    new ManagedIdentityCredential(builder.Configuration.GetValue<string>("AZURE_CLIENT_ID"));

Hinweis

Die azd Ressourcenumgebungsvariablen werden während der azd App-Bereitstellung bereitgestellt.

Der folgende Codeausschnitt verwendet die Umgebungsvariable, die AZURE_TENANT_IDazd festgelegt wurde, um eine AzureDeveloperCliCredential-Instanzazdzu erstellen, die lokal mithilfe des angemeldeten Kontos authentifiziert werden kann.

var azureDevCliCredential = new AzureDeveloperCliCredential(
    new AzureDeveloperCliCredentialOptions()
    { 
        TenantId = builder.Configuration.GetValue<string>("AZURE_TENANT_ID") 
    });

Die Azure Identity-Clientbibliothek stellt Anmeldeinformationsklassen bereit, die das TokenCredential-Protokoll der Azure Core-Bibliothek implementieren. Anmeldeinformationen stellen einen eindeutigen Authentifizierungsfluss zum Abrufen eines Zugriffstokens aus der Microsoft Entra-ID dar. Diese Anmeldeinformationen können mithilfe ChainedTokenCredential einer sortierten Abfolge von Authentifizierungsmechanismen verkettet werden, die versucht werden sollen.

Der folgende Codeausschnitt registriert die AzureOpenAIClient Abhängigkeitsinjektion und erstellt eine ChainedTokenCredential Verwendung und ManagedIdentityCredential eine AzureDeveloperCliCredential:

  • Dies ManagedIdentityCredential wird für Azure-Funktionen und Azure-App-Dienst verwendet. Eine vom Benutzer zugewiesene verwaltete Identität wird mithilfe der AZURE_CLIENT_ID vom Benutzer bereitgestellten Identität ManagedIdentityCredentialunterstützt.
  • Dies AzureDeveloperCliCredential wird für die lokale Entwicklung verwendet. Sie wurde zuvor basierend auf dem Microsoft Entra-Mandanten festgelegt, der verwendet werden soll.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Tipp

Die Reihenfolge der Anmeldeinformationen ist wichtig, da das erste gültige Microsoft Entra-Zugriffstoken verwendet wird. Weitere Informationen finden Sie im Artikel "ChainedTokenCredential Overview" .

Abrufen von Chatabschlussen mithilfe des Azure OpenAI-Clients

Die Blazor-Web-App fügt die registrierten AzureOpenAIClient am Anfang der Home.Razor Komponente ein:

@inject AzureOpenAIClient azureOpenAIClient

Wenn der Benutzer das Formular übermittelt, sendet der Benutzer seine AzureOpenAIClient Aufforderung an das OpenAI-Modell, um einen Abschluss zu generieren:

ChatClient chatClient = azureOpenAIClient.GetChatClient("gpt-4o-mini");

messages.Add(new UserChatMessage(model.UserMessage));

ChatCompletion completion = await chatClient.CompleteChatAsync(messages);
    messages.Add(new SystemChatMessage(completion.Content[0].Text));

Untersuchen des Beispielcodes

Während OpenAI und Azure OpenAI Service auf eine Openai (allgemeine JavaScript-Clientbibliothek) angewiesen sind, werden kleine Codeänderungen bei Verwendung von Azure OpenAI-Endpunkten benötigt. Sehen wir uns an, wie in diesem Beispiel die schlüssellose Authentifizierung mit Microsoft Entra ID konfiguriert und mit Azure OpenAI kommuniziert wird.

Schlüssellose Authentifizierung für jede Umgebung

Die Azure Identity-Clientbibliothek stellt Anmeldeinformationsklassen bereit, die das TokenCredential-Protokoll der Azure Core-Bibliothek implementieren. Anmeldeinformationen stellen einen eindeutigen Authentifizierungsfluss zum Abrufen eines Zugriffstokens aus der Microsoft Entra-ID dar. Diese Anmeldeinformationen können mithilfe ChainedTokenCredential einer sortierten Abfolge von Authentifizierungsmechanismen verkettet werden, die versucht werden sollen. Auf diese Weise können Sie denselben Code sowohl in Produktions- als auch in lokalen Entwicklungsumgebungen bereitstellen.

Diagramm mit den beiden Anmeldeinformationen im Fluss, in dem zuerst versucht wird, die verwaltete Identität zu versuchen, dann wird die Azure-Standardanmeldeinformationen ausprobiert.

Konfigurieren der Authentifizierung mit verwalteter Identität

In diesem Beispiel bietet die ./src/azure-authentication.ts Funktion mehrere Funktionen, um eine schlüssellose Authentifizierung für Azure OpenAI bereitzustellen.

Die erste Funktion , getChainedCredential()gibt die ersten gültigen Azure-Anmeldeinformationen in der Kette zurück.

function getChainedCredential() {

    return new ChainedTokenCredential(
        new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID!), 
        new AzureDeveloperCliCredential({
            tenantId: process.env.AZURE_TENANT_ID! ? process.env.AZURE_TENANT_ID! : undefined
          })
    );
}
  • ManagedIdentityCredential wird zuerst versucht. Sie ist mit der AZURE_CLIENT_ID Umgebungsvariable in der Produktionslaufzeit eingerichtet und kann über vom Benutzer zugewiesene verwaltete Identität authentifiziert werden.
  • AzureDeveloperCliCredential wird zweitens versucht. Sie wird eingerichtet, wenn sich eine Entwicklung mit Azure CLI az loginanmeldet.

Tipp

Die Reihenfolge der Anmeldeinformationen ist wichtig, da das erste gültige Microsoft Entra-Zugriffstoken verwendet wird. Weitere Informationen finden Sie im Artikel "ChainedTokenCredential Overview" .

Bearertoken für OpenAI abrufen

Die zweite Funktion in ./src/azure-authentication.ts ist getTokenProvider(), die einen Rückruf zurückgibt, der ein Bearertoken für den Azure Cognitive Services-Endpunkt bereitstellt.

function getTokenProvider(): () => Promise<string> {
    const credential  = getChainedCredential();
    const scope = "https://cognitiveservices.azure.com/.default";
    return getBearerTokenProvider(credential, scope);
}

Der vorangehende Codeausschnitt verwendet getBearerTokenProvider die Anmeldeinformationen und den Bereich, und gibt dann einen Rückruf zurück, der ein Bearertoken bereitstellt.

Erstellen eines authentifizierten Azure OpenAI-Clients

Die dritte Funktion in ./src/azure-authentication.ts ist getOpenAiClient(), die den Azure OpenAI-Client zurückgibt.

export function getOpenAiClient(): AzureOpenAI | undefined{
    try {

        if (!process.env.AZURE_OPENAI_ENDPOINT) {
            throw new Error("AZURE_OPENAI_ENDPOINT is required for Azure OpenAI");
        }
        if (!process.env.AZURE_OPENAI_CHAT_DEPLOYMENT) {
            throw new Error("AZURE_OPENAI_CHAT_DEPLOYMENT is required for Azure OpenAI");
        }

        const options = { 
            azureADTokenProvider: getTokenProvider(), 
            deployment: process.env.AZURE_OPENAI_CHAT_DEPLOYMENT!, 
            apiVersion: process.env.AZURE_OPENAI_API_VERSION! || "2024-02-15-preview",
            endpoint: process.env.AZURE_OPENAI_ENDPOINT!
        }

        // Create the Asynchronous Azure OpenAI client
        return new AzureOpenAI (options);

    } catch (error) {
        console.error('Error getting Azure OpenAI client: ', error);
    }
}

Dieser Code verwendet die Optionen, einschließlich des ordnungsgemäß bereichsbezogenen Tokens und erstellt den AzureOpenAI Client.

Chatantwort mit Azure OpenAI streamen

Verwenden Sie den folgenden Fastify-Routenhandler, ./src/openai-chat-api.ts um eine Nachricht an Azure OpenAI zu senden und die Antwort zu streamen.

import { FastifyReply, FastifyRequest } from 'fastify';
import { AzureOpenAI } from "openai";
import { getOpenAiClient } from './azure-authentication.js';
import { ChatCompletionChunk, ChatCompletionMessageParam } from 'openai/resources/chat/completions';

interface ChatRequestBody {
    messages: ChatCompletionMessageParam [];
  }

export async function chatRoute (request: FastifyRequest<{ Body: ChatRequestBody }>, reply: FastifyReply) {

    const requestMessages: ChatCompletionMessageParam[] = request?.body?.messages;
    const openaiClient: AzureOpenAI | undefined = getOpenAiClient();

    if (!openaiClient) {
      throw new Error("Azure OpenAI client is not configured");
    }

    const allMessages = [
      { role: "system", content: "You are a helpful assistant."},
      ...requestMessages
    ] as ChatCompletionMessageParam [];

    const chatCompletionChunks = await openaiClient.chat.completions.create({
      // Azure Open AI takes the deployment name as the model name
      model: process.env.AZURE_OPENAI_CHAT_DEPLOYMENT_MODEL || "gpt-4o-mini",
      messages: allMessages,
      stream: true

    })
    reply.raw.setHeader('Content-Type', 'text/html; charset=utf-8');
    reply.raw.setHeader('Cache-Control', 'no-cache');
    reply.raw.setHeader('Connection', 'keep-alive');
    reply.raw.flushHeaders();

    for await (const chunk of chatCompletionChunks as AsyncIterable<ChatCompletionChunk>) {
      for (const choice of chunk.choices) {
        reply.raw.write(JSON.stringify(choice) + "\n")
      }
    }

    reply.raw.end()

}

Die Funktion ruft die Chatunterhaltung einschließlich früherer Nachrichten ab und sendet sie an Azure OpenAI. Wenn die Datenströme von Azure OpenAI zurückgegeben werden, werden die Daten an den Client gesendet.

Weitere Sicherheitsüberlegungen

In diesem Artikel wird veranschaulicht, wie das Beispiel für die Authentifizierung für den Azure OpenAI-Dienst verwendet ChainedTokenCredential wird.

Das Beispiel verfügt auch über eine GitHub-Aktion , die die Infrastruktur-as-Code-Dateien durchsucht und einen Bericht generiert, der alle erkannten Probleme enthält. Um weiterhin bewährte Methoden in Ihrem eigenen Repository sicherzustellen, empfehlen wir, dass alle Benutzer, die Lösungen basierend auf unseren Vorlagen erstellen, sicherstellen, dass die Geheimüberprüfungseinstellung für GitHub aktiviert ist.

Berücksichtigen Sie andere Sicherheitsmaßnahmen, z. B.:

Bereinigen von Ressourcen

Bereinigen von Azure-Ressourcen

Die in diesem Artikel erstellten Azure-Ressourcen werden Ihrem Azure-Abonnement in Rechnung gestellt. Wenn Sie nicht erwarten, dass diese Ressourcen in Zukunft benötigt werden, löschen Sie sie, um weitere Gebühren zu vermeiden.

Führen Sie den folgenden Azure Developer CLI-Befehl aus, um die Azure-Ressourcen zu löschen und den Quellcode zu entfernen:

azd down --purge

Bereinigen von GitHub-Codespaces

Durch das Löschen der GitHub Codespaces-Umgebung wird sichergestellt, dass Sie die Anzahl der kostenlosen Berechtigungsstunden pro Kern maximieren können, die Sie für Ihr Konto erhalten.

Wichtig

Weitere Informationen zu den Berechtigungen Ihres GitHub-Kontos finden Sie im Artikel zu monatlich enthaltener Speicherkapazität und Kernstunden in GitHub Codespaces.

  1. Melden Sie sich beim GitHub Codespaces-Dashboard (https://github.com/codespaces) an.

  2. Suchen Sie Ihre derzeit ausgeführten Codespaces, die aus dem GitHub-Repository Azure-Samples/openai-chat-app-quickstart stammen.

  3. Öffnen Sie das Kontextmenü für den Codespace, und wählen Sie dann Löschen aus.

  1. Melden Sie sich beim GitHub Codespaces-Dashboard (https://github.com/codespaces) an.

  2. Suchen Sie Ihre derzeit ausgeführten Codespaces, die aus dem GitHub-Repository Azure-Samples/openai-chat-app-quickstart-dotnet stammen.

  3. Öffnen Sie das Kontextmenü für den Codespace, und wählen Sie dann Löschen aus.

  1. Melden Sie sich beim GitHub Codespaces-Dashboard (https://github.com/codespaces) an.

  2. Suchen Sie Ihre derzeit ausgeführten Codespaces, die aus dem GitHub-Repository Azure-Samples/openai-chat-app-quickstart-javascript stammen.

  3. Öffnen Sie das Kontextmenü für den Codespace, und wählen Sie dann Löschen aus.

Hilfe erhalten

Wenn Ihr Problem nicht behoben ist, protokollieren Sie Ihr Problem bei den Problemen des Repositorys.

Nächste Schritte

Wenn Ihr Problem nicht behoben ist, protokollieren Sie Ihr Problem bei den Problemen des Repositorys.

Wenn Ihr Problem nicht behoben ist, protokollieren Sie Ihr Problem bei den Problemen des Repositorys.