다음을 통해 공유


Azure OpenAI 보안 구성 요소 시작

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

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

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

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

참고

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

아키텍처 개요

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

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

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

  • Azure OpenAI 사용자의 쿼리를 보내는 AI 공급자를 나타냅니다.
  • Azure Container Apps 애플리케이션이 호스트되는 컨테이너 환경입니다.
  • 관리 ID는 동급 최고의 보안을 보장하고 개발자가 비밀을 안전하게 관리하기 위한 요구 사항을 제거하는 데 도움이 됩니다.
  • Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics 및 RBAC 역할을 포함하여 Azure 리소스를 프로비전하기 위한 Bicep 파일.
  • 패키지와 Responses API를 사용하여 사용자 메시지에 대한 응답을 생성하는 Python Quart 앱입니다.
  • ReadableStream을 통해 JSON 선을 사용하여 백 엔드에서 응답을 스트리밍하는 기본 HTML/JavaScript 프런트 엔드입니다.
  • Azure.AI.OpenAI NuGet 패키지를 사용하는 Blazor 웹앱으로, 사용자 메시지에 대한 응답을 생성합니다.
  • OpenAI npm 패키지를 사용하여 사용자 메시지에 대한 응답을 생성하는 TypeScript 웹앱입니다.

비용

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

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

샘플 리포지토리의 cost에 대해 자세히 알아보십시오.

샘플 리포지토리에서 비용에 대해 자세히 알아보세요.

필수 조건

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

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

  • Azure 구독 - 무료로 구독 만들기

  • Azure 계정 권한 - Azure 계정에는 Microsoft.Authorization/roleAssignments/write 또는 Owner와 같은 권한이 있어야 합니다.

  • GitHub 계정

개방형 개발 환경

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

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

중요합니다

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

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

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

  2. 코드스페이스 생성 페이지에서 새 코드스페이스 만들기를 검토한 후 선택합니다.

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

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

  4. 화면 아래쪽의 터미널에서 Azure Developer CLI를 사용하여 Azure 로그인합니다.

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

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

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

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

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

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

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

  4. 화면 아래쪽의 터미널에서 Azure Developer CLI를 사용하여 Azure 로그인합니다.

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

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

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

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

GitHub Codespaces에서 열기

  1. 코드스페이스 생성 페이지에서 새 코드스페이스 만들기를 검토한 후 선택합니다.

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

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

  3. 화면 아래쪽의 터미널에서 Azure Developer CLI를 사용하여 Azure 로그인합니다.

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

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

배포 및 실행

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

Azure에 채팅 앱 배포하기

중요합니다

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

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

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

    프롬프트 답변
    환경 이름 짧게 하세요, 소문자로 유지하세요. 이름 또는 별칭을 추가합니다. 예들 들어 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 액세스 토큰을 획득하기 위한 고유한 인증 흐름을 나타냅니다. 이러한 자격 증명을 함께 연결하여 정렬된 일련의 인증 메커니즘을 구성할 수 있습니다.

다음 코드 조각은 ChainedTokenCredentialManagedIdentityCredential를 사용하여 AzureDeveloperCliCredential를 만듭니다.

  • ManagedIdentityCredential Azure Functions, Azure App Service 및 Azure Container Apps 사용됩니다. 사용자 할당 관리 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_ENDPOINTAZURE_OPENAI_CHAT_DEPLOYMENTazd 환경 변수를 확인합니다. 값이 없으면 오류가 발생합니다.

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

이 코드 조각은 Azure /openai/v1/ 엔드포인트에 대해 OpenAI 클라이언트를 초기화하고 토큰 공급자를 api_key 전달합니다. v1 엔드포인트에는 `api_version`가 필요하지 않습니다.

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

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

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

참고

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

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

OpenAI 응답 API를 사용하여 응답 스트리밍

경로 response_stream 에서 응답 API 스트리밍 호출을 처리합니다. 프런트 엔드는 '응답' 형식의 input 항목을 직접 보내고, 백엔드는 그것들을 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"

샘플 코드 탐색

.NET 애플리케이션은 Azure OpenAI 서비스와 통신하기 위해 Azure.AI.OpenAI 클라이언트 라이브러리에 의존하며, 이 클라이언트 라이브러리는 OpenAI 라이브러리에 종속됩니다. 샘플 앱은 Azure OpenAI와 통신하기 위해 Microsoft Entra ID 사용하여 키 없는 인증을 구성합니다.

인증 및 서비스 등록 구성

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

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

참고

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

다음 코드 조각에서는 AZURE_TENANT_ID에 의해 설정된 azd 환경 변수를 사용하여 AzureDeveloperCliCredential 인스턴스를 생성하고, 에 로그인된 계정을 통해 로컬에서 인증할 수 있습니다.

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

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

다음 코드 조각은 AzureOpenAIClient을 종속성 주입을 위해 등록하고, ChainedTokenCredentialManagedIdentityCredential를 사용하여 AzureDeveloperCliCredential을 생성합니다.

  • ManagedIdentityCredential Azure Functions, Azure App Service 및 Azure Container Apps 사용됩니다. 사용자 할당 관리 ID는 AZURE_CLIENT_ID를 통해 ManagedIdentityCredential에 제공된 ID를 사용하여 지원됩니다.
  • 로컬 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 웹앱은 등록된 AzureOpenAIClientHome.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 Service openai(일반적인 JavaScript 클라이언트 라이브러리)를 사용하지만 Azure OpenAI 엔드포인트를 사용할 때는 작은 코드 변경이 필요합니다. 이 샘플에서 Microsoft Entra ID 사용하여 키 없는 인증을 구성하고 Azure OpenAI와 통신하는 방법을 살펴보겠습니다.

각 환경에 대한 키 없는 인증

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

관리 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 은 두 번째로 시도됩니다. 개발자가 azd auth login 사용하여 Azure Developer CLI에 로그인할 때 설정됩니다.

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

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

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

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를 사용하여 채팅 답변 스트리밍

./src/openai-chat-api.ts 다음 Fastify 경로 처리기를 사용하여 메시지를 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에서 반환되면 클라이언트로 전송됩니다.

기타 보안 고려 사항

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

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

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

  • Microsoft Entra 사용하여 적절한 앱 사용자 집합에 대한 액세스를 제한합니다.

  • firewall 및/또는 Virtual Network 사용하여 Azure Container Apps 인스턴스를 보호합니다.

리소스 정리

Azure 리소스 정리

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

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

azd down --purge

GitHub Codespaces 정리

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

중요합니다

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

  1. GitHub Codespaces 대시보드 로그인합니다.

  2. Azure-Samples/openai-chat-app-quickstart GitHub 리포지토리에서 현재 실행 중인 Codespaces를 찾으세요.

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

  1. GitHub Codespaces 대시보드 로그인합니다.

  2. Azure-Samples/openai-chat-app-quickstart-dotnet GitHub 리포지토리에서 현재 실행 중인 Codespaces를 찾으세요.

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

  1. GitHub Codespaces 대시보드 로그인합니다.

  2. Azure-Samples/openai-chat-app-quickstart-javascript GitHub 리포지토리에서 현재 실행 중인 Codespaces를 찾으세요.

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

도움말 보기

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

다음 단계

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

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