Mulai menggunakan blok penyusun keamanan OpenAI Azure

Artikel ini memperlihatkan kepada Anda cara membuat dan menggunakan sampel blok penyusun keamanan OpenAI Azure. Tujuan dari ini adalah untuk memperlihatkan proses penyediaan akun Azure OpenAI dengan kontrol akses berbasis peran (RBAC) untuk autentikasi tanpa kunci menggunakan Microsoft Entra ID ke Azure OpenAI. Sampel aplikasi obrolan ini juga mencakup semua infrastruktur dan konfigurasi yang diperlukan untuk memprovisikan sumber daya OpenAI Azure dan menyebarkan aplikasi ke Azure Container Apps menggunakan Azure Developer CLI.

Dengan mengikuti instruksi dalam artikel ini, Anda akan:

  • Sebarkan aplikasi obrolan aman di Azure Container Apps.
  • Gunakan identitas terkelola untuk akses OpenAI Azure.
  • Mengobrol dengan Azure OpenAI Large Language Model (LLM) menggunakan pustaka OpenAI.

Setelah menyelesaikan artikel ini, Anda dapat mulai memodifikasi proyek baru dengan kode dan data kustom Anda.

Catatan

Artikel ini menggunakan satu atau beberapa templat aplikasi AI sebagai dasar untuk contoh dan panduan dalam artikel. Templat aplikasi AI memberi Anda implementasi referensi yang terawat dan mudah disebarkan dengan baik yang membantu memastikan titik awal berkualitas tinggi untuk aplikasi AI Anda.

Ikhtisar arsitektur

Arsitektur sederhana aplikasi obrolan ditampilkan dalam diagram berikut: Diagram memperlihatkan arsitektur dari klien ke aplikasi backend.

Aplikasi obrolan berjalan sebagai Aplikasi Kontainer Azure. Aplikasi ini menggunakan identitas terkelola melalui Microsoft Entra ID untuk mengautentikasi dengan Azure OpenAI, bukan kunci API. Aplikasi obrolan menggunakan Azure OpenAI untuk menghasilkan respons terhadap pesan pengguna.

Arsitektur aplikasi bergantung pada layanan dan komponen berikut:

  • Azure OpenAI mewakili penyedia AI tempat kami mengirim kueri pengguna.
  • Azure Container Apps adalah lingkungan kontainer tempat aplikasi dihosting.
  • Identitas Terkelola membantu kami memastikan keamanan terbaik di kelasnya dan menghilangkan persyaratan bagi Anda sebagai pengembang untuk mengelola rahasia dengan aman.
  • File Bicep untuk penyediaan resources Azure, termasuk Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics, dan peran RBAC.
  • Aplikasi Python Quart yang menggunakan paket openai dan API Responses untuk menghasilkan respons terhadap pesan pengguna.
  • Frontend HTML/JavaScript dasar yang mengalirkan respons dari backend menggunakan JSON Lines melalui ReadableStream.
  • Aplikasi web Blazor yang menggunakan Azure. AI. Paket OpenAI NuGet untuk menghasilkan respons terhadap pesan pengguna.
  • Aplikasi web TypeScript yang menggunakan paket npm OpenAI untuk menghasilkan respons terhadap pesan pengguna.

Biaya

Dalam upaya untuk menjaga harga serendah mungkin dalam sampel ini, sebagian besar sumber daya menggunakan tingkat harga dasar atau konsumsi. Ubah tingkat tingkat Anda sesuai kebutuhan berdasarkan penggunaan yang Anda inginkan. Untuk berhenti dikenakan biaya, hapus sumber daya saat Anda selesai dengan artikel.

Pelajari selengkapnya tentang biaya di repositori sampel.

Pelajari selengkapnya tentang biaya di repositori sampel.

Pelajari selengkapnya tentang biaya di repositori sampel.

Prasyarat

Lingkungan kontainer pengembangan tersedia dengan semua dependensi yang diperlukan untuk menyelesaikan artikel ini. Anda dapat menjalankan kontainer pengembangan di GitHub Codespaces (di browser) atau secara lokal menggunakan Visual Studio Code.

