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, Azure OpenAI-Kontobereitstellung mit rollenbasierter Zugriffssteuerung (RBAC) für die schlüssellose Authentifizierung (Microsoft Entra ID) für Azure OpenAI zu demonstrieren. Dieses Beispiel einer Chat-App umfasst auch alle Infrastruktur und Konfiguration, die für die Bereitstellung von Azure OpenAI-Ressourcen und die Bereitstellung der App in Azure Container Apps mithilfe der Azure Developer CLI erforderlich sind.

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

  • Stellen Sie eine sichere Chat-App auf Azure Container Apps bereit.
  • Verwenden Sie verwaltete Identität für 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 zur Authentifizierung mit Azure OpenAI anstelle eines API-Schlüssels. 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.
  • Eine Python Quart-App, die das paket openai und die API Responses 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 NuGet-Paket Azure.AI.OpenAI benutzt, 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 Ihre Stufe je nach Bedarf basierend auf dem geplanten Nutzungszweck. Löschen Sie die Ressourcen, wenn Sie mit dem Artikel fertig sind, um Gebühren zu vermeiden.

Erfahren Sie mehr über Cost im Beispielrepo.

Erfahren Sie mehr über Cost im Beispielrepo.

Erfahren Sie mehr über Cost im Beispielrepo.

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 das 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 kostenlos jeden Monat mit 2 Kerninstanzen verwenden. Weitere Informationen finden Sie unter GitHub Codespaces monatlich enthaltene Speicher- und Kernstunden.

Führen Sie die folgenden Schritte aus, um einen neuen GitHub Codespace im main Branch des Repositorys Azure-Samples/openai-chat-app-quickstart GitHub 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 Angaben und wählen Sie dann "Neuen Codespace erstellen" aus.

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

  3. Warten Sie darauf, dass der Codespace startet. 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. Folgen Sie den Anweisungen, um sich bei Ihrem Azure Konto zu authentifizieren.

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

Führen Sie die folgenden Schritte aus, um einen neuen GitHub Codespace im main Branch des Repositorys Azure-Samples/openai-chat-app-quickstart-dotnet GitHub 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 alles und wählen Sie dann Codespace erstellen.

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

  3. Warten Sie darauf, dass der Codespace startet. 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. Folgen Sie den Anweisungen, um sich bei Ihrem Azure Konto zu authentifizieren.

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

Führen Sie die folgenden Schritte aus, um einen neuen GitHub Codespace im main Branch des Repositorys Azure-Samples/openai-chat-app-quickstart-javascript GitHub 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.

Open in GitHub Codespaces

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

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

  2. Warten Sie darauf, dass der Codespace startet. 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. Folgen Sie den Anweisungen, um sich bei Ihrem Azure Konto zu authentifizieren.

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 Bereitstellung der Azure-Chat-App. Die folgenden Schritte führen Sie durch den Bereitstellungsprozess der Azure-Beispielchat-App.

Bereitstellen einer Chat-App für 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 Azure Ressourcenbereitstellung und Quellcodebereitstellung aus:

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

    Aufforderung 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.

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 common-Python-Clientbibliothek basieren, sind kleine Codeänderungen erforderlich, wenn Azure OpenAI-Endpunkte verwendet werden. 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 Ressourcenumgebungsvariable, um eine AzureDeveloperCliCredential Instanz zu erstellen, die sich mit dem aktuellen Microsoft Entra Mandanten authentifizieren kann.

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

