Udostępnij za pośrednictwem


Rozpoczynanie pracy z blokiem konstrukcyjnym zabezpieczeń usługi Azure OpenAI

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

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

  • Wdróż bezpieczną aplikację czatu kontenera platformy Azure.
  • Użyj tożsamości zarządzanej na potrzeby dostępu azure OpenAI.
  • Porozmawiaj z usługą 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 platformy Azure. Aplikacja używa tożsamości zarządzanej za pośrednictwem identyfikatora Entra firmy Microsoft do uwierzytelniania za pomocą usługi Azure OpenAI zamiast klucza interfejsu API. Aplikacja do czatu używa usługi Azure OpenAI do generowania odpowiedzi na komunikaty użytkowników.

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

  • Usługa Azure OpenAI reprezentuje dostawcę sztucznej inteligencji, do którego wysyłamy zapytania użytkownika.
  • Usługa Azure Container Apps to środowisko kontenera, w którym jest hostowana aplikacja.
  • Tożsamość zarządzana pomaga nam zapewnić najlepsze zabezpieczenia w klasie i wyeliminować wymaganie, aby jako deweloper bezpiecznie zarządzać wpisem tajnym.
  • Pliki Bicep do aprowizowania zasobów platformy Azure, w tym azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics i ról RBAC.
  • Protokół Microsoft AI Chat Protocol udostępnia standardowe kontrakty interfejsu API w rozwiązaniach i językach sztucznej inteligencji. Aplikacja do czatu jest zgodna z protokołem Microsoft AI Chat Protocol, który umożliwia uruchamianie aplikacji ewaluacyjnej względem dowolnej aplikacji czatu zgodnej z protokołem.
  • Kwart języka Python, który używa openai pakietu do generowania odpowiedzi na komunikaty użytkownika.
  • Podstawowy fronton HTML/JavaScript, który przesyła strumieniowo odpowiedzi z zaplecza przy użyciu linii JSON za pośrednictwem elementu ReadableStream.
  • Aplikacja internetowa TypeScript, która używa pakietu npm openai do generowania odpowiedzi na komunikaty użytkowników.

Koszt

Próbując zachować możliwie niskie ceny w tym przykładzie, większość zasobów korzysta z warstwy cenowej podstawowa lub zużycie. Zmień poziom warstwy zgodnie z potrzebami na podstawie zamierzonego użycia. Aby zatrzymać naliczanie opłat, usuń zasoby po zakończeniu pracy z artykułem.

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

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

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

Wymagania wstępne

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

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

  • Subskrypcja platformy Azure — utwórz bezpłatnie

  • Uprawnienia konta platformy Azure — Twoje konto platformy Azure musi mieć Microsoft.Authorization/roleAssignments/write uprawnienia, takie jak administrator dostępu użytkowników lub właściciel.

  • Konto usługi GitHub

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

Usługa GitHub Codespaces uruchamia kontener deweloperski zarządzany przez usługę GitHub za pomocą programu Visual Studio Code dla sieci Web jako interfejsu użytkownika. W przypadku najprostszego środowiska programistycznego użyj usługi GitHub Codespaces, aby wstępnie zainstalować odpowiednie narzędzia deweloperskie i zależności, aby ukończyć ten artykuł.

Ważne

Wszystkie konta usługi 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 GitHub Codespaces monthly included storage and core hours (Miesięczne miejsca do magazynowania i godzin rdzeni usługi GitHub Codespaces).

Wykonaj poniższe kroki, aby utworzyć nową usługę GitHub Codespace w main gałęzi Azure-Samples/openai-chat-app-quickstart repozytorium 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 pozycję Utwórz nową przestrzeń kodu

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

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

  4. Zaloguj się na platformie Azure przy użyciu interfejsu wiersza polecenia dla deweloperów platformy Azure w terminalu w dolnej części 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 platformy Azure.

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