Untuk menggunakan artikel ini, Anda perlu memenuhi prasyarat berikut:

Membuka lingkungan pengembangan

Gunakan instruksi berikut untuk menyebarkan lingkungan pengembangan yang telah dikonfigurasi sebelumnya yang berisi semua dependensi yang diperlukan untuk menyelesaikan artikel ini.

GitHub Codespaces menjalankan kontainer pengembangan yang dikelola oleh GitHub dengan Visual Studio Code untuk Web sebagai antarmuka pengguna. Untuk lingkungan pengembangan yang paling mudah, gunakan GitHub Codespaces sehingga Anda memiliki alat dan dependensi pengembang yang benar yang telah diinstal sebelumnya untuk menyelesaikan artikel ini.

Penting

Semua akun GitHub dapat menggunakan Codespace hingga 60 jam gratis setiap bulan dengan 2 instans inti. Untuk informasi selengkapnya, lihat penyimpanan dan jam inti bulanan yang disertakan di GitHub Codespaces.

Gunakan langkah-langkah berikut untuk membuat GitHub Codespace baru di cabang main dari repositori Azure-Samples/openai-chat-app-quickstart GitHub.

  1. Klik kanan pada tombol berikut, dan pilih Buka tautan di jendela baru. Tindakan ini memungkinkan Anda memiliki lingkungan pengembangan dan dokumentasi yang tersedia untuk ditinjau.

  2. Pada halaman Buat codespace , tinjau lalu pilih Buat codespace baru

    Cuplikan layar konfirmasi sebelum membuat codespace baru.

  3. Tunggu hingga codespace dimulai. Proses startup ini dapat memakan waktu beberapa menit.

  4. Masuk ke Azure dengan Azure Developer CLI di terminal di bagian bawah layar.

    azd auth login
    
  5. Salin kode dari terminal lalu tempelkan ke browser. Ikuti petunjuk untuk mengautentikasi dengan akun Azure Anda.

Tugas yang tersisa dalam artikel ini berlangsung dalam konteks kontainer pengembangan ini.

Gunakan langkah-langkah berikut untuk membuat GitHub Codespace baru di cabang main dari repositori Azure-Samples/openai-chat-app-quickstart-dotnet GitHub.

  1. Klik kanan pada tombol berikut, dan pilih Buka tautan di jendela baru. Tindakan ini memungkinkan Anda memiliki lingkungan pengembangan dan dokumentasi yang tersedia untuk ditinjau.

  2. Pada halaman Buat codespace , tinjau lalu pilih Buat codespace

    Cuplikan layar konfirmasi sebelum membuat codespace baru.

  3. Tunggu hingga codespace dimulai. Proses startup ini dapat memakan waktu beberapa menit.

  4. Masuk ke Azure dengan Azure Developer CLI di terminal di bagian bawah layar.

    azd auth login
    
  5. Salin kode dari terminal lalu tempelkan ke browser. Ikuti petunjuk untuk mengautentikasi dengan akun Azure Anda.

Tugas yang tersisa dalam artikel ini berlangsung dalam konteks kontainer pengembangan ini.

Gunakan langkah-langkah berikut untuk membuat GitHub Codespace baru di cabang main dari repositori Azure-Samples/openai-chat-app-quickstart-javascript GitHub.

  1. Klik kanan pada tombol berikut, dan pilih Buka tautan di jendela baru. Tindakan ini memungkinkan Anda memiliki lingkungan pengembangan dan dokumentasi yang tersedia untuk ditinjau.

    Buka di GitHub Codespaces

  2. Pada halaman Buat codespace , tinjau lalu pilih Buat codespace baru

    Cuplikan layar konfirmasi sebelum membuat codespace baru.

  3. Tunggu hingga codespace dimulai. Proses startup ini dapat memakan waktu beberapa menit.

  4. Masuk ke Azure dengan Azure Developer CLI di terminal di bagian bawah layar.

    azd auth login
    
  5. Salin kode dari terminal lalu tempelkan ke browser. Ikuti petunjuk untuk mengautentikasi dengan akun Azure Anda.

