다음을 통해 공유


Azure OpenAI 보안 구성 요소 시작

이 문서에서는 Azure OpenAI 보안 구성 요소 샘플을 만들고 사용하는 방법을 보여줍니다. 목적은 Azure OpenAI에 대한 키 없는(Microsoft Entra ID) 인증을 위해 RBAC(역할 기반 액세스 제어)를 사용하여 Azure OpenAI 계정 프로비저닝을 시연하는 것입니다. 또한 이 채팅 앱 샘플에는 Azure OpenAI 리소스를 프로비전하고 Azure Developer CLI를 사용하여 Azure Container Apps에 앱을 배포하는 데 필요한 모든 인프라 및 구성이 포함되어 있습니다.

이 문서의 지침을 따르면 다음을 수행할 수 있습니다.

  • 보안 Azure Container Chat 앱을 배포합니다.
  • Azure OpenAI 액세스에 관리 ID를 사용합니다.
  • OpenAI 라이브러리를 사용하여 Azure OpenAI LLM(대규모 언어 모델)과 채팅합니다.

이 문서를 완료하면 사용자 지정 코드 및 데이터로 새 프로젝트 수정을 시작할 수 있습니다.

참고 항목

이 문서에서는 문서의 예제 및 지침에 대한 기준으로 하나 이상의 AI 앱 템플릿을 사용합니다. AI 앱 템플릿은 AI 앱의 고품질 시작 지점을 보장하는 데 도움이 되는 잘 유지 관리되고 배포하기 쉬운 참조 구현을 제공합니다.

아키텍처 개요

채팅 앱의 간단한 아키텍처는 다음 다이어그램에 나와 있습니다. 클라이언트에서 백 엔드 앱까지의 아키텍처를 보여 주는 다이어그램.

채팅 앱은 Azure Container App으로 실행됩니다. 앱은 Microsoft Entra ID를 통해 관리 ID를 사용하여 API 키 대신 Azure OpenAI로 인증합니다. 채팅 앱은 Azure OpenAI를 사용하여 사용자 메시지에 대한 응답을 생성합니다.

애플리케이션 아키텍처는 다음 서비스 및 구성 요소를 사용합니다.

  • Microsoft AI 채팅 프로토콜 은 AI 솔루션 및 언어에서 표준화된 API 계약을 제공합니다. 채팅 앱은 Microsoft AI 채팅 프로토콜을 준수하며, 이 프로토콜을 준수하는 모든 채팅 앱에 대해 평가 앱을 실행할 수 있습니다.
  • 패키지를 사용하여 사용자 메시지에 대한 응답을 생성하는 Python openai입니다.
  • ReadableStream을 통해 JSON 선을 사용하여 백 엔드에서 응답을 스트리밍하는 기본 HTML/JavaScript 프런트 엔드입니다.

비용

이 샘플에서 가격을 최대한 낮게 유지하기 위해 대부분의 리소스는 기본 또는 소비 가격 책정 계층을 사용합니다. 의도한 사용량에 따라 필요에 따라 계층 수준을 변경합니다. 요금 발생을 중지하려면 문서를 완료하면 리소스를 삭제합니다.

샘플 리포지토리의 비용에 대해 자세히 알아봅니다.

샘플 리포지토리의 비용에 대해 자세히 알아봅니다.

샘플 리포지토리의 비용에 대해 자세히 알아봅니다.

필수 조건

이 문서를 완료하는 데 필요한 모든 종속성을 갖춘 개발 컨테이너 환경을 사용할 수 있습니다. GitHub Codespaces(브라우저)에서 개발 컨테이너를 실행하거나 Visual Studio Code를 사용하여 로컬로 실행할 수 있습니다.

이 문서를 사용하려면 다음 필수 조건을 충족해야 합니다.

  • Azure 구독 - 체험 구독 만들기

  • Azure 계정 권한 - Azure 계정에는 Microsoft.Authorization/roleAssignments/write 사용자 액세스 관리자 또는 소유자와 같은 권한이 있어야 합니다.

  • GitHub 계정