Wykonaj poniższe kroki, aby utworzyć nową usługę GitHub Codespace w main gałęzi Azure-Samples/openai-chat-app-quickstart-dotnet repozytorium 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 pozycję Utwórz przestrzeń kodu

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

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

  4. Zaloguj się na platformie Azure przy użyciu interfejsu wiersza polecenia dla deweloperów platformy Azure w terminalu w dolnej części 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 platformy Azure.

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

Wykonaj poniższe kroki, aby utworzyć nową usługę GitHub Codespace w main gałęzi Azure-Samples/openai-chat-app-quickstart-javascript repozytorium 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ą.

Otwieranie w usłudze GitHub Codespaces

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

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

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

  3. Zaloguj się na platformie Azure przy użyciu interfejsu wiersza polecenia dla deweloperów platformy Azure w terminalu w dolnej części 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 platformy 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 i konfiguracji dla wdrożenia aplikacji czatu na platformie Azure. W poniższych krokach przedstawiono przykładowy proces wdrażania aplikacji czatu platformy Azure.

Wdrażanie aplikacji czatu na platformie Azure

Ważne

Zasoby platformy Azure utworzone w tej sekcji generują natychmiastowe koszty. Te zasoby mogą naliczać koszty nawet w przypadku przerwania działania polecenia przed jego pełnym wykonaniem.

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

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

    Monit Odpowiedź
    Nazwa środowiska Zachowaj krótkie i małe litery. 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órych 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 usługi Azure OpenAI i zostanie wyświetlony wynik.

Eksplorowanie przykładowego kodu

Chociaż interfejsy OpenAI i Azure OpenAI Service opierają się na wspólnej bibliotece klienta języka Python, podczas korzystania z punktów końcowych usługi Azure OpenAI potrzebne są niewielkie zmiany kodu. Zobaczmy, jak ten przykład konfiguruje uwierzytelnianie bez klucza za pomocą identyfikatora Entra firmy Microsoft i komunikuje się z usługą 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 do utworzenia asynchronicznego przepływu uwierzytelniania firmy Microsoft Entra.

Poniższy fragment kodu używa AZURE_CLIENT_ID azd 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

azd Zmienne środowiskowe zasobu są aprowizowane podczas azd wdrażania aplikacji.

Poniższy fragment kodu używa AZURE_TENANT_ID azd zmiennej środowiskowej zasobu, aby utworzyć wystąpienie azureDeveloperCliCredential , które może uwierzytelniać się za pomocą bieżącej dzierżawy firmy Microsoft Entra.

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

Biblioteka klienta tożsamości platformy Azure udostępnia poświadczenia — klasy publiczne, które implementują protokół TokenCredential biblioteki Azure Core. Poświadczenie reprezentuje odrębny przepływ uwierzytelniania na potrzeby uzyskiwania tokenu dostępu z identyfikatora Entra firmy Microsoft. Te poświadczenia można połączyć w łańcuch, aby utworzyć uporządkowaną sekwencję mechanizmów uwierzytelniania, które mają być podejmowane.

Poniższy fragment kodu tworzy ChainedTokenCredential obiekt przy użyciu elementu ManagedIdentityCredential i AzureDeveloperCliCredential:

  • Element ManagedIdentityCredential jest używany dla usług Azure Functions i aplikacja systemu Azure Service. 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 dzierżawy firmy Microsoft Entra do użycia.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Napiwek

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

Poniższy fragment kodu pobiera dostawcę tokenu usługi Azure OpenAI na podstawie wybranego poświadczenia platformy 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 zmienne środowiskowe i AZURE_OPENAI_CHATGPT_DEPLOYMENT azd środowiskowe zasobów, które są aprowidowane podczas azd wdrażania aplikacji. Błąd jest zgłaszany, jeśli wartość nie jest obecna.

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

Ten fragment kodu inicjuje klienta usługi Azure OpenAI, ustawiając api_versionparametry , azure_endpointi azure_ad_token_provider (client_args):

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

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

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