Tugas yang tersisa dalam artikel ini berlangsung dalam konteks kontainer pengembangan ini.

Sebarkan dan jalankan

Repositori sampel berisi semua file kode dan konfigurasi untuk penyebaran aplikasi obrolan di Azure. Langkah-langkah berikut memandu Anda melalui proses penyebaran aplikasi obrolan contoh Azure.

Menyebarkan aplikasi obrolan ke Azure

Penting

Sumber daya Azure yang dibuat di bagian ini, dikenakan biaya langsung. Sumber daya ini mungkin menimbulkan biaya bahkan jika Anda menghentikan perintah sebelum sepenuhnya dijalankan.

  1. Jalankan perintah Azure Developer CLI berikut untuk provisi sumber daya Azure dan penyebaran kode sumber:

    azd up
    
  2. Gunakan tabel berikut untuk menjawab perintah:

    Cepat Jawaban
    Nama lingkungan Tetap pendek dan huruf kecil. Tambahkan nama atau alias Anda. Contohnya,secure-chat. Ini digunakan sebagai bagian dari nama grup sumber daya.
    Langganan Pilih langganan di mana sumber daya akan dibuat.
    Lokasi (untuk hosting) Pilih lokasi di dekat Anda dari daftar.
    Lokasi untuk model OpenAI Pilih lokasi di dekat Anda dari daftar. Jika lokasi yang sama tersedia sebagai lokasi pertama Anda, pilih lokasi tersebut.
  3. Tunggu hingga aplikasi di-deploy. Penyebaran biasanya membutuhkan waktu antara 5 dan 10 menit untuk diselesaikan.

Menggunakan aplikasi obrolan untuk mengajukan pertanyaan ke Model Bahasa Besar

  1. Terminal menampilkan URL setelah penyebaran aplikasi berhasil.

  2. Pilih URL yang diberi Deploying service web label untuk membuka aplikasi obrolan di browser.

    Cuplikan layar aplikasi obrolan di browser memperlihatkan beberapa saran untuk input obrolan dan kotak teks obrolan untuk memasukkan pertanyaan.

  3. Di browser, masukkan pertanyaan seperti "Mengapa identitas terkelola lebih baik daripada kunci?".

  4. Jawabannya berasal dari Azure OpenAI dan hasilnya ditampilkan.

Menjelajahi kode contoh

Meskipun OpenAI dan Azure OpenAI Service mengandalkan pustaka klien Python yang umum, perubahan kode kecil diperlukan saat menggunakan titik akhir Azure OpenAI. Mari kita lihat bagaimana sampel ini mengonfigurasi autentikasi tanpa kunci dengan Microsoft Entra ID dan berkomunikasi dengan Azure OpenAI.

Mengonfigurasi autentikasi dengan identitas terkelola

Dalam sampel ini, src/quartapp/chat.py file dimulai dengan mengonfigurasi autentikasi tanpa kunci.

Cuplikan berikut menggunakan modul azure.identity.aio untuk membuat alur autentikasi Microsoft Entra asinkron.

Cuplikan kode berikut menggunakan variabel lingkungan untuk membuat instans AZURE_CLIENT_IDazd ManagedIdentityCredential yang mampu mengautentikasi melalui identitas terkelola yang ditetapkan pengguna.

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

Catatan

Variabel lingkungan sumber daya azd disediakan selama peluncuran aplikasi azd.

Cuplikan kode berikut menggunakan variabel lingkungan sumber daya AZURE_TENANT_IDazd untuk membuat AzureDeveloperCliCredential mampu mengautentikasi dengan penyewa Microsoft Entra saat ini.

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

Pustaka klien Azure Identity menyediakan credentials—kelas publik yang mengimplementasikan protokol TokenCredential pustaka Azure Core. Kredensial mewakili alur autentikasi yang berbeda untuk memperoleh token akses dari Microsoft Entra ID. Kredensial ini dapat dirangkai untuk membentuk sebuah rangkaian mekanisme autentikasi berurutan yang akan dicoba.