개방형 개발 환경

다음 지침을 사용하여 이 문서를 완료하는 데 필요한 모든 종속성을 포함하는 미리 구성된 개발 환경을 배포합니다.

GitHub Codespaces는 사용자 인터페이스로 웹용 Visual Studio Code를 사용하여 GitHub에서 관리하는 개발 컨테이너를 실행합니다. 가장 간단한 개발 환경을 위해서는 GitHub Codespaces를 사용하여 이 문서를 완료하는 데 필요한 올바른 개발자 도구와 종속성을 미리 설치합니다.

Important

모든 GitHub 계정은 2개의 코어 인스턴스를 사용하여 매월 최대 60시간 동안 Codespaces를 무료로 사용할 수 있습니다. 자세한 내용은 GitHub Codespaces 월별 포함 스토리지 및 코어 시간을 참조하세요.

다음 단계를 사용하여 GitHub 리포지토리의 분기에 새 GitHub Codespace mainAzure-Samples/openai-chat-app-quickstart 만듭니다.

  1. 다음 단추를 마우스 오른쪽 단추로 클릭하고 새 창에서 링크 열기를 선택합니다. 이 작업을 통해 개발 환경 및 설명서를 검토할 수 있습니다.

  2. 코드스페이 스 만들기 페이지에서 새 코드스페이 스 만들기를 검토하고 선택합니다 .

    새 codespace를 만들기 전에 확인 화면의 스크린샷

  3. codespace가 생성될 때까지 기다립니다. 이 프로세스에는 몇 분 정도 걸릴 수 있습니다.

  4. 화면 맨 아래에 있는 터미널에서 Azure 개발자 CLI를 사용하여 Azure에 로그인합니다.

    azd auth login
    
  5. 터미널에서 코드를 복사한 다음 브라우저에 붙여넣습니다. 지침에 따라 Azure 계정으로 인증합니다.

이 문서의 나머지 작업은 이 개발 컨테이너의 컨텍스트에서 수행됩니다.

다음 단계를 사용하여 GitHub 리포지토리의 분기에 새 GitHub Codespace mainAzure-Samples/openai-chat-app-quickstart-dotnet 만듭니다.

  1. 다음 단추를 마우스 오른쪽 단추로 클릭하고 새 창에서 링크 열기를 선택합니다. 이 작업을 통해 개발 환경 및 설명서를 검토할 수 있습니다.

  2. 코드스페이 스 만들기 페이지에서 코드스페이스 만들기를 검토하고 선택합니다 .

    새 codespace를 만들기 전에 확인 화면의 스크린샷

  3. codespace가 생성될 때까지 기다립니다. 이 프로세스에는 몇 분 정도 걸릴 수 있습니다.

  4. 화면 맨 아래에 있는 터미널에서 Azure 개발자 CLI를 사용하여 Azure에 로그인합니다.

    azd auth login
    
  5. 터미널에서 코드를 복사한 다음 브라우저에 붙여넣습니다. 지침에 따라 Azure 계정으로 인증합니다.

이 문서의 나머지 작업은 이 개발 컨테이너의 컨텍스트에서 수행됩니다.

다음 단계를 사용하여 GitHub 리포지토리의 분기에 새 GitHub Codespace mainAzure-Samples/openai-chat-app-quickstart-javascript 만듭니다.

  1. 다음 단추를 마우스 오른쪽 단추로 클릭하고 새 창에서 링크 열기를 선택합니다. 이 작업을 통해 개발 환경 및 설명서를 검토할 수 있습니다.

GitHub Codespaces에서 열기

  1. 코드스페이 스 만들기 페이지에서 새 코드스페이 스 만들기를 검토하고 선택합니다 .

    새 codespace를 만들기 전에 확인 화면의 스크린샷

  2. codespace가 생성될 때까지 기다립니다. 이 프로세스에는 몇 분 정도 걸릴 수 있습니다.

  3. 화면 맨 아래에 있는 터미널에서 Azure 개발자 CLI를 사용하여 Azure에 로그인합니다.

    azd auth login
    
  4. 터미널에서 코드를 복사한 다음 브라우저에 붙여넣습니다. 지침에 따라 Azure 계정으로 인증합니다.