Uwaga

Interfejs OpenAI używa argumentu kluczowego model , aby określić, który model ma być używany. Usługa Azure OpenAI ma koncepcję unikatowych wdrożeń modelu. W przypadku korzystania z usługi Azure OpenAI model należy odwołać się do podstawowej nazwy wdrożenia wybranej podczas wdrażania modelu usługi Azure OpenAI.

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

Strumień odpowiedzi przy użyciu klienta i modelu OpenAI

Element response_stream obsługuje wywołanie ukończenia czatu w trasie. Poniższy fragment kodu pokazuje, jak openai_client i model są używane.

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

Poznawanie przykładowego kodu

Aplikacje platformy .NET korzystają z biblioteki klienta Azure.AI.OpenAI w celu komunikowania się z usługami Azure OpenAI, które są zależne od biblioteki OpenAI . Przykładowa aplikacja konfiguruje uwierzytelnianie bez klucza przy użyciu identyfikatora Entra firmy Microsoft do komunikowania się z usługą Azure OpenAI.

Konfigurowanie uwierzytelniania i rejestracji usługi

W tym przykładzie w pliku skonfigurowano program.cs uwierzytelnianie bez klucza. Poniższy fragment kodu używa zmiennej środowiskowej ustawionej AZURE_CLIENT_ID przez azd program w celu utworzenia wystąpienia ManagedIdentityCredential umożliwiającego uwierzytelnianie za pomocą tożsamości zarządzanej przypisanej przez użytkownika.

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

Uwaga

azd Zmienne środowiskowe zasobu są aprowizowane podczas azd wdrażania aplikacji.

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

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

Biblioteka klienta tożsamości platformy Azure 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 identyfikatora Entra firmy Microsoft. Te poświadczenia można połączyć w łańcuch za pomocą polecenia ChainedTokenCredential , aby utworzyć uporządkowaną sekwencję mechanizmów uwierzytelniania, które mają być podejmowane.

Poniższy fragment kodu rejestruje AzureOpenAIClient iniekcję zależności i tworzy obiekt ChainedTokenCredential przy użyciu elementu ManagedIdentityCredential i AzureDeveloperCliCredential:

  • Element ManagedIdentityCredential jest używany dla usług Azure Functions i aplikacja systemu Azure Service. Tożsamość zarządzana przypisana przez użytkownika jest obsługiwana przy użyciu AZURE_CLIENT_ID elementu podanego w pliku ManagedIdentityCredential.
  • Element AzureDeveloperCliCredential jest używany do programowania lokalnego. Została ona wcześniej ustawiona na podstawie dzierżawy firmy Microsoft Entra do użycia.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Napiwek

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

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

Aplikacja internetowa platformy Blazor wprowadza zarejestrowaną AzureOpenAIClient w górnej Home.Razor części składnika:

@inject AzureOpenAIClient azureOpenAIClient

Po przesłaniu formularza AzureOpenAIClient użytkownik wysyła monit do modelu OpenAI w celu wygenerowania ukończenia:

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 interfejsy OpenAI i Azure OpenAI Service opierają się na bibliotece klienta openai (typowej bibliotece klienta Języka JavaScript), podczas korzystania z punktów końcowych usługi Azure OpenAI potrzebne są niewielkie zmiany kodu. Zobaczmy, jak ten przykład konfiguruje uwierzytelnianie bez klucza za pomocą identyfikatora Entra firmy Microsoft i komunikuje się z usługą Azure OpenAI.

Uwierzytelnianie bez klucza dla każdego środowiska

Biblioteka klienta tożsamości platformy Azure 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 identyfikatora Entra firmy Microsoft. Te poświadczenia można połączyć w łańcuch za pomocą polecenia ChainedTokenCredential , aby utworzyć uporządkowaną sekwencję mechanizmów uwierzytelniania, które mają być podejmowane. Dzięki temu można wdrożyć ten sam kod zarówno w środowiskach produkcyjnych, jak i lokalnych.