Cuplikan berikut membuat ChainedTokenCredential menggunakan ManagedIdentityCredential dan AzureDeveloperCliCredential:

  • ManagedIdentityCredential digunakan untuk Azure Functions, Azure App Service, dan Azure Container Apps. Identitas terkelola yang ditetapkan pengguna didukung dengan meneruskan client_id ke ManagedIdentityCredential.
  • AzureDeveloperCliCredential digunakan untuk pengembangan lokal. Ini ditetapkan sebelumnya berdasarkan penyewa Microsoft Entra untuk digunakan.
azure_credential = ChainedTokenCredential(
    user_assigned_managed_identity_credential,
    azure_dev_cli_credential
)

Kiat

Urutan kredensial penting, karena token akses Microsoft Entra valid pertama digunakan. Untuk informasi selengkapnya, lihat artikel Gambaran Umum ChainedTokenCredential.

Cuplikan kode berikut ini mendapatkan penyedia token Azure OpenAI berdasarkan kredensial Azure yang telah dipilih. Nilai ini diperoleh dengan memanggil azure.identity.aio.get_bearer_token_provider dengan dua argumen:

  • azure_credential: Instans ChainedTokenCredential yang dibuat sebelumnya untuk mengautentikasi permintaan.

  • https://cognitiveservices.azure.com/.default: Diperlukan satu atau beberapa cakupan token pembawa. Dalam hal ini, titik akhir Azure Cognitive Services.

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

Baris berikut memeriksa variabel lingkungan yang diperlukan AZURE_OPENAI_ENDPOINT dan AZURE_OPENAI_CHAT_DEPLOYMENT, dua azd yang diatur selama azd penyediaan. Kesalahan muncul jika nilai tidak ada.

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

Cuplikan ini menginisialisasi klien OpenAI terhadap titik akhir /openai/v1/ Azure, meneruskan penyedia token sebagai api_key. Tidak api_version diperlukan dengan titik akhir v1:

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

Baris berikut mengatur nama penyebaran model OpenAI Azure untuk digunakan dalam panggilan API:

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

Catatan

OpenAI menggunakan model argumen kata kunci untuk menentukan model apa yang akan digunakan. Azure OpenAI memiliki konsep penyebaran model unik. Saat Anda menggunakan Azure OpenAI, model harus merujuk ke nama penyebaran dasar yang dipilih selama penyebaran model OpenAI Azure.

Setelah fungsi ini selesai, klien dikonfigurasi dengan benar dan siap untuk berinteraksi dengan layanan Azure OpenAI.

Mengalirkan data respons menggunakan OpenAI Responses API

response_stream menangani panggilan streaming API Respons di dalam rute tersebut. Frontend mengirimkan item berbentuk input Respons secara langsung, dan backend meneruskannya ke 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"

Menjelajahi kode sampel

Aplikasi .NET mengandalkan pustaka klien Azure.AI.OpenAI untuk berkomunikasi dengan layanan OpenAI Azure, yang bergantung pada perpustakaan OpenAI. Aplikasi sampel mengonfigurasi autentikasi tanpa kunci menggunakan Microsoft Entra ID untuk berkomunikasi dengan Azure OpenAI.

Mengonfigurasi autentikasi dan pendaftaran layanan

Dalam sampel ini, autentikasi tanpa kunci dikonfigurasi dalam program.cs file. Cuplikan kode berikut menggunakan variabel lingkungan yang AZURE_CLIENT_ID ditetapkan oleh azd untuk membuat instans ManagedIdentityCredential yang mampu mengautentikasi melalui identitas terkelola yang ditetapkan pengguna.

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

Catatan

Variabel lingkungan sumber daya azd disediakan selama peluncuran aplikasi azd.

Cuplikan kode berikut menggunakan variabel lingkungan yang ditetapkan oleh AZURE_TENANT_ID untuk membuat instans azd yang mampu melakukan autentikasi secara lokal menggunakan akun yang masuk ke .

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