이 문서의 나머지 작업은 이 개발 컨테이너의 컨텍스트에서 수행됩니다.

배포 및 실행

샘플 리포지토리에는 채팅 앱 Azure 배포를 위한 모든 코드 및 구성 파일이 포함되어 있습니다. 다음 단계에서는 샘플 채팅 앱 Azure 배포 프로세스를 안내합니다.

Azure에 채팅 앱 배포

Important

이 섹션에서 만든 Azure 리소스는 즉시 비용이 발생합니다. 이러한 리소스는 명령이 완전히 실행되기 전에 중단하더라도 비용이 발생할 수 있습니다.

  1. Azure 리소스 프로비저닝 및 소스 코드 배포에 대해 다음 Azure Developer CLI 명령을 실행합니다.

    azd up
    
  2. 다음 표를 사용하여 프롬프트에 응답합니다.

    prompt 답변
    환경 이름 짧고 소문자를 유지합니다. 이름 또는 별칭을 추가합니다. 예들 들어 secure-chat입니다. 리소스 그룹 이름의 일부로 사용됩니다.
    구독 리소스를 만들 구독을 선택합니다.
    위치(호스팅용) 목록에서 가까운 위치를 선택합니다.
    OpenAI 모델의 위치 목록에서 가까운 위치를 선택합니다. 첫 번째 위치와 동일한 위치를 사용할 수 있는 경우 해당 위치를 선택합니다.
  3. 앱이 배포될 때까지 기다립니다. 배포를 완료하는 데 일반적으로 5~10분이 걸립니다.

채팅 앱을 사용하여 큰 언어 모델에 질문하기

  1. 터미널은 애플리케이션 배포에 성공한 후 URL을 표시합니다.

  2. 브라우저에서 채팅 애플리케이션을 열려면 Deploying service web이라고 표시된 URL을 선택합니다.

    채팅 입력에 대한 몇 가지 제안과 질문을 입력할 수 있는 채팅 텍스트 상자를 보여 주는 브라우저의 채팅 앱 스크린샷.

  3. 브라우저에서 "관리 ID가 키보다 더 나은 이유는 무엇인가요?"와 같은 질문을 입력합니다.

  4. 답변은 Azure OpenAI에서 제공되며 결과가 표시됩니다.

샘플 코드 탐색

OpenAI 및 Azure OpenAI 서비스는 일반적인 Python 클라이언트 라이브러리사용하지만 Azure OpenAI 엔드포인트를 사용할 때는 작은 코드 변경이 필요합니다. 이 샘플에서 Microsoft Entra ID를 사용하여 키 없는 인증을 구성하고 Azure OpenAI와 통신하는 방법을 살펴보겠습니다.

관리 ID를 사용하여 인증 구성

이 샘플에서 파일은 src\quartapp\chat.py 키 없는 인증 구성으로 시작합니다.

다음 코드 조각은 azure.identity.aio 모듈을 사용하여 비동기 Microsoft Entra 인증 흐름을 만듭니다.

다음 코드 조각은 환경 변수를 사용하여 AZURE_CLIENT_IDazd 사용자 할당 관리 ID를 통해 인증할 수 있는 ManagedIdentityCredential 인스턴스를 만듭니다.

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

참고 항목

리소스 환경 변수는 azd 앱 배포 중에 azd 프로비전됩니다.

다음 코드 조각은 리소스 환경 변수를 사용하여 AZURE_TENANT_IDazd 현재 Microsoft Entra 테넌트로 인증할 수 있는 AzureDeveloperCliCredential 인스턴스를 만듭니다.

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

Azure ID 클라이언트 라이브러리는 Azure Core 라이브러리의 TokenCredential 프로토콜을 구현하는 공용 클래스인 자격 증명을 제공합니다. 자격 증명은 Microsoft Entra ID에서 액세스 토큰을 획득하기 위한 고유한 인증 흐름을 나타냅니다. 이러한 자격 증명을 함께 연결하여 정렬된 일련의 인증 메커니즘을 구성할 수 있습니다.