Die Azure Identity-Clientbibliothek stellt Credentials bereit– öffentliche Klassen, die das Azure Core Library-Protokoll TokenCredential implementieren. Eine Anmeldeinformation stellt einen eindeutigen Authentifizierungsfluss zum Abrufen eines Zugriffstokens aus 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 ein ChainedTokenCredential, indem ein ManagedIdentityCredential und ein AzureDeveloperCliCredential verwendet werden.

  • Die ManagedIdentityCredential wird für Azure Functions, Azure App Service und Azure Container Apps verwendet. Eine vom Benutzer zugewiesene verwaltete Identität wird unterstützt, indem client_id an ManagedIdentityCredential übergeben wird.
  • Dies AzureDeveloperCliCredential wird für die lokale Entwicklung verwendet. Sie wurde zuvor basierend auf dem zu verwendenden Microsoft Entra Mandanten festgelegt.
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 Token-Provider basierend auf den ausgewählten Azure Anmeldedaten 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: Erfordert einen oder mehrere Geltungsbereiche für Bearer-Token. 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 Umgebungsvariablen AZURE_OPENAI_ENDPOINT und AZURE_OPENAI_CHAT_DEPLOYMENT sowie die zwei azd überprüft, die während der Bereitstellung azd festgelegt werden. Wenn kein Wert vorhanden ist, wird ein Fehler ausgelöst.

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

Dieser Codeausschnitt initialisiert den OpenAI-Client für den /openai/v1/-Endpunkt von Azure und übergibt den Tokenanbieter als api_key. Beim v1-Endpunkt ist kein api_version notwendig.

bp.openai_client = AsyncOpenAI(
    base_url=f"{openai_endpoint.rstrip('/')}/openai/v1/",
    api_key=token_provider,
)

Die folgende Zeile legt den Azure OpenAI-Modellbereitstellungsnamen für die Verwendung in API-Aufrufen fest:

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

Hinweis

OpenAI verwendet das Schlüsselwortargument model für die Angabe, welches Modell verwendet werden soll. Azure OpenAI hat das Konzept von einzigartigen Modellbereitstellungen. Wenn Sie Azure OpenAI verwenden, sollte model auf den zugrunde liegenden Bereitstellungsnamen verweisen, der während der Azure OpenAI-Modellbereitstellung ausgewählt wurde.

Nach Abschluss dieser Funktion ist der Client ordnungsgemäß konfiguriert und kann mit Azure OpenAI-Diensten interagieren.

Streamen von Antworten mithilfe der OpenAI-Antwort-API

Der response_stream verarbeitet den Responses-API-Streamingaufruf in der Route. Das Frontend sendet antwortenförmige input elemente direkt und das Backend leitet sie an responses.stream() weiter.

async def response_stream():
    try:
        async with bp.openai_client.responses.stream(
            model=bp.openai_model,
            input=request_input,
            store=False,
        ) as openai_stream:
            async for event in openai_stream:
                yield json.dumps(event.model_dump(), ensure_ascii=False) + "\n"
    except Exception as e:
        current_app.logger.exception("Responses stream failed")
        yield json.dumps({"error": str(e)}, ensure_ascii=False) + "\n"

Untersuchen des Beispielcodes

.NET Anwendungen basieren auf dem Azure. AI. OpenAI-Clientbibliothek für die Kommunikation mit Azure OpenAI-Diensten, die eine Abhängigkeit von der OpenAIBibliothek akzeptiert. Die Beispiel-App konfiguriert die schlüssellose Authentifizierung mithilfe von 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 von AZURE_CLIENT_IDazd festgelegte Umgebungsvariable, um eine ManagedIdentityCredential-Instanz zu erstellen, die sich über eine benutzerzugewiesene verwaltete Identität authentifizieren 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 Azure Core-Bibliotheksprotokoll TokenCredential implementieren. Eine Anmeldeinformation stellt einen eindeutigen Authentifizierungsfluss zum Abrufen eines Zugriffstokens aus Microsoft Entra ID dar. Diese Anmeldeinformationen können mithilfe von ChainedTokenCredential in eine geordnete Abfolge von Authentifizierungsmechanismen verkettet werden, die durchlaufen werden sollen.

Der folgende Codeausschnitt registriert die AzureOpenAIClient für Abhängigkeitsinjektion und erstellt eine ChainedTokenCredential, indem ein ManagedIdentityCredential und ein AzureDeveloperCliCredential verwendet werden.

  • Die ManagedIdentityCredential wird für Azure Functions, Azure App Service und Azure Container Apps verwendet. Eine vom Benutzer zugewiesene verwaltete Identität wird mithilfe der bereitgestellten AZURE_CLIENT_ID für die ManagedIdentityCredential unterstützt.
  • Dies AzureDeveloperCliCredential wird für die lokale Entwicklung verwendet. Sie wurde zuvor festgelegt, basierend auf dem Microsoft Entra-Mandanten, 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 das registrierte 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, sind kleine Codeänderungen erforderlich, wenn sie Azure OpenAI-Endpunkte verwenden. 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. Eine Anmeldeinformation stellt einen eindeutigen Authentifizierungsfluss zum Abrufen eines Zugriffstokens aus Microsoft Entra ID dar. Diese Anmeldeinformationen können mithilfe eines ChainedTokenCredential verkettet werden, um eine sortierte Sequenz von Authentifizierungsmechanismen zu bilden, die versucht werden sollen. Auf diese Weise können Sie denselben Code sowohl in Produktions- als auch in lokalen Entwicklungsumgebungen bereitstellen.

Konfigurieren der Authentifizierung mit verwalteter Identität

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

Die erste Funktion, getChainedCredential(), gibt die ersten gültigen Azure-Anmeldeinformationen, die in der Kette gefunden werden, 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. Wenn ein Entwickler sich mit der Azure Developer CLI mit azd auth login anmeldet, wird sie eingerichtet.

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 Endpunkt Azure Cognitive Services bereitstellt.

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

Der vorangehende Codeausschnitt verwendet getBearerTokenProvider, um die Anmeldeinformationen und den Bereich zu übernehmen, und gibt dann ein Callback zurück, das ein Bearer-Token bereitstellt.

Erstellen authentifizierter Azure OpenAI-Client

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 korrekt abgegrenzten Tokens und erstellt den AzureOpenAI Client.

Streamen der Chatantwort mit Azure OpenAI

Verwenden Sie den folgenden Fastify-Routenhandler in ./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 Datenstromteile von Azure OpenAI zurückgegeben werden, werden sie an den Client gesendet.

Weitere Sicherheitsüberlegungen

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

Das Beispiel verfügt außerdem über eine GitHub Action, die die Infrastruktur-as-Code-Dateien durchsucht und einen Bericht mit erkannten Problemen generiert. Um die besten Praktiken in Ihrem eigenen Repository sicherzustellen, empfehlen wir, dass jeder, der Lösungen basierend auf unseren Vorlagen erstellt, sicherstellt, dass die Einstellung für die Geheimnisüberprüfung auf GitHub aktiviert ist.

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

Bereinigen von Ressourcen

Bereinigen 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.

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

azd down --purge

Bereinigen GitHub Codespaces

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

Wichtig

Weitere Informationen zu den Berechtigungen Ihres GitHub Kontos finden Sie unter GitHub Codespaces monatlich enthaltene Speicher- und Kernstunden.

  1. Melden Sie sich beim GitHub Codespaces-Dashboard an.

  2. Suchen Sie die aktuell laufenden Codespaces aus dem Repository Azure-Samples/openai-chat-app-quickstart GitHub.

  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 an.

  2. Suchen Sie die Codespaces, die aktuell aus dem Repository Azure-Samples/openai-chat-app-quickstart-dotnet GitHub ausgeführt werden.

  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 an.

  2. Suchen Sie Ihre derzeit laufenden Codespaces, die dem GitHub-Repository Azure-Samples/openai-chat-app-quickstart-javascript entstammen.

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

Hilfe erhalten

Wenn Ihr Problem nicht gelöst wurde, melden Sie Ihr Problem im Issues-Bereich des Repositorys.

Nächste Schritte

Wenn Ihr Problem nicht gelöst wurde, melden Sie Ihr Problem im Issues-Bereich des Repositorys.

Wenn Ihr Problem nicht gelöst wurde, melden Sie Ihr Problem im Issues-Bereich des Repositorys.