Pustaka klien Azure Identity menyediakan kelas kredensial yang mengimplementasikan antarmuka TokenCredential pustaka Azure Core. Kredensial mewakili alur autentikasi yang berbeda untuk memperoleh token akses dari Microsoft Entra ID. Kredensial ini dapat dirangkai menggunakan ChainedTokenCredential untuk membentuk urutan mekanisme autentikasi yang akan diuji.

Cuplikan berikut mendaftarkan AzureOpenAIClient untuk injeksi dependensi dan membuat ChainedTokenCredential menggunakan ManagedIdentityCredential dan AzureDeveloperCliCredential:

  • ManagedIdentityCredential digunakan untuk Azure Functions, Azure App Service, dan Azure Container Apps. Identitas terkelola yang ditetapkan pengguna didukung dengan menggunakan AZURE_CLIENT_ID yang disediakan untuk ManagedIdentityCredential.
  • AzureDeveloperCliCredential digunakan untuk pengembangan lokal. Ini ditetapkan sebelumnya berdasarkan penyewa Microsoft Entra untuk digunakan.
builder.Services.AddAzureClients(
    clientBuilder => {
        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)
            => new AzureOpenAIClient(
                new Uri(endpoint),
                new ChainedTokenCredential(
                    userAssignedIdentityCredential, azureDevCliCredential), options));
    });

Kiat

Urutan kredensial penting, karena token akses Microsoft Entra valid pertama digunakan. Untuk informasi selengkapnya, lihat artikel Gambaran Umum ChainedTokenCredential.

Dapatkan penyelesaian obrolan menggunakan klien Azure OpenAI

Aplikasi web Blazor menyuntikkan AzureOpenAIClient yang terdaftar di bagian atas komponen Home.Razor.

@inject AzureOpenAIClient azureOpenAIClient

Saat pengguna mengirimkan formulir, AzureOpenAIClient pengguna mengirimkan permintaan mereka ke model OpenAI untuk menghasilkan penyelesaian:

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

Menjelajahi kode sampel

Meskipun OpenAI dan Azure OpenAI Service mengandalkan OpenAI (pustaka klien JavaScript umum), perubahan kode kecil diperlukan saat menggunakan titik akhir OpenAI Azure. Mari kita lihat bagaimana sampel ini mengonfigurasi autentikasi tanpa kunci dengan Microsoft Entra ID dan berkomunikasi dengan Azure OpenAI.

Autentikasi tanpa kunci untuk setiap lingkungan

Pustaka klien Azure Identity menyediakan kelas kredensial yang mengimplementasikan protokol TokenCredential pustaka Azure Core. Kredensial mewakili alur autentikasi yang berbeda untuk memperoleh token akses dari Microsoft Entra ID. Kredensial ini dapat dirantai bersama-sama menggunakan ChainedTokenCredential untuk membentuk urutan mekanisme autentikasi yang diurutkan untuk dicoba. Ini memungkinkan Anda untuk menyebarkan kode yang sama di lingkungan produksi dan pengembangan lokal.

Mengonfigurasi autentikasi dengan identitas terkelola

Dalam sampel ini, ./src/azure-authentication.ts menyediakan beberapa fungsi untuk menyediakan autentikasi tanpa kunci untuk Azure OpenAI.

Fungsi pertama, getChainedCredential(), mengembalikan kredensial Azure valid pertama yang ditemukan dalam rantai.

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 dicoba terlebih dahulu. Ini disiapkan dengan variabel lingkungan AZURE_CLIENT_ID dalam runtime produksi dan mampu mengautentikasi melalui identitas terkelola yang ditetapkan pengguna.

  • AzureDeveloperCliCredential dicoba sebagai pilihan kedua. Ini disiapkan saat pengembang masuk dengan Azure Developer CLI dengan menggunakan azd auth login.

Kiat

Urutan kredensial penting, karena token akses Microsoft Entra valid pertama digunakan. Untuk informasi selengkapnya, lihat artikel Gambaran Umum ChainedTokenCredential.

Mendapatkan token pembawa untuk OpenAI

Fungsi kedua di ./src/azure-authentication.ts adalah getTokenProvider(), yang memberikan fungsi callback untuk menyediakan token pembawa yang terikat pada endpoint Azure Cognitive Services.

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