다음 코드 조각은 using a 및 aChainedTokenCredentialManagedIdentityCredentialAzureDeveloperCliCredential 만듭니다.

  • Azure ManagedIdentityCredential Functions 및 Azure 앱 Service에 사용됩니다. 사용자 할당 관리 ID는 에 client_id전달 ManagedIdentityCredential 하여 지원됩니다.
  • 로컬 AzureDeveloperCliCredential 개발에 사용됩니다. 이전에 사용할 Microsoft Entra 테넌트에 따라 설정되었습니다.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

첫 번째 유효한 Microsoft Entra 액세스 토큰이 사용되므로 자격 증명 순서가 중요합니다. 자세한 내용은 ChainedTokenCredential 개요 문서를 참조하세요.

다음 코드 조각은 선택한 Azure 자격 증명을 기반으로 Azure OpenAI 토큰 공급자를 가져옵니다. 이 값은 두 개의 인수를 사용하여 azure.identity.aio.get_bearer_token_provider 호출하여 가져옵니다.

  • azure_credential ChainedTokenCredential: 요청을 인증하기 위해 이전에 만든 인스턴스입니다.

  • https://cognitiveservices.azure.com/.default: 하나 이상의 전달자 토큰 범위가 필요합니다. 이 경우 Azure Cognitive Services 엔드포인트입니다 .

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

다음 줄에서는 앱 배포 중에 AZURE_OPENAI_ENDPOINT 프로비전되는 필수 AZURE_OPENAI_CHATGPT_DEPLOYMENTazdazd 리소스 환경 변수를 확인합니다. 값이 없으면 오류가 발생합니다.

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

이 코드 조각은 Azure OpenAI 클라이언트를 초기화하고 , api_versionazure_endpoint (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,
)  

다음 줄에서는 API 호출에 사용할 Azure OpenAI 모델 배포 이름을 설정합니다.

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

참고 항목

OpenAI는 model 키워드 인수를 사용하여 사용할 모델을 지정합니다. Azure OpenAI에는 고유한 모델 배포 개념이 있습니다. Azure OpenAI를 사용하는 경우 Azure OpenAI model 모델 배포 중에 선택한 기본 배포 이름을 참조해야 합니다.

이 함수가 완료되면 클라이언트가 올바르게 구성되고 Azure OpenAI 서비스와 상호 작용할 준비가 됩니다.

OpenAI 클라이언트 및 모델을 사용하는 응답 스트림

경로 response_stream 에서 채팅 완료 호출을 처리합니다. 다음 코드 조각은 사용 방법 및 openai_client 사용 방법을 model 보여 있습니다.

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 OpenAI takes the deployment name as the model name
        model=bp.openai_model,
        messages=all_messages,
        stream=True,
    )

샘플 코드 탐색

.NET 애플리케이션은 Azure.AI.OpenAI 클라이언트 라이브러리를 사용하여 OpenAI 라이브러리에 종속되는 Azure OpenAI 서비스와 통신합니다. 샘플 앱은 Microsoft Entra ID를 사용하여 Azure OpenAI와 통신하도록 키 없는 인증을 구성합니다.

인증 및 서비스 등록 구성

이 샘플에서는 파일에 키 없는 인증이 program.cs 구성됩니다. 다음 코드 조각은 사용자가 할당한 AZURE_CLIENT_ID 관리 ID를 통해 인증할 수 있는 ManagedIdentityCredentialazd위해 설정된 환경 변수를 사용합니다.

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

참고 항목

리소스 환경 변수는 azd 앱 배포 중에 azd 프로비전됩니다.

다음 코드 조각에서는 설정된 환경 변수를 사용하여 AZURE_TENANT_ID 로그인한 azd 계정을 사용하여 로컬로 인증할 수 있는 AzureDeveloperCliCredentialazd다.

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