Diagram przedstawiający dwa poświadczenia w przepływie, w którym najpierw podjęto próbę tożsamości zarządzanej, a następnie próbowano użyć domyślnego poświadczenia platformy Azure.

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

W tym przykładzie ./src/azure-authentication.ts przedstawiono kilka funkcji zapewniających uwierzytelnianie bez klucza w usłudze Azure OpenAI.

Pierwsza funkcja , getChainedCredential()zwraca pierwsze prawidłowe poświadczenia platformy 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
          })
    );
}

Napiwek

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

Uzyskiwanie tokenu elementu nośnego dla interfejsu OpenAI

Druga funkcja w pliku ./src/azure-authentication.ts to getTokenProvider(), która zwraca wywołanie zwrotne, które zapewnia token elementu nośnego o zakresie do punktu końcowego usług 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 metody do pobrania poświadczeń i zakresu, a następnie zwraca wywołanie zwrotne, które udostępnia token elementu nośnego.

Tworzenie uwierzytelnioowanego klienta usługi Azure OpenAI

Trzecia funkcja w pliku ./src/azure-authentication.ts to getOpenAiClient(), która zwraca klienta usługi 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 AzureOpenAI klienta

Przesyłanie strumieniowe odpowiedzi na czat za pomocą usługi Azure OpenAI

Użyj następującej procedury obsługi tras Fastify w programie , ./src/openai-chat-api.ts aby wysłać komunikat do usługi Azure OpenAI i przesłać strumieniowo 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 usługi Azure OpenAI. Ponieważ fragmenty strumienia są zwracane z usługi Azure OpenAI, element jest wysyłany do klienta.

Inne zagadnienia dotyczące zabezpieczeń

W tym artykule przedstawiono sposób użycia ChainedTokenCreadential przykładu do uwierzytelniania w usłudze Azure OpenAI.

Przykład zawiera również akcję usługi GitHub, która skanuje pliki infrastruktury jako kodu i generuje raport zawierający wykryte problemy. Aby zapewnić dalsze najlepsze rozwiązania we własnym repozytorium, zalecamy, aby każda osoba tworząca rozwiązania na podstawie naszych szablonów zapewniła włączenie ustawienia skanowania wpisów tajnych usługi GitHub.

Rozważ inne środki zabezpieczeń, takie jak:

Czyszczenie zasobów

Czyszczenie zasobów platformy Azure

Zasoby platformy Azure utworzone w tym artykule są rozliczane z subskrypcją platformy 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 platformy Azure i usunąć kod źródłowy, uruchom następujące polecenie interfejsu wiersza polecenia dla deweloperów platformy Azure:

azd down --purge

Czyszczenie usługi GitHub Codespaces

Usunięcie środowiska Usługi GitHub Codespaces gwarantuje, że możesz zmaksymalizować ilość bezpłatnych godzin na godziny korzystania z konta.

Ważne

Aby uzyskać więcej informacji na temat uprawnień konta usługi GitHub, zobacz Artykuł GitHub Codespaces monthly included storage and core hours (Miesięczne miejsca do magazynowania i godzin rdzeni w usłudze GitHub).

  1. Zaloguj się do pulpitu nawigacyjnego usługi GitHub Codespaces (https://github.com/codespaces).

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

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

  1. Zaloguj się do pulpitu nawigacyjnego usługi GitHub Codespaces (https://github.com/codespaces).

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

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

  1. Zaloguj się do pulpitu nawigacyjnego usługi GitHub Codespaces (https://github.com/codespaces).

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

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

Uzyskaj pomoc

Jeśli problem nie został rozwiązany, zarejestruj problem w repozytorium Problemy.

Następne kroki

Jeśli problem nie został rozwiązany, zarejestruj problem w repozytorium Problemy.

Jeśli problem nie został rozwiązany, zarejestruj problem w repozytorium Problemy.