Rozpocznij korzystanie z bloku zabezpieczeń Azure OpenAI

W tym artykule przedstawiono sposób tworzenia i używania przykładowego bloku konstrukcyjnego zabezpieczeń Azure OpenAI. Celem jest zademonstrowanie aprowizacji konta Azure OpenAI z użyciem Microsoft Entra ID do uwierzytelniania bez kluczy i przy użyciu kontroli dostępu opartej na rolach (RBAC) dla usługi Azure OpenAI. Ten przykład aplikacji do czatu zawiera również całą infrastrukturę i konfigurację wymaganą do aprowizacji zasobów Azure OpenAI i wdrażania aplikacji na Azure Container Apps przy użyciu Azure Developer CLI.

Postępując zgodnie z instrukcjami w tym artykule, wykonasz następujące czynności:

  • Wdróż bezpieczną aplikację do czatu na Azure Container Apps.
  • Użyj tożsamości zarządzanej na potrzeby dostępu Azure OpenAI.
  • Porozmawiaj z Azure OpenAI Large Language Model (LLM) przy użyciu biblioteki OpenAI.

Po ukończeniu tego artykułu możesz rozpocząć modyfikowanie nowego projektu przy użyciu niestandardowego kodu i danych.

Uwaga

W tym artykule użyto co najmniej jednego szablonu aplikacji sztucznej inteligencji jako podstawy przykładów i wskazówek w artykule. Szablony aplikacji sztucznej inteligencji zapewniają dobrze utrzymywane, łatwe w wdrażaniu implementacje referencyjne, które pomagają zapewnić wysokiej jakości punkt wyjścia dla aplikacji sztucznej inteligencji.

Omówienie architektury

Prosta architektura aplikacji do czatu jest pokazana na poniższym diagramie: Diagram przedstawiający architekturę z klienta do aplikacji zaplecza.

Aplikacja do czatu działa jako aplikacja kontenera Azure. Aplikacja używa tożsamości zarządzanej za pośrednictwem Microsoft Entra ID do uwierzytelniania z Azure OpenAI zamiast klucza API. Aplikacja do czatu używa Azure OpenAI do generowania odpowiedzi na wiadomości użytkowników.

Architektura aplikacji opiera się na następujących usługach i składnikach:

  • Azure OpenAI reprezentuje dostawcę sztucznej inteligencji, do którego wysyłamy zapytania użytkownika.
  • Azure Container Apps to środowisko kontenera, w którym jest hostowana aplikacja.
  • Tożsamość zarządzana pomaga nam zapewnić najlepsze w swojej klasie zabezpieczenia i eliminuje konieczność bezpiecznego zarządzania tajnym kluczem przez Ciebie jako programistę.
  • Pliki Bicep do udostępniania zasobów Azure, w tym Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics oraz ról RBAC.
  • Aplikacja Python Quart korzystająca z pakietu openai i interfejsu API Responses API do generowania odpowiedzi na komunikaty użytkowników.
  • Podstawowy interfejs frontendowy HTML/JavaScript, który przesyła strumieniowo odpowiedzi z zaplecza przy użyciu linii JSON za pomocą ReadableStream.
  • Aplikacja internetowa platformy Blazor, która używa Azure. AI. OpenAI pakiet NuGet w celu wygenerowania odpowiedzi na komunikaty użytkownika.
  • Aplikacja internetowa TypeScript, która używa pakietu npm openAI do generowania odpowiedzi na komunikaty użytkowników.

Koszt

W tym przykładzie, próbując zachować możliwie niskie ceny, większość zasobów korzysta z poziomu cenowego podstawowy lub zużycia. Zmień poziom zgodnie z potrzebami w zależności od zamierzonego użycia. Aby zatrzymać naliczanie opłat, usuń zasoby po zakończeniu pracy z artykułem.

Dowiedz się więcej o koszcie w przykładowym repozytorium.

Dowiedz się więcej o koszcie w repozytorium przykładowym.

Dowiedz się więcej o koszcie w przykładowym repozytorium.

Wymagania wstępne

Środowisko kontenera deweloperskiego jest dostępne ze wszystkimi zależnościami wymaganymi do ukończenia tego artykułu. Kontener deweloperów można uruchomić w usłudze GitHub Codespaces (w przeglądarce) lub lokalnie przy użyciu Visual Studio Code.