Cuplikan kode sebelumnya menggunakan getBearerTokenProvider untuk mengambil kredensial dan cakupan, lalu mengembalikan panggilan balik yang menyediakan token pembawa.

Membuat klien OpenAI Azure terautentikasi

Fungsi ketiga dalam ./src/azure-authentication.ts adalah getOpenAiClient(), yang mengembalikan klien OpenAI Azure.

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

Kode ini mengambil opsi, termasuk token yang berada dalam cakupan yang tepat, dan membangun AzureOpenAI klien

Streaming jawaban obrolan dengan Azure OpenAI

Gunakan handler rute Fastify berikut di ./src/openai-chat-api.ts untuk mengirim pesan ke Azure OpenAI dan streaming respons.

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

}

Fungsi ini mendapatkan percakapan obrolan, termasuk pesan sebelumnya, dan mengirimkannya ke Azure OpenAI. Saat potongan aliran dikembalikan dari Azure OpenAI, mereka akan dikirim ke klien.

Pertimbangan keamanan lainnya

Artikel ini menunjukkan bagaimana sampel menggunakan ChainedTokenCredential untuk mengautentikasi ke layanan Azure OpenAI.

Sampel ini juga memiliki tindakan GitHub yang memindai file infrastruktur sebagai kode dan menghasilkan laporan yang berisi masalah yang terdeteksi. Untuk memastikan praktik terbaik berkelanjutan di repositori Anda sendiri, kami sarankan siapa pun yang membuat solusi berdasarkan templat kami memastikan bahwa pengaturan pemindaian rahasia GitHub diaktifkan.

Pertimbangkan langkah-langkah keamanan lainnya, seperti:

  • Batasi akses ke kumpulan pengguna aplikasi yang sesuai menggunakan Microsoft Entra.

  • Melindungi instans Azure Container Apps dengan firewall dan/atau Virtual Network.

Membersihkan sumber daya

Membersihkan sumber daya Azure

Sumber daya Azure yang dibuat dalam artikel ini ditagihkan ke langganan Azure Anda. Jika Anda tidak mengharapkan untuk membutuhkan sumber daya ini di masa mendatang, hapus sumber daya tersebut untuk menghindari dikenakan lebih banyak biaya.

Untuk menghapus sumber daya Azure dan menghapus kode sumber, jalankan perintah Azure Developer CLI berikut:

azd down --purge

Membersihkan GitHub Codespace

Menghapus lingkungan GitHub Codespaces memastikan bahwa Anda dapat memaksimalkan jumlah pemberian izin per jam inti gratis yang Anda dapatkan untuk akun Anda.

Penting

Untuk informasi selengkapnya tentang hak istimewa akun GitHub Anda, lihat penyimpanan dan jam inti GitHub Codespaces yang disertakan setiap bulan.

  1. Masuk ke dasbor GitHub Codespaces.

  2. Temukan Codespace yang saat ini berjalan yang bersumber dari repositori Azure-Samples/openai-chat-app-quickstart GitHub.

  3. Buka menu konteks untuk codespace, lalu pilih Hapus.

  1. Masuk ke dasbor GitHub Codespaces.

  2. Temukan Codespace yang saat ini berjalan yang bersumber dari repositori Azure-Samples/openai-chat-app-quickstart-dotnet GitHub.

  3. Buka menu konteks untuk codespace, lalu pilih Hapus.

  1. Masuk ke dasbor GitHub Codespaces.

  2. Temukan Codespace yang saat ini berjalan yang bersumber dari repositori Azure-Samples/openai-chat-app-quickstart-javascript GitHub.

  3. Buka menu konteks untuk codespace, lalu pilih Hapus.

Dapatkan bantuan

Jika masalah Anda tidak diatasi, catat masalah Anda ke repositori Issues.

Langkah berikutnya

Jika masalah Anda tidak diatasi, catat masalah Anda ke repositori Issues.

Jika masalah Anda tidak diatasi, catat masalah Anda ke repositori Issues.