Azure ID 클라이언트 라이브러리는 Azure Core 라이브러리의 TokenCredential 프로토콜을 구현하는 자격 증명 클래스를 제공합니다. 자격 증명은 Microsoft Entra ID에서 액세스 토큰을 획득하기 위한 고유한 인증 흐름을 나타냅니다. 이러한 자격 증명은 정렬된 일련의 인증 메커니즘을 구성하여 ChainedTokenCredential 시도할 수 있습니다.

다음 코드 조각은 종속성 주입을 AzureOpenAIClient 등록하고 using a 및 a ChainedTokenCredentialManagedIdentityCredentialAzureDeveloperCliCredential만듭니다.

  • Azure ManagedIdentityCredential Functions 및 Azure 앱 Service에 사용됩니다. 사용자 할당 관리 ID는 에 제공된 ID를 AZURE_CLIENT_ID 사용하여 지원됩니다 ManagedIdentityCredential.
  • 로컬 AzureDeveloperCliCredential 개발에 사용됩니다. 이전에 사용할 Microsoft Entra 테넌트에 따라 설정되었습니다.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

첫 번째 유효한 Microsoft Entra 액세스 토큰이 사용되므로 자격 증명 순서가 중요합니다. 자세한 내용은 ChainedTokenCredential 개요 문서를 참조하세요.

Azure OpenAI 클라이언트를 사용하여 채팅 완료 가져오기

Blazor 웹앱은 등록된 AzureOpenAIClient 구성 요소를 구성 요소 맨 위에 삽입합니다 Home.Razor .

@inject AzureOpenAIClient azureOpenAIClient

사용자가 양식을 AzureOpenAIClient 제출하면 OpenAI 모델에 프롬프트를 보내 완성을 생성합니다.

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

샘플 코드 탐색

OpenAI 및 Azure OpenAI 서비스는 openai(일반 JavaScript 클라이언트 라이브러리)를 사용하지만 Azure OpenAI 엔드포인트를 사용할 때는 작은 코드 변경이 필요합니다. 이 샘플에서 Microsoft Entra ID를 사용하여 키 없는 인증을 구성하고 Azure OpenAI와 통신하는 방법을 살펴보겠습니다.

각 환경에 대한 키 없는 인증

Azure ID 클라이언트 라이브러리는 Azure Core 라이브러리의 TokenCredential 프로토콜을 구현하는 자격 증명 클래스를 제공합니다. 자격 증명은 Microsoft Entra ID에서 액세스 토큰을 획득하기 위한 고유한 인증 흐름을 나타냅니다. 이러한 자격 증명은 정렬된 일련의 인증 메커니즘을 구성하여 ChainedTokenCredential 시도할 수 있습니다. 이렇게 하면 프로덕션 및 로컬 개발 환경 모두에서 동일한 코드를 배포할 수 있습니다.

관리 ID를 먼저 시도한 다음 기본 Azure 자격 증명을 시도하는 흐름의 두 자격 증명을 보여 주는 다이어그램.

관리 ID를 사용하여 인증 구성

이 샘플 ./src/azure-authentication.ts 에서는 Azure OpenAI에 키 없는 인증을 제공하는 몇 가지 함수를 제공합니다.

첫 번째 함수는 getChainedCredential()체인에 있는 유효한 첫 번째 Azure 자격 증명을 반환합니다.

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 이 먼저 시도됩니다. 프로덕션 런타임에서 AZURE_CLIENT_ID 환경 변수로 설정되며 사용자 할당 관리 ID를 통해 인증할 수 있습니다.
  • AzureDeveloperCliCredential 은 두 번째로 시도됩니다. 개발에서 Azure CLI az login를 사용하여 로그인할 때 설정됩니다.

첫 번째 유효한 Microsoft Entra 액세스 토큰이 사용되므로 자격 증명 순서가 중요합니다. 자세한 내용은 ChainedTokenCredential 개요 문서를 참조하세요.

OpenAI에 대한 전달자 토큰 가져오기

두 번째 함수 ./src/azure-authentication.ts 는 Azure Cognitive Services 엔드포인트로 범위가 지정된 전달자 토큰을 제공하는 콜백을 getTokenProvider().

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

위의 코드 조각은 자격 증명 및 범위를 가져오는 데 사용한 getBearerTokenProvider 다음 전달자 토큰을 제공하는 콜백을 반환합니다.

인증된 Azure OpenAI 클라이언트 만들기

세 번째 함수 ./src/azure-authentication.ts 는 Azure OpenAI 클라이언트를 반환하는 함수입니다 getOpenAiClient().

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

이 코드는 올바르게 범위가 지정된 토큰을 포함하여 옵션을 사용하고 클라이언트를 AzureOpenAI 만듭니다.

Azure OpenAI를 사용하여 채팅 답변 스트리밍

다음 Fastify 경로 처리기를 ./src/openai-chat-api.ts 사용하여 Azure OpenAI에 메시지를 보내고 응답을 스트리밍합니다.

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

}

이 함수는 이전 메시지를 포함하여 채팅 대화를 가져오고 Azure OpenAI로 보냅니다. 스트림 청크가 Azure OpenAI에서 반환되면 클라이언트로 전송됩니다.

기타 보안 고려 사항

이 문서에서는 샘플이 Azure OpenAI 서비스에 인증하는 데 사용하는 ChainedTokenCredential 방법을 보여 줍니다.

또한 샘플에는 코드로서의 인프라 파일을 검색하고 검색된 문제가 포함된 보고서를 생성하는 GitHub Action 이 있습니다. 사용자 고유의 리포지토리에서 지속적인 모범 사례를 보장하려면 템플릿 을 기반으로 솔루션을 만드는 모든 사용자가 GitHub 비밀 검사 설정을 사용하도록 설정하는 것이 좋습니다.

다음과 같은 다른 보안 조치를 고려합니다.

리소스 정리

Azure 리소스 정리

이 문서에서 만들어진 Azure 리소스는 Azure 구독에 요금이 청구됩니다. 앞으로 이러한 리소스가 필요하지 않을 것으로 예상되는 경우 추가 요금이 발생하지 않도록 삭제합니다.

Azure 리소스를 삭제하고 소스 코드를 제거하려면 다음 Azure Developer CLI 명령을 실행합니다.

azd down --purge

GitHub Codespaces 정리

GitHub Codespaces 환경을 삭제하면 계정에 대해 얻을 수 있는 코어당 무료 사용 권한을 최대화할 수 있습니다.

Important

GitHub 계정의 자격에 대한 자세한 내용은 GitHub Codespaces 월별 포함된 스토리지 및 코어 시간을 참조하세요.

  1. GitHub Codespaces 대시보드(https://github.com/codespaces)에 로그인합니다.

  2. Azure-Samples/openai-chat-app-quickstart GitHub 리포지토리에서 제공된 현재 실행 중인 Codespaces를 찾습니다.

  3. codespace에 대한 상황에 맞는 메뉴를 열고 삭제를 선택합니다.

  1. GitHub Codespaces 대시보드(https://github.com/codespaces)에 로그인합니다.

  2. Azure-Samples/openai-chat-app-quickstart-dotnet GitHub 리포지토리에서 제공된 현재 실행 중인 Codespaces를 찾습니다.

  3. codespace에 대한 상황에 맞는 메뉴를 열고 삭제를 선택합니다.

  1. GitHub Codespaces 대시보드(https://github.com/codespaces)에 로그인합니다.

  2. Azure-Samples/openai-chat-app-quickstart-javascript GitHub 리포지토리에서 제공된 현재 실행 중인 Codespaces를 찾습니다.

  3. codespace에 대한 상황에 맞는 메뉴를 열고 삭제를 선택합니다.

도움말 보기

문제가 해결되지 않으면 리포지토리의 문제에 문제를 기록합니다.

다음 단계

문제가 해결되지 않으면 리포지토리의 문제에 문제를 기록합니다.

문제가 해결되지 않으면 리포지토리의 문제에 문제를 기록합니다.