Delen via


Aan de slag met de bouwsteen beveiliging van Azure OpenAI

In dit artikel leest u hoe u het azure OpenAI-bouwsteenvoorbeeld voor beveiliging maakt en gebruikt. Het doel is om het inrichten van Azure OpenAI-accounts te demonstreren met op rollen gebaseerd toegangsbeheer (RBAC) voor sleutelloze verificatie (Microsoft Entra ID) voor Azure OpenAI. Dit voorbeeld van een chat-app bevat ook alle infrastructuur en configuratie die nodig zijn voor het inrichten van Azure OpenAI-resources en het implementeren van de app in Azure Container Apps met behulp van de Azure Developer CLI.

Door de instructies in dit artikel te volgen, gaat u het volgende doen:

  • Implementeer een beveiligde Azure Container-chat-app.
  • Beheerde identiteit gebruiken voor Toegang tot Azure OpenAI.
  • Chat met een Azure OpenAI Large Language Model (LLM) met behulp van de OpenAI-bibliotheek.

Zodra u dit artikel hebt voltooid, kunt u beginnen met het wijzigen van het nieuwe project met uw aangepaste code en gegevens.

Notitie

In dit artikel worden een of meer AI-app-sjablonen gebruikt als basis voor de voorbeelden en richtlijnen in het artikel. AI-app-sjablonen bieden u een goed onderhouden, eenvoudig te implementeren referentie-implementaties die u helpen een startpunt van hoge kwaliteit voor uw AI-apps te garanderen.

Architectuuroverzicht

In het volgende diagram ziet u een eenvoudige architectuur van de chat-app: Diagram met architectuur van client-naar back-end-app.

De chat-app wordt uitgevoerd als een Azure Container App. De app gebruikt beheerde identiteit via Microsoft Entra ID om te verifiëren met Azure OpenAI, in plaats van een API-sleutel. De chat-app maakt gebruik van Azure OpenAI om reacties op gebruikersberichten te genereren.

De toepassingsarchitectuur is afhankelijk van de volgende services en onderdelen:

  • Azure OpenAI vertegenwoordigt de AI-provider waarnaar we de query's van de gebruiker verzenden.
  • Azure Container Apps is de containeromgeving waar de toepassing wordt gehost.
  • Managed Identity helpt ons om beveiliging van de beste klasse te garanderen en elimineert de vereiste voor u als ontwikkelaar om een geheim veilig te beheren.
  • Bicep-bestanden voor het inrichten van Azure-resources, waaronder Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics en RBAC-rollen.
  • Microsoft AI Chat Protocol biedt gestandaardiseerde API-contracten voor AI-oplossingen en -talen. De chat-app voldoet aan het Microsoft AI Chat Protocol, waarmee de evaluaties-app kan worden uitgevoerd op elke chat-app die voldoet aan het protocol.
  • Een Python Quart die het openai pakket gebruikt om reacties op gebruikersberichten te genereren.
  • Een eenvoudige HTML-/JavaScript-front-end die reacties van de back-end streamt met behulp van JSON-lijnen via een ReadableStream.
  • Een TypeScript-web-app die gebruikmaakt van het openai npm-pakket om antwoorden op gebruikersberichten te genereren.

Kosten

In een poging om prijzen zo laag mogelijk te houden in dit voorbeeld, gebruiken de meeste resources een prijscategorie basis- of verbruiksprijzen. Wijzig het niveau van uw laag indien nodig op basis van het beoogde gebruik. Als u wilt stoppen met het maken van kosten, verwijdert u de resources wanneer u klaar bent met het artikel.

Meer informatie over kosten in de voorbeeldopslagplaats.

Meer informatie over kosten in de voorbeeldopslagplaats.

Meer informatie over kosten in de voorbeeldopslagplaats.

Vereisten

Er is een ontwikkelcontaineromgeving beschikbaar met alle afhankelijkheden die nodig zijn om dit artikel te voltooien. U kunt de ontwikkelcontainer uitvoeren in GitHub Codespaces (in een browser) of lokaal met behulp van Visual Studio Code.