Aby użyć tego artykułu, należy spełnić następujące wymagania wstępne:

Otwieranie środowiska projektowego

Skorzystaj z poniższych instrukcji, aby wdrożyć wstępnie skonfigurowane środowisko programistyczne zawierające wszystkie wymagane zależności, aby ukończyć ten artykuł.

GitHub Codespaces uruchamia kontener deweloperów zarządzany przez GitHub za pomocą Visual Studio Code dla sieci Web jako interfejsu użytkownika. W przypadku najprostszego środowiska programistycznego użyj GitHub Codespaces, aby mieć wstępnie zainstalowane odpowiednie narzędzia deweloperskie i zależności, aby ukończyć ten artykuł.

Ważne

Wszystkie konta GitHub mogą korzystać z usługi Codespaces przez maksymalnie 60 godzin bezpłatnych każdego miesiąca z 2 podstawowymi wystąpieniami. Aby uzyskać więcej informacji, zobacz miesięczne wliczone w abonament godziny przechowywania i rdzeni GitHub Codespaces.

Wykonaj poniższe kroki, aby utworzyć nową GitHub Codespace w gałęzi main repozytorium Azure-Samples/openai-chat-app-quickstart GitHub.

  1. Kliknij prawym przyciskiem myszy poniższy przycisk i wybierz polecenie Otwórz link w nowym oknie. Ta akcja umożliwia zapoznanie się ze środowiskiem deweloperów i dokumentacją.

  2. Na stronie Tworzenia przestrzeni kodu przejrzyj, a następnie wybierz Utwórz nową przestrzeń kodu

    Zrzut ekranu przedstawiający ekran potwierdzenia przed utworzeniem nowej przestrzeni kodu.

  3. Poczekaj na uruchomienie przestrzeni roboczej dla kodu. Ten proces uruchamiania może potrwać kilka minut.

  4. Zaloguj się do Azure przy użyciu Azure Developer CLI w terminalu u dołu ekranu.

    azd auth login
    
  5. Skopiuj kod z terminalu, a następnie wklej go w przeglądarce. Postępuj zgodnie z instrukcjami, aby uwierzytelnić się przy użyciu konta Azure.

Pozostałe zadania w tym artykule mają miejsce w kontekście tego kontenera deweloperskiego.

Wykonaj poniższe kroki, aby utworzyć nową GitHub Codespace w gałęzi main repozytorium Azure-Samples/openai-chat-app-quickstart-dotnet GitHub.

  1. Kliknij prawym przyciskiem myszy poniższy przycisk i wybierz polecenie Otwórz link w nowym oknie. Ta akcja umożliwia zapoznanie się ze środowiskiem deweloperów i dokumentacją.

  2. Na stronie Tworzenie przestrzeni kodu przejrzyj, a następnie wybierz Utwórz przestrzeń kodu.

    Zrzut ekranu przedstawiający ekran potwierdzenia przed utworzeniem nowej przestrzeni kodu.

  3. Poczekaj na uruchomienie przestrzeni roboczej dla kodu. Ten proces uruchamiania może potrwać kilka minut.

  4. Zaloguj się do Azure przy użyciu Azure Developer CLI w terminalu na dole ekranu.

    azd auth login
    
  5. Skopiuj kod z terminalu, a następnie wklej go w przeglądarce. Postępuj zgodnie z instrukcjami, aby uwierzytelnić się przy użyciu konta Azure.

Pozostałe zadania w tym artykule mają miejsce w kontekście tego kontenera deweloperskiego.

Wykonaj poniższe kroki, aby utworzyć nową GitHub Codespace w gałęzi main repozytorium Azure-Samples/openai-chat-app-quickstart-javascript GitHub.

  1. Kliknij prawym przyciskiem myszy poniższy przycisk i wybierz polecenie Otwórz link w nowym oknie. Ta akcja umożliwia zapoznanie się ze środowiskiem deweloperów i dokumentacją.

Otwórz GitHub Codespaces

  1. Na stronie Tworzenia przestrzeni kodu przejrzyj, a następnie wybierz Utwórz nową przestrzeń kodu

    Zrzut ekranu przedstawiający ekran potwierdzenia przed utworzeniem nowej przestrzeni kodu.

  2. Poczekaj na uruchomienie przestrzeni roboczej dla kodu. Ten proces uruchamiania może potrwać kilka minut.

  3. Zaloguj się do Azure przy użyciu Azure Developer CLI w terminalu na dole ekranu.

    azd auth login
    
  4. Skopiuj kod z terminalu, a następnie wklej go w przeglądarce. Postępuj zgodnie z instrukcjami, aby uwierzytelnić się przy użyciu konta Azure.

Pozostałe zadania w tym artykule mają miejsce w kontekście tego kontenera deweloperskiego.

Wdrażanie i uruchamianie

Przykładowe repozytorium zawiera wszystkie pliki kodu oraz konfiguracji aplikacji czatu na Azure wdrożenia. W poniższych krokach opisano proces wdrażania przykładowej aplikacji do czatu na platformie Azure.

Wdrażanie aplikacji do czatu w Azure

Ważne

Zasoby Azure, utworzone w tej sekcji, generują natychmiastowe koszty. Te zasoby mogą naliczać koszty, nawet jeśli przerywasz wykonywanie polecenia, zanim zostanie ono w pełni wykonane.

  1. Uruchom następujące polecenie interfejsu wiersza polecenia Azure dla deweloperów w celu aprowizacji zasobów Azure i wdrożenia kodu źródłowego:

    azd up
    
  2. Użyj poniższej tabeli, aby odpowiedzieć na pytania.

    Komunikat Odpowiedź
    Nazwa środowiska Zachowaj to krótkie i pisane małymi literami. Dodaj swoją nazwę lub alias. Na przykład secure-chat. Jest ona używana jako część nazwy grupy zasobów.
    Subskrypcja Wybierz subskrypcję, w ramach której chcesz utworzyć zasoby.
    Lokalizacja (na potrzeby hostingu) Wybierz lokalizację w pobliżu z listy.
    Lokalizacja modelu OpenAI Wybierz lokalizację w pobliżu z listy. Jeśli ta sama lokalizacja jest dostępna jako pierwsza lokalizacja, wybierz tę lokalizację.
  3. Poczekaj na wdrożenie aplikacji. Wdrożenie zwykle trwa od 5 do 10 minut.

Używanie aplikacji do czatu w celu zadawania pytań do modelu dużego języka

  1. W terminalu zostanie wyświetlony adres URL po pomyślnym wdrożeniu aplikacji.

  2. Wybierz ten adres URL oznaczony Deploying service web etykietą, aby otworzyć aplikację czatu w przeglądarce.

    Zrzut ekranu przedstawiający aplikację czatu w przeglądarce z kilkoma sugestiami dotyczącymi wprowadzania danych wejściowych na czacie i polem tekstowym czatu w celu wprowadzenia pytania.

  3. W przeglądarce wprowadź pytanie, takie jak "Dlaczego tożsamość zarządzana jest lepsza niż klucze?".

  4. Odpowiedź pochodzi z Azure OpenAI i zostanie wyświetlony wynik.

Eksplorowanie przykładowego kodu

Podczas gdy interfejs OpenAI i Azure OpenAI Service polegają na wspólnej bibliotece klienta Python, podczas korzystania z endpointów Azure OpenAI potrzebne są niewielkie zmiany w kodzie. Zobaczmy, jak ten przykład konfiguruje uwierzytelnianie bez klucza za pomocą Microsoft Entra ID i komunikuje się z Azure OpenAI.

Konfigurowanie uwierzytelniania przy użyciu tożsamości zarządzanej

W tym przykładzie src/quartapp/chat.py plik rozpoczyna się od konfigurowania uwierzytelniania bez klucza.

Poniższy fragment kodu używa modułu azure.identity.aio w celu utworzenia asynchronicznego przepływu uwierzytelniania Microsoft Entra.

Poniższy fragment kodu używa AZURE_CLIENT_IDazd zmiennej środowiskowej do utworzenia wystąpienia ManagedIdentityCredential umożliwiającego uwierzytelnianie za pośrednictwem tożsamości zarządzanej przypisanej przez użytkownika.

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

Uwaga

Zmienne środowiskowe azd są udostępniane w trakcie azd wdrażania aplikacji.

Poniższy fragment kodu używa zmiennej środowiskowej zasobów AZURE_TENANT_IDazd, aby utworzyć wystąpienie AzureDeveloperCliCredential, umożliwiające uwierzytelnianie przy użyciu bieżącej dzierżawy Microsoft Entra.

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

Biblioteka klienta Azure Identity udostępnia dane uwierzytelniające — publiczne klasy implementujące protokół TokenCredential biblioteki Azure Core. Poświadczenie reprezentuje odrębny przepływ uwierzytelniania na potrzeby uzyskiwania tokenu dostępu z Microsoft Entra ID. Te poświadczenia można połączyć w łańcuch, aby utworzyć uporządkowaną sekwencję mechanizmów uwierzytelniania, których należy użyć.

Poniższy fragment kodu tworzy ChainedTokenCredential za pomocą ManagedIdentityCredential oraz AzureDeveloperCliCredential.

  • ManagedIdentityCredential jest używany do Azure Functions, Azure App Service i Azure Container Apps. Tożsamość zarządzana przypisana przez użytkownika jest obsługiwana przez przekazanie elementu client_id do ManagedIdentityCredential.
  • Element AzureDeveloperCliCredential jest używany do programowania lokalnego. Została ona wcześniej ustawiona na podstawie tenant Microsoft Entra do wykorzystania.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Wskazówka

Kolejność poświadczeń jest ważna, ponieważ jest używany pierwszy prawidłowy token dostępu Microsoft Entra. Aby uzyskać więcej informacji, zapoznaj się z artykułem o ChainedTokenCredential Overview.

Poniższy fragment kodu pobiera dostawcę tokenów Azure OpenAI na podstawie wybranego poświadczenia Azure. Ta wartość jest uzyskiwana przez wywołanie azure.identity.aio.get_bearer_token_provider z dwoma argumentami:

  • azure_credential: wystąpienie ChainedTokenCredential utworzone wcześniej w celu uwierzytelnienia żądania.

  • https://cognitiveservices.azure.com/.default: Wymagany co najmniej jeden zakres tokenu elementu nośnego. W tym przypadku punkt końcowy usług Azure Cognitive Services.

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

Poniższe wiersze sprawdzają wymagane AZURE_OPENAI_ENDPOINT i AZURE_OPENAI_CHAT_DEPLOYMENT, dwie zmienne środowiskowe ustawione podczas udostępniania azd. Błąd zgłaszany jest, jeśli wartość nie jest obecna.

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

Ten fragment kodu inicjuje klienta OpenAI względem punktu końcowego Azure , przekazując dostawcę tokenu jako . Z punktu końcowego wersji 1 nie jest wymagany api_version.

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

Poniższy wiersz ustawia nazwę wdrożenia modelu openAI Azure do użycia w wywołaniach interfejsu API:

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

Uwaga

Interfejs OpenAI używa argumentu kluczowego model , aby określić, który model ma być używany. Azure OpenAI ma koncepcję wdrożeń modeli unique. W przypadku używania Azure OpenAI model powinien odwoływać się do nazwy wdrożenia wybranej podczas wdrażania modelu Azure OpenAI.

Po zakończeniu tej funkcji klient jest prawidłowo skonfigurowany i gotowy do interakcji z usługami Azure OpenAI.

Strumieniowe przesyłanie odpowiedzi przy użyciu API OpenAI Responses

Element response_stream obsługuje strumieniowe wywołanie API odpowiedzi w trasie. Fronton wysyła bezpośrednio elementy uformowane jako odpowiedzi input, a zaplecze przekazuje je do responses.stream():

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"

Poznawanie przykładowego kodu

.NET aplikacje korzystają z biblioteki klienta Azure.AI.OpenAI do komunikowania się z usługami Azure OpenAI, która ma zależność od biblioteki OpenAI. Przykładowa aplikacja konfiguruje uwierzytelnianie bez klucza przy użyciu Microsoft Entra ID do komunikowania się z usługą Azure OpenAI.

Konfigurowanie uwierzytelniania i rejestracji usługi

W tym przykładzie uwierzytelnianie bez klucza jest skonfigurowane w pliku program.cs. Poniższy fragment kodu używa zmiennej środowiskowej AZURE_CLIENT_ID, ustawionej przez azd, aby utworzyć wystąpienie ManagedIdentityCredential pozwalające na uwierzytelnianie za pomocą przypisanej przez użytkownika tożsamości zarządzanej.

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

Uwaga

Zmienne środowiskowe azd są udostępniane w trakcie azd wdrażania aplikacji.

Poniższy fragment kodu używa zmiennej środowiskowej ustawionej przez AZURE_TENANT_ID na azd w celu utworzenia wystąpienia AzureDeveloperCliCredential, które może uwierzytelniać się lokalnie przy użyciu konta zalogowanego do azd.

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

Biblioteka klienta Azure Identity udostępnia klasy poświadczeń, które implementują protokół TokenCredential biblioteki Azure Core. Poświadczenie reprezentuje odrębny przepływ uwierzytelniania na potrzeby uzyskiwania tokenu dostępu z Microsoft Entra ID. Te poświadczenia można połączyć w łańcuch za pomocą polecenia ChainedTokenCredential, aby utworzyć uporządkowaną sekwencję mechanizmów uwierzytelniania do przetestowania.

Poniższy fragment kodu rejestruje AzureOpenAIClient do iniekcji zależności i tworzy ChainedTokenCredential przy użyciu ManagedIdentityCredential i AzureDeveloperCliCredential.

  • ManagedIdentityCredential jest używany do Azure Functions, Azure App Service i Azure Container Apps. Tożsamość zarządzana przypisana przez użytkownika jest obsługiwana za pomocą AZURE_CLIENT_ID podanego do ManagedIdentityCredential.
  • Element AzureDeveloperCliCredential jest używany do programowania lokalnego. Ustawiono to wcześniej na podstawie dzierżawcy Microsoft Entra, którego należy użyć.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Wskazówka

Kolejność poświadczeń jest ważna, ponieważ jest używany pierwszy prawidłowy token dostępu Microsoft Entra. Aby uzyskać więcej informacji, zapoznaj się z artykułem o ChainedTokenCredential Overview.

Uzyskiwanie ukończenia czatu przy użyciu klienta Azure OpenAI

Aplikacja internetowa Blazor wstrzykuje zarejestrowany AzureOpenAIClient na górze składnika Home.Razor.

@inject AzureOpenAIClient azureOpenAIClient

Gdy użytkownik przesyła formularz, AzureOpenAIClient wysyła żądanie do modelu OpenAI, aby wygenerować odpowiedź.

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

Poznawanie przykładowego kodu

Podczas gdy interfejs OpenAI i Azure OpenAI Service polegają na openai (typowej biblioteki klienta JavaScript), podczas korzystania z punktów końcowych Azure OpenAI są wymagane niewielkie zmiany kodu. Zobaczmy, jak ten przykład konfiguruje uwierzytelnianie bez klucza za pomocą Microsoft Entra ID i komunikuje się z Azure OpenAI.

Uwierzytelnianie bez klucza dla każdego środowiska

Biblioteka klienta Azure Identity udostępnia klasy poświadczeń, które implementują protokół Azure Core biblioteki TokenCredential. Poświadczenie reprezentuje odrębny przepływ uwierzytelniania na potrzeby uzyskiwania tokenu dostępu z Microsoft Entra ID. Te poświadczenia można połączyć za pomocą ChainedTokenCredential, tworząc uporządkowaną sekwencję mechanizmów uwierzytelniania do wypróbowania. Dzięki temu można wdrożyć ten sam kod zarówno w środowiskach produkcyjnych, jak i lokalnych.

Konfigurowanie uwierzytelniania przy użyciu tożsamości zarządzanej

W tym przykładzie ./src/azure-authentication.ts udostępnia kilka funkcji zapewniających uwierzytelnianie bez klucza Azure OpenAI.

Pierwsza funkcja, getChainedCredential(), zwraca pierwsze prawidłowe poświadczenie Azure znalezione w łańcuchu.

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
          })
    );
}
  • Najpierw próbowano użyć ManagedIdentityCredential. Jest ona skonfigurowana przy użyciu zmiennej środowiskowej AZURE_CLIENT_ID w środowisku produkcyjnym i może uwierzytelniać się za pomocą tożsamości zarządzanej przypisanej przez użytkownika.
  • AzureDeveloperCliCredential jest próbą drugą. Jest konfigurowany, gdy deweloper loguje się za pomocą Azure Developer CLI przy użyciu azd auth login.

Wskazówka

Kolejność poświadczeń jest ważna, ponieważ jest używany pierwszy prawidłowy token dostępu Microsoft Entra. Aby uzyskać więcej informacji, zapoznaj się z artykułem o ChainedTokenCredential Overview.

Uzyskiwanie tokenu typu bearer dla OpenAI

Druga funkcja w ./src/azure-authentication.ts to getTokenProvider(), która zwraca wywołanie zwrotne udostępniające token uwierzytelniający przypisany do punktu końcowego Azure Cognitive Services.

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

Powyższy fragment kodu używa getBearerTokenProvider do pobrania poświadczeń i zakresu, a następnie zwraca wywołanie zwrotne, które udostępnia token nosiciela.

Tworzenie uwierzytelnionego klienta Azure OpenAI

Trzecia funkcja w ./src/azure-authentication.ts jest getOpenAiClient(), która zwraca klienta Azure OpenAI.

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

Ten kod pobiera opcje, w tym prawidłowy token o określonym zakresie, i tworzy klienta AzureOpenAI.

Przesyłanie odpowiedzi na czat w trybie strumieniowym za pomocą Azure OpenAI

Użyj następującego kontrolera trasy Fastify w ./src/openai-chat-api.ts, aby wysłać komunikat do Azure OpenAI i strumieniowo przesyłać odpowiedź.

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

}

Funkcja pobiera konwersację czatu, w tym wszystkie poprzednie wiadomości, i wysyła je do Azure OpenAI. Gdy fragmenty strumienia są zwracane z Azure OpenAI, zostają przesłane do klienta.

Inne zagadnienia dotyczące zabezpieczeń

W tym artykule pokazano, jak przykład używa ChainedTokenCredential do uwierzytelniania w usłudze Azure OpenAI.

Przykład zawiera również GitHub Action, który skanuje pliki infrastruktury-jako-kodu i generuje raport zawierający wykryte problemy. Aby zapewnić utrzymanie najlepszych praktyk we własnym repozytorium, zalecamy włączenie ustawienia skanowania tajnych danych GitHub każdej osobie tworzącej rozwiązania na podstawie naszych szablonów.

Rozważ inne środki zabezpieczeń, takie jak:

Czyszczenie zasobów

Czyszczenie zasobów Azure

Za zasoby Azure utworzone w tym artykule są naliczane opłaty za subskrypcję Azure. Jeśli nie spodziewasz się, że te zasoby będą potrzebne w przyszłości, usuń je, aby uniknąć naliczania dodatkowych opłat.

Aby usunąć zasoby Azure i usunąć kod źródłowy, uruchom następujące polecenie interfejsu wiersza polecenia dewelopera Azure:

azd down --purge

Wyczyść GitHub Codespaces

Usunięcie środowiska GitHub Codespaces gwarantuje, że możesz zmaksymalizować ilość bezpłatnych godzin na godziny, które otrzymasz dla twojego konta.

Ważne

Aby uzyskać więcej informacji na temat uprawnień konta GitHub, zobacz GitHub Codespaces miesięczne zawarte godziny zapasowe i rdzeniowe.

  1. Zaloguj się do pulpitu nawigacyjnego GitHub Codespaces.

  2. Znajdź aktualnie uruchomione usługi Codespaces pochodzące z repozytorium Azure-Samples/openai-chat-app-quickstart GitHub.

  3. Otwórz menu kontekstowe dla przestrzeni kodu, a następnie wybierz pozycję Usuń.

  1. Zaloguj się do pulpitu nawigacyjnego GitHub Codespaces.

  2. Znajdź aktualnie uruchomione usługi Codespaces pochodzące z repozytorium Azure-Samples/openai-chat-app-quickstart-dotnet GitHub.

  3. Otwórz menu kontekstowe dla przestrzeni kodu, a następnie wybierz pozycję Usuń.

  1. Zaloguj się do pulpitu nawigacyjnego GitHub Codespaces.

  2. Znajdź aktualnie uruchomione usługi Codespaces pochodzące z repozytorium Azure-Samples/openai-chat-app-quickstart-javascript GitHub.

  3. Otwórz menu kontekstowe dla przestrzeni kodu, a następnie wybierz pozycję Usuń.

Uzyskaj pomoc

Jeśli problem nie został rozwiązany, zgłoś swój problem do sekcji Issues w repozytorium.

Następne kroki

Jeśli problem nie został rozwiązany, zgłoś swój problem do sekcji Issues w repozytorium.

Jeśli problem nie został rozwiązany, zgłoś swój problem do sekcji Issues w repozytorium.