Als u dit artikel wilt gebruiken, moet u voldoen aan de volgende vereisten:

  • Een Azure-abonnement - Een gratis abonnement maken

  • Azure-accountmachtigingen: uw Azure-account moet machtigingen hebben Microsoft.Authorization/roleAssignments/write , zoals beheerder van gebruikerstoegang of eigenaar.

  • GitHub-account

Open ontwikkelomgeving

Gebruik de volgende instructies om een vooraf geconfigureerde ontwikkelomgeving met alle vereiste afhankelijkheden te implementeren om dit artikel te voltooien.

GitHub Codespaces voert een ontwikkelcontainer uit die wordt beheerd door GitHub met Visual Studio Code voor het web als de gebruikersinterface. Voor de eenvoudigste ontwikkelomgeving gebruikt u GitHub Codespaces zodat u de juiste ontwikkelhulpprogramma's en afhankelijkheden vooraf hebt geïnstalleerd om dit artikel te voltooien.

Belangrijk

Alle GitHub-accounts kunnen Codespaces elke maand maximaal 60 uur gratis gebruiken met 2 kernexemplaren. Zie GitHub Codespaces maandelijks inbegrepen opslag- en kernuren voor meer informatie.

Gebruik de volgende stappen om een nieuwe GitHub Codespace te maken in de main vertakking van de Azure-Samples/openai-chat-app-quickstart GitHub-opslagplaats.

  1. Klik met de rechtermuisknop op de volgende knop en selecteer Koppeling openen in een nieuw venster. Met deze actie kunt u beschikken over de ontwikkelomgeving en de documentatie die ter beoordeling beschikbaar is.

  2. Controleer op de pagina Codespace maken en selecteer vervolgens Nieuwe coderuimte maken

    Schermopname van het bevestigingsscherm voordat u een nieuwe coderuimte maakt.

  3. Wacht tot de coderuimte is gestart. Dit opstartproces kan enkele minuten duren.

  4. Meld u aan bij Azure met de Azure Developer CLI in de terminal onderaan het scherm.

    azd auth login
    
  5. Kopieer de code uit de terminal en plak deze in een browser. Volg de instructies voor verificatie met uw Azure-account.

De resterende taken in dit artikel vinden plaats in de context van deze ontwikkelingscontainer.

Gebruik de volgende stappen om een nieuwe GitHub Codespace te maken in de main vertakking van de Azure-Samples/openai-chat-app-quickstart-dotnet GitHub-opslagplaats.

  1. Klik met de rechtermuisknop op de volgende knop en selecteer Koppeling openen in een nieuw venster. Met deze actie kunt u beschikken over de ontwikkelomgeving en de documentatie die ter beoordeling beschikbaar is.

  2. Controleer op de pagina Codespace maken en selecteer vervolgens Codespace maken

    Schermopname van het bevestigingsscherm voordat u een nieuwe coderuimte maakt.

  3. Wacht tot de coderuimte is gestart. Dit opstartproces kan enkele minuten duren.

  4. Meld u aan bij Azure met de Azure Developer CLI in de terminal onderaan het scherm.

    azd auth login
    
  5. Kopieer de code uit de terminal en plak deze in een browser. Volg de instructies voor verificatie met uw Azure-account.

De resterende taken in dit artikel vinden plaats in de context van deze ontwikkelingscontainer.

Gebruik de volgende stappen om een nieuwe GitHub Codespace te maken in de main vertakking van de Azure-Samples/openai-chat-app-quickstart-javascript GitHub-opslagplaats.

  1. Klik met de rechtermuisknop op de volgende knop en selecteer Koppeling openen in een nieuw venster. Met deze actie kunt u beschikken over de ontwikkelomgeving en de documentatie die ter beoordeling beschikbaar is.

Openen in GitHub Codespaces

  1. Controleer op de pagina Codespace maken en selecteer vervolgens Nieuwe coderuimte maken

    Schermopname van het bevestigingsscherm voordat u een nieuwe coderuimte maakt.

  2. Wacht tot de coderuimte is gestart. Dit opstartproces kan enkele minuten duren.

  3. Meld u aan bij Azure met de Azure Developer CLI in de terminal onderaan het scherm.

    azd auth login
    
  4. Kopieer de code uit de terminal en plak deze in een browser. Volg de instructies voor verificatie met uw Azure-account.

De resterende taken in dit artikel vinden plaats in de context van deze ontwikkelingscontainer.

Implementeren en uitvoeren

De voorbeeldopslagplaats bevat alle code- en configuratiebestanden voor de implementatie van de Chat-app in Azure. Met de volgende stappen doorloopt u het azure-implementatieproces van de voorbeeldchat-app.

Chat-app implementeren in Azure

Belangrijk

Voor Azure-resources die in deze sectie zijn gemaakt, worden directe kosten in rekening gebracht. Deze resources kunnen kosten genereren, zelfs als u de opdracht onderbreekt voordat deze volledig wordt uitgevoerd.

  1. Voer de volgende Azure Developer CLI-opdracht uit voor het inrichten van Azure-resources en de implementatie van broncode:

    azd up
    
  2. Gebruik de volgende tabel om de prompts te beantwoorden:

    Prompt Antwoord
    Omgevingsnaam Houd het kort en kleine letters. Voeg uw naam of alias toe. Bijvoorbeeld: secure-chat. Deze wordt gebruikt als onderdeel van de naam van de resourcegroep.
    Abonnement Selecteer het abonnement waarin u de resources wilt maken.
    Locatie (voor hosting) Selecteer een locatie bij u in de buurt in de lijst.
    Locatie voor het OpenAI-model Selecteer een locatie bij u in de buurt in de lijst. Als dezelfde locatie beschikbaar is als uw eerste locatie, selecteert u die.
  3. Wacht totdat de app is geïmplementeerd. De implementatie duurt meestal tussen 5 en 10 minuten.

Chat-app gebruiken om vragen te stellen aan het grote taalmodel

  1. In de terminal wordt een URL weergegeven na een geslaagde implementatie van de toepassing.

  2. Selecteer die URL die is gelabeld Deploying service web om de chattoepassing in een browser te openen.

    Schermopname van de chat-app in de browser met verschillende suggesties voor chatinvoer en het tekstvak voor chat om een vraag in te voeren.

  3. Voer in de browser een vraag in, zoals 'Waarom is beheerde identiteit beter dan sleutels?'.

  4. Het antwoord is afkomstig van Azure OpenAI en het resultaat wordt weergegeven.

De voorbeeldcode verkennen

Hoewel OpenAI en Azure OpenAI Service afhankelijk zijn van een algemene Python-clientbibliotheek, zijn kleine codewijzigingen nodig bij het gebruik van Azure OpenAI-eindpunten. Laten we eens kijken hoe dit voorbeeld sleutelloze verificatie configureert met Microsoft Entra ID en communiceert met Azure OpenAI.

Verificatie configureren met beheerde identiteit

In dit voorbeeld begint het bestand met het src\quartapp\chat.py configureren van sleutelloze verificatie.

In het volgende codefragment wordt de module azure.identity.aio gebruikt om een asynchrone Microsoft Entra-verificatiestroom te maken.

In het volgende codefragment wordt de AZURE_CLIENT_ID azd omgevingsvariabele gebruikt om een ManagedIdentityCredential-exemplaar te maken dat kan worden geverifieerd via door de gebruiker toegewezen beheerde identiteit.

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

Notitie

De azd resourceomgevingsvariabelen worden ingericht tijdens azd de implementatie van de app.

In het volgende codefragment wordt een resourceomgevingsvariabele gebruikt AZURE_TENANT_ID azd om een AzureDeveloperCliCredential-exemplaar te maken dat kan worden geverifieerd met de huidige Microsoft Entra-tenant.

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

De Azure Identity-clientbibliotheek biedt referenties: openbare klassen die het TokenCredential-protocol van de Azure Core-bibliotheek implementeren. Een referentie vertegenwoordigt een afzonderlijke verificatiestroom voor het verkrijgen van een toegangstoken van Microsoft Entra-id. Deze referenties kunnen worden gekoppeld om een geordende reeks verificatiemechanismen te vormen die moeten worden geprobeerd.

Het volgende codefragment maakt een ChainedTokenCredential met behulp van een ManagedIdentityCredential en een AzureDeveloperCliCredential:

  • Het ManagedIdentityCredential wordt gebruikt voor Azure Functions en Azure-app Service. Een door de gebruiker toegewezen beheerde identiteit wordt ondersteund door de client_id gebruiker door te geven aan ManagedIdentityCredential.
  • De AzureDeveloperCliCredential wordt gebruikt voor lokale ontwikkeling. Deze is eerder ingesteld op basis van de Microsoft Entra-tenant die moet worden gebruikt.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Tip

De volgorde van de referenties is belangrijk, omdat het eerste geldige Microsoft Entra-toegangstoken wordt gebruikt. Raadpleeg het artikel ChainedTokenCredential Overview voor meer informatie.

Met het volgende codefragment wordt de Azure OpenAI-tokenprovider opgehaald op basis van de geselecteerde Azure-referentie. Deze waarde wordt verkregen door de azure.identity.aio.get_bearer_token_provider aan te roepen met twee argumenten:

  • azure_credential: het ChainedTokenCredential exemplaar dat u eerder hebt gemaakt om de aanvraag te verifiëren.

  • https://cognitiveservices.azure.com/.default: Vereist een of meer bearer-tokenbereiken. In dit geval het Azure Cognitive Services-eindpunt .

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

De volgende regels controleren op de vereiste AZURE_OPENAI_ENDPOINT en AZURE_OPENAI_CHATGPT_DEPLOYMENT azd resourceomgevingsvariabelen die tijdens de implementatie van de app worden ingericht azd . Er wordt een fout gegenereerd als er geen waarde aanwezig is.

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")

Met dit fragment wordt de Azure OpenAI-client geïnitialiseerd, de api_versionparameters , azure_endpointen azure_ad_token_provider (client_args) ingesteld:

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,
)  

Met de volgende regel stelt u de implementatienaam van het Azure OpenAI-model in voor gebruik in API-aanroepen:

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

Notitie

OpenAI gebruikt het model trefwoordargument om op te geven welk model moet worden gebruikt. Azure OpenAI heeft het concept van unieke modelimplementaties. Wanneer u Azure OpenAI gebruikt, model moet u verwijzen naar de onderliggende implementatienaam die is gekozen tijdens de implementatie van het Azure OpenAI-model.

Zodra deze functie is voltooid, is de client correct geconfigureerd en klaar om te communiceren met Azure OpenAI-services.

Antwoordstroom met behulp van de OpenAI-client en het model

De response_stream chat-voltooiingsoproep wordt verwerkt in de route. Het volgende codefragment laat zien hoe openai_client en model worden gebruikt.

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,
    )

De voorbeeldcode verkennen

.NET-toepassingen zijn afhankelijk van de Azure.AI.OpenAI-clientbibliotheek om te communiceren met Azure OpenAI-services, die afhankelijk zijn van de OpenAI-bibliotheek . De voorbeeld-app configureert sleutelloze verificatie met behulp van Microsoft Entra ID om te communiceren met Azure OpenAI.

Verificatie en serviceregistratie configureren

In dit voorbeeld wordt sleutelloze verificatie geconfigureerd in het program.cs bestand. In het volgende codefragment wordt de AZURE_CLIENT_ID omgevingsvariabele gebruikt die is ingesteld om azd een ManagedIdentityCredential-exemplaar te maken dat kan worden geverifieerd via door de gebruiker toegewezen beheerde identiteit.

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

Notitie

De azd resourceomgevingsvariabelen worden ingericht tijdens azd de implementatie van de app.

In het volgende codefragment wordt de AZURE_TENANT_ID omgevingsvariabele gebruikt die is ingesteld om azd een AzureDeveloperCliCredential-exemplaar te maken dat lokaal kan worden geverifieerd met behulp van het account dat is azdaangemeld.

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

De Azure Identity-clientbibliotheek biedt referentieklassen waarmee het TokenCredential-protocol van de Azure Core-bibliotheek wordt geïmplementeerd. Een referentie vertegenwoordigt een afzonderlijke verificatiestroom voor het verkrijgen van een toegangstoken van Microsoft Entra-id. Deze referenties kunnen worden gekoppeld met behulp van ChainedTokenCredential een geordende reeks verificatiemechanismen die moeten worden geprobeerd.

Het volgende codefragment registreert de AzureOpenAIClient voor afhankelijkheidsinjectie en maakt een ChainedTokenCredential met een ManagedIdentityCredential en een AzureDeveloperCliCredential:

  • Het ManagedIdentityCredential wordt gebruikt voor Azure Functions en Azure-app Service. Een door de gebruiker toegewezen beheerde identiteit wordt ondersteund met behulp van de AZURE_CLIENT_ID identiteit die aan de ManagedIdentityCredential.
  • De AzureDeveloperCliCredential wordt gebruikt voor lokale ontwikkeling. Deze is eerder ingesteld op basis van de Microsoft Entra-tenant die moet worden gebruikt.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Tip

De volgorde van de referenties is belangrijk, omdat het eerste geldige Microsoft Entra-toegangstoken wordt gebruikt. Raadpleeg het artikel ChainedTokenCredential Overview voor meer informatie.

Chatvoltooien ophalen met behulp van de Azure OpenAI-client

De Blazor-web-app injecteert de geregistreerde AzureOpenAIClient gegevens boven aan het Home.Razor onderdeel:

@inject AzureOpenAIClient azureOpenAIClient

Wanneer de gebruiker het formulier verzendt, wordt de AzureOpenAIClient prompt naar het OpenAI-model verzonden om een voltooiing te genereren:

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));

De voorbeeldcode verkennen

Hoewel OpenAI en De Azure OpenAI-service afhankelijk zijn van een openai (algemene JavaScript-clientbibliotheek), zijn kleine codewijzigingen nodig bij het gebruik van Azure OpenAI-eindpunten. Laten we eens kijken hoe dit voorbeeld sleutelloze verificatie configureert met Microsoft Entra ID en communiceert met Azure OpenAI.

Sleutelloze verificatie voor elke omgeving

De Azure Identity-clientbibliotheek biedt referentieklassen waarmee het TokenCredential-protocol van de Azure Core-bibliotheek wordt geïmplementeerd. Een referentie vertegenwoordigt een afzonderlijke verificatiestroom voor het verkrijgen van een toegangstoken van Microsoft Entra-id. Deze referenties kunnen worden gekoppeld met behulp van ChainedTokenCredential een geordende reeks verificatiemechanismen die moeten worden geprobeerd. Hiermee kunt u dezelfde code implementeren in zowel productie- als lokale ontwikkelomgevingen.

Diagram met de twee referenties in de stroom waarin de beheerde identiteit eerst wordt geprobeerd, waarna de standaard Azure-referentie wordt geprobeerd.

Verificatie configureren met beheerde identiteit

In dit voorbeeld biedt de ./src/azure-authentication.ts functie verschillende functies voor sleutelloze verificatie voor Azure OpenAI.

De eerste functie, getChainedCredential()retourneert de eerste geldige Azure-referentie die in de keten is gevonden.

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 wordt eerst geprobeerd. Deze is ingesteld met de AZURE_CLIENT_ID omgevingsvariabele in de productieruntime en kan worden geverifieerd via door de gebruiker toegewezen beheerde identiteit.
  • AzureDeveloperCliCredential wordt een tweede poging uitgevoerd. Deze wordt ingesteld wanneer een ontwikkelinterface zich aanmeldt met Azure CLI az login.

Tip

De volgorde van de referenties is belangrijk, omdat het eerste geldige Microsoft Entra-toegangstoken wordt gebruikt. Raadpleeg het artikel ChainedTokenCredential Overview voor meer informatie.

Bearer-token ophalen voor OpenAI

De tweede functie ./src/azure-authentication.ts is getTokenProvider(), die een callback retourneert die een bearer-token biedt dat is gericht op het Azure Cognitive Services-eindpunt .

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

Het voorgaande codefragment gebruikt getBearerTokenProvider om de referentie en het bereik te nemen en retourneert vervolgens een callback die een bearer-token biedt.

Geverifieerde Azure OpenAI-client maken

De derde functie is ./src/azure-authentication.ts getOpenAiClient(), waarmee de Azure OpenAI-client wordt geretourneerd.

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);
    }
}

Deze code gebruikt de opties, inclusief het correct scoped token, en maakt de AzureOpenAI client

Chatantwoord streamen met Azure OpenAI

Gebruik de volgende Fastify-routehandler om ./src/openai-chat-api.ts een bericht naar Azure OpenAI te verzenden en het antwoord te 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()

}

De functie haalt het chatgesprek op, inclusief eventuele eerdere berichten, en verzendt deze naar Azure OpenAI. Wanneer de streamsegmenten worden geretourneerd vanuit Azure OpenAI, worden de segmenten naar de client verzonden.

Andere beveiligingsoverwegingen

In dit artikel ziet u hoe het voorbeeld wordt gebruikt ChainedTokenCreadential voor verificatie bij de Azure OpenAI-service.

Het voorbeeld bevat ook een GitHub-actie waarmee de bestanden met infrastructuur als code worden gescand en een rapport wordt gegenereerd met gedetecteerde problemen. Om ervoor te zorgen dat de aanbevolen procedures in uw eigen opslagplaats worden voortgezet, is het raadzaam dat iedereen die oplossingen maakt op basis van onze sjablonen, ervoor zorgt dat de instelling voor het scannen van gitHub-geheimen is ingeschakeld.

Overweeg andere beveiligingsmaatregelen, zoals:

Resources opschonen

Azure-resources opschonen

De Azure-resources die in dit artikel zijn gemaakt, worden gefactureerd voor uw Azure-abonnement. Als u deze resources in de toekomst niet meer nodig hebt, verwijdert u deze om te voorkomen dat er meer kosten in rekening worden gebracht.

Als u de Azure-resources wilt verwijderen en de broncode wilt verwijderen, voert u de volgende Azure Developer CLI-opdracht uit:

azd down --purge

GitHub Codespaces opschonen

Als u de GitHub Codespaces-omgeving verwijdert, zorgt u ervoor dat u de hoeveelheid gratis rechten per kernuren kunt maximaliseren die u voor uw account krijgt.

Belangrijk

Zie GitHub Codespaces maandelijks inbegrepen opslag- en kernuren voor meer informatie over de rechten van uw GitHub-account.

  1. Meld u aan bij het GitHub Codespaces-dashboard (https://github.com/codespaces).

  2. Zoek uw momenteel uitgevoerde Codespaces die afkomstig zijn uit de Azure-Samples/openai-chat-app-quickstart GitHub-opslagplaats.

  3. Open het contextmenu voor de coderuimte en selecteer Vervolgens Verwijderen.

  1. Meld u aan bij het GitHub Codespaces-dashboard (https://github.com/codespaces).

  2. Zoek uw momenteel uitgevoerde Codespaces die afkomstig zijn uit de Azure-Samples/openai-chat-app-quickstart-dotnet GitHub-opslagplaats.

  3. Open het contextmenu voor de coderuimte en selecteer Vervolgens Verwijderen.

  1. Meld u aan bij het GitHub Codespaces-dashboard (https://github.com/codespaces).

  2. Zoek uw momenteel uitgevoerde Codespaces die afkomstig zijn uit de Azure-Samples/openai-chat-app-quickstart-javascript GitHub-opslagplaats.

  3. Open het contextmenu voor de coderuimte en selecteer Vervolgens Verwijderen.

Hulp vragen

Als uw probleem niet is opgelost, meldt u het probleem aan bij de problemen van de opslagplaats.

Volgende stappen

Als uw probleem niet is opgelost, meldt u het probleem aan bij de problemen van de opslagplaats.

Als uw probleem niet is opgelost, meldt u het probleem aan bij de problemen van de opslagplaats.