Bekerja dengan model penyelesaian percakapan

Model obrolan adalah model bahasa yang dioptimalkan untuk antarmuka percakapan. Model berperilaku berbeda dari model API penyelesaian lama. Model sebelumnya adalah text-in dan text-out, yang berarti mereka menerima string prompt dan mengembalikan hasil untuk melengkapi prompt. Namun, model terbaru adalah percakapan masuk dan pesan keluar. Model mengharapkan input dalam format transkrip obrolan yang khusus. Mereka mengembalikan hasil yang mewakili pesan yang ditulis oleh model dalam obrolan. Format ini dirancang khusus untuk percakapan multi-giliran, tetapi juga dapat bekerja dengan baik untuk skenario nonchat.

Artikel ini membimbing Anda melalui langkah-langkah memulai dengan model penyelesaian chat. Untuk mendapatkan hasil terbaik, gunakan teknik yang dijelaskan di sini. Jangan mencoba berinteraksi dengan model dengan cara yang sama seperti yang Anda lakukan dengan seri model yang lebih lama karena model sering verbose dan memberikan respons yang kurang berguna.

Prasyarat

  • Model penyelesaian percakapan OpenAI Azure telah disebarkan.
  • Instal pustaka Python OpenAI: pip install openai.
  • Untuk autentikasi Microsoft Entra ID, instal identitas Azure: pip install azure-identity.
  • Untuk contoh penghitungan token, instal tiktoken: pip install tiktoken.
  • Jika Anda menggunakan kunci API, atur AZURE_OPENAI_API_KEY variabel lingkungan.
  • SDK .NET 8.0 atau yang lebih baru.
  • Untuk autentikasi Microsoft Entra ID, instal Azure CLI dan tetapkan peran Cognitive Services User ke akun pengguna Anda.
  • Jika Anda menggunakan kunci API, atur AZURE_OPENAI_API_KEY variabel lingkungan.

Bekerja dengan model penyelesaian percakapan

Cuplikan kode berikut menunjukkan cara paling dasar untuk berinteraksi dengan model yang menggunakan API Penyelesaian Obrolan.

Catatan

API respons menggunakan gaya interaksi obrolan yang sama, tetapi mendukung fitur terbaru yang tidak didukung dengan API penyelesaian obrolan yang lebih lama.

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

response = client.chat.completions.create(
  model="YOUR-DEPLOYMENT-NAME",  # Replace with your model deployment name.
    messages=[
        {"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
        {"role": "user", "content": "Who were the founders of Microsoft?"}
    ]
)

#print(response)
print(response.model_dump_json(indent=2))
print(response.choices[0].message.content)
{
  "id": "chatcmpl-8GHoQAJ3zN2DJYqOFiVysrMQJfe1P",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.",
        "role": "assistant",
        "function_call": null
      },
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ],
  "created": 1698892410,
  "model": "gpt-4o",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 73,
    "prompt_tokens": 29,
    "total_tokens": 102
  },
  "prompt_filter_results": [
    {
      "prompt_index": 0,
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ]
}
Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.

Setiap respons mencakup finish_reason. Nilai yang mungkin untuk finish_reason adalah:

  • stop: API mengembalikan output model lengkap.
  • length: Output model tidak lengkap karena parameter max_tokens atau batas token.
  • content_filter: Konten yang dihilangkan karena isyarat dari filter konten kami.
  • null: Respons API masih berlangsung atau tidak lengkap.

Pertimbangkan pengaturan max_tokens ke nilai yang sedikit lebih tinggi dari biasanya. Nilai yang lebih tinggi memastikan bahwa model tidak berhenti menghasilkan teks sebelum mencapai akhir pesan.

Bekerja dengan API Penyelesaian Obrolan

OpenAI melatih model penyelesaian obrolan untuk menerima input yang diformat sebagai percakapan. Parameter pesan mengambil array objek pesan dengan percakapan yang diatur berdasarkan peran. Saat Anda menggunakan API Python, daftar kamus digunakan.

Format penyelesaian obrolan dasar adalah:

{"role": "system", "content": "Provide some context and/or instructions to the model"},
{"role": "user", "content": "The user's message goes here"}

Percakapan dengan satu contoh jawaban diikuti dengan pertanyaan akan terlihat seperti:

{"role": "system", "content": "Provide some context and/or instructions to the model."},
{"role": "user", "content": "Example question goes here."},
{"role": "assistant", "content": "Example answer goes here."},
{"role": "user", "content": "First question/message for the model to actually respond to."}

Peran sistem

Peran sistem, juga dikenal sebagai pesan sistem, disertakan di awal array. Pesan ini memberikan instruksi awal untuk model. Anda dapat memberikan berbagai informasi dalam peran sistem, seperti:

  • Deskripsi singkat tentang asisten.
  • Sifat kepribadian dari asisten.
  • Instruksi atau aturan yang Anda inginkan untuk diikuti asisten.
  • Data atau informasi yang diperlukan untuk model, seperti pertanyaan yang relevan dari FAQ.

Anda dapat menyesuaikan peran sistem untuk kasus penggunaan Anda atau menyertakan instruksi dasar. Peran/pesan sistem bersifat opsional, tetapi kami sarankan Anda setidaknya menyertakan peran dasar untuk mendapatkan hasil terbaik.

Pesan

Setelah peran sistem, Anda dapat menyertakan serangkaian pesan antara user dan assistant.

 {"role": "user", "content": "What is thermodynamics?"}

Untuk memicu respons dari model, akhiri dengan pesan pengguna untuk menunjukkan bahwa itu adalah giliran asisten untuk merespons. Anda juga dapat menyertakan serangkaian contoh pesan antara pengguna dan asisten sebagai cara untuk melakukan pembelajaran beberapa kali.

Contoh petunjuk pesan

Bagian berikut menunjukkan contoh berbagai gaya permintaan yang dapat Anda gunakan dengan model penyelesaian obrolan. Contoh-contoh ini hanyalah titik awal. Anda dapat bereksperimen dengan permintaan yang berbeda untuk menyesuaikan perilaku untuk kasus penggunaan Anda sendiri.

Contoh dasar

Jika Anda ingin model penyelesaian obrolan Anda bertingkah mirip dengan chatgpt.com, Anda dapat menggunakan pesan sistem dasar seperti Assistant is a large language model trained by OpenAI.

{"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
{"role": "user", "content": "Who were the founders of Microsoft?"}

Contoh dengan instruksi

Untuk beberapa skenario, Anda mungkin ingin memberikan lebih banyak instruksi kepada model untuk menentukan pagar pembatas untuk apa yang dapat dilakukan model.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions.
Instructions: 
- Only answer questions related to taxes. 
- If you're unsure of an answer, you can say "I don't know" or "I'm not sure" and recommend users go to the IRS website for more information. "},
{"role": "user", "content": "When are my taxes due?"}

Menggunakan data untuk dasar

Anda juga dapat menyertakan data atau informasi yang relevan dalam pesan sistem untuk memberikan konteks tambahan model untuk percakapan. Jika Anda hanya perlu menyertakan sejumlah kecil informasi, Anda dapat menghardcode di pesan sistem. Jika Anda memiliki sejumlah besar data yang harus diperhatikan model, Anda dapat menggunakan embeddings atau produk seperti Pencarian Azure AI untuk mengambil informasi yang paling relevan pada waktu kueri.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI in Microsoft Foundry Models. Only answer questions using the context below and if you're not sure of an answer, you can say 'I don't know'.

Context:
- Azure OpenAI provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI gives customers advanced language AI with OpenAI GPT-4o, GPT-image series, and Embeddings models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft’s principles for responsible AI use."
},
{"role": "user", "content": "What is Azure OpenAI?"}

Pembelajaran beberapa bidikan dengan penyelesaian obrolan

Anda juga dapat memberikan contoh beberapa bidikan untuk model. Pendekatan untuk pembelajaran few-shot mengalami sedikit perubahan karena format prompt baru. Anda sekarang dapat menyertakan serangkaian pesan antara pengguna dan asisten dalam perintah sebagai contoh beberapa bidikan. Dengan menggunakan contoh-contoh ini, Anda dapat menyemai jawaban atas pertanyaan umum untuk memandu model atau mengajarkan perilaku tertentu kepada model.

Contoh ini menunjukkan bagaimana Anda dapat menggunakan pembelajaran beberapa bidikan dengan GPT-35-Turbo dan GPT-4. Anda dapat bereksperimen dengan pendekatan yang berbeda untuk melihat apa yang paling sesuai untuk kasus penggunaan Anda.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions. "},
{"role": "user", "content": "When do I need to file my taxes by?"},
{"role": "assistant", "content": "In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file."},
{"role": "user", "content": "How can I check the status of my tax refund?"},
{"role": "assistant", "content": "You can check the status of your tax refund by visiting https://www.irs.gov/refunds"}

Gunakan fitur penyelesaian obrolan untuk skenario nonchat

API Penyelesaian Obrolan dirancang untuk bekerja dengan percakapan multi-giliran, tetapi juga berfungsi dengan baik untuk skenario nonchat.

Misalnya, untuk skenario ekstraksi entitas, Anda mungkin menggunakan perintah berikut:

{"role": "system", "content": "You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
   "name": "",
   "company": "",
   "phone_number": ""
}"},
{"role": "user", "content": "Hello. My name is Robert Smith. I'm calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?"}

Membuat perulangan percakapan dasar

Contoh sejauh ini menunjukkan mekanisme dasar berinteraksi dengan API Penyelesaian Obrolan. Contoh ini memperlihatkan kepada Anda cara membuat perulangan percakapan yang melakukan tindakan berikut:

  • Terus memproses input konsol dan memformatnya dengan tepat sebagai bagian dari daftar pesan sebagai konten terkait peran pengguna.
  • Menghasilkan tanggapan yang dicetak ke konsol, diformat, dan ditambahkan ke daftar pesan sebagai konten peran asisten.

Setiap kali pertanyaan baru diajukan, transkrip percakapan yang sedang berjalan sejauh ini dikirim bersama dengan pertanyaan terbaru. Karena model tidak memiliki memori, Anda perlu mengirim transkrip yang diperbarui dengan setiap pertanyaan baru atau model akan kehilangan konteks pertanyaan dan jawaban sebelumnya.

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

conversation=[{"role": "system", "content": "You are a helpful assistant."}]

while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})

    response = client.chat.completions.create(
      model="YOUR-DEPLOYMENT-NAME",  # Replace with your model deployment name.
        messages=conversation
    )

    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

Saat menjalankan kode sebelumnya, Anda mendapatkan jendela konsol kosong. Masukkan pertanyaan pertama Anda di jendela lalu pilih Enter kunci. Setelah respons dikembalikan, Anda dapat mengulangi proses dan terus mengajukan pertanyaan.

Mengelola percakapan

Contoh sebelumnya berjalan hingga Anda mencapai batas token model (jendela konteks). Dengan setiap pertanyaan yang diajukan messages dan jawaban yang diterima, daftar bertambah dalam ukuran. Jumlah token gabungan Anda messages ditambah token output yang diminta harus tetap berada dalam batas model, atau permintaan gagal. Lihat halaman model untuk batas token saat ini.

Anda bertanggung jawab untuk memastikan bahwa perintah dan penyelesaian berada dalam batas token. Untuk percakapan yang lebih lama, Anda perlu melacak jumlah token dan hanya mengirim permintaan model yang termasuk dalam batas. Atau, dengan API respons , Anda dapat memiliki API menangani pemotongan/manajemen riwayat percakapan untuk Anda.

Sampel kode berikut menampilkan contoh perulangan obrolan sederhana dengan teknik untuk menangani jumlah token sebanyak 4.096 dengan menggunakan pustaka tiktoken dari OpenAI.

Anda mungkin perlu meningkatkan versi tiktoken Anda dengan pip install tiktoken --upgrade.

import tiktoken
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

system_message = {"role": "system", "content": "You are a helpful assistant."}
max_response_tokens = 250
token_limit = 4096
conversation = []
conversation.append(system_message)

def num_tokens_from_messages(messages, model="gpt-4o"):
    """Return the number of tokens used by a list of messages."""
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        print("Warning: model not found. Using o200k_base encoding.")
        encoding = tiktoken.get_encoding("o200k_base")
    
    if model in {
        "gpt-4o",
        "gpt-4o-mini",
        "gpt-5",
        "gpt-4.1",
        "o1",
        "o1-mini",
        "o3",
        "o3-mini",
        "o4-mini",
    }:
        tokens_per_message = 3
        tokens_per_name = 1

    elif any(model.startswith(prefix) for prefix in [
        "gpt-4o-", 
        "gpt-5-", 
        "gpt-4.1-",
        "o1-", 
        "o3-", 
        "o4-mini-",
    ]):
        tokens_per_message = 3
        tokens_per_name = 1
    else:
        raise NotImplementedError(
            f"""num_tokens_from_messages() is not implemented for model {model}. """
        )
    
    num_tokens = 0
    for message in messages:
        num_tokens += tokens_per_message
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
            if key == "name":
                num_tokens += tokens_per_name
    num_tokens += 3  
    return num_tokens

while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})
    conv_history_tokens = num_tokens_from_messages(conversation, model="gpt-4o")

    while conv_history_tokens + max_response_tokens >= token_limit:
        del conversation[1] 
        conv_history_tokens = num_tokens_from_messages(conversation, model="gpt-4o")

    response = client.chat.completions.create(
      model="YOUR-DEPLOYMENT-NAME",
        messages=conversation,
        temperature=0.7,
        max_tokens=max_response_tokens
    )

    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

Dalam contoh ini, setelah jumlah token tercapai, pesan terlama dalam transkrip percakapan dihapus. Untuk efisiensi, del digunakan alih-alih pop(). Kita mulai dari indeks 1 untuk selalu mempertahankan pesan sistem dan hanya menghapus pesan pengguna atau asisten. Seiring waktu, metode pengelolaan percakapan ini dapat menyebabkan kualitas percakapan menurun karena model secara bertahap kehilangan konteks bagian percakapan sebelumnya.

Pendekatan alternatif adalah membatasi durasi percakapan hingga panjang token maksimum atau jumlah giliran tertentu. Setelah batas token maksimum tercapai, model akan kehilangan konteks jika Anda mengizinkan percakapan untuk melanjutkan. Anda dapat meminta pengguna untuk memulai percakapan baru dan menghapus daftar pesan untuk memulai percakapan baru dengan batas token lengkap yang tersedia.

Bagian penghitungan token dari kode yang ditunjukkan sebelumnya adalah versi yang disederhanakan dari salah satu contoh buku masak OpenAI.

Pemecahan masalah

Gagal membuat penyelesaian karena model menghasilkan output Unicode yang tidak valid

Kode Kesalahan Pesan Kesalahan Solusi
500 500 - InternalServerError: Kode kesalahan: 500 - {"error": {"message": "Gagal membuat penyelesaian karena model menghasilkan keluaran Unicode yang tidak valid"}} Anda dapat meminimalkan terjadinya kesalahan ini dengan mengurangi temperatur dari permintaan Anda hingga kurang dari 1 dan memastikan Anda menggunakan klien dengan fungsi coba ulang. Mengulangi permintaan sering kali menghasilkan respons yang berhasil.

Kesalahan umum

  • 401/403 (autentikasi): Verifikasi kunci API Anda, atau konfirmasikan bahwa Anda memiliki akses Microsoft Entra ID ke sumber daya OpenAI Azure.
  • 400/404 (penyebaran tidak ditemukan): Konfirmasikan bahwa model cocok dengan nama penyebaran Anda.
  • URL tidak valid: Konfirmasikan bahwa base_url berakhir dengan /openai/v1/.

Konfigurasi

  1. Buat aplikasi konsol .NET baru:

    dotnet new console -n chat-completions
    cd chat-completions
    
  2. Instal paket NuGet yang diperlukan:

    dotnet add package OpenAI --prerelease
    dotnet add package Azure.Identity
    
  3. Untuk autentikasi tanpa kunci dengan Microsoft Entra ID, masuk ke Azure:

    az login
    

Bekerja dengan model penyelesaian percakapan

Cuplikan kode berikut menunjukkan cara paling dasar untuk berinteraksi dengan model yang menggunakan API Penyelesaian Obrolan.

Catatan

API respons menggunakan gaya interaksi obrolan yang sama, tetapi mendukung fitur terbaru yang tidak didukung dengan API penyelesaian obrolan yang lebih lama.

using Azure.Identity;
using OpenAI;
using OpenAI.Chat;
using System.ClientModel.Primitives;

#pragma warning disable OPENAI001

BearerTokenPolicy tokenPolicy = new(
    new DefaultAzureCredential(),
    "https://ai.azure.com/.default");

ChatClient client = new(
    model: "YOUR-DEPLOYMENT-NAME",
    authenticationPolicy: tokenPolicy,
    options: new OpenAIClientOptions()
    {
        Endpoint = new Uri("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/")
    }
);

ChatCompletion completion = await client.CompleteChatAsync(
[
    new SystemChatMessage("Assistant is a large language model trained by OpenAI."),
    new UserChatMessage("Who were the founders of Microsoft?"),
]);

Console.WriteLine(completion.Content[0].Text);
Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.

Setiap respons mencakup FinishReason. Nilai yang mungkin untuk FinishReason adalah:

  • Berhenti: API mengembalikan output model lengkap.
  • Panjang: Output model tidak lengkap karena MaxOutputTokenCount parameter atau batas token.
  • ContentFilter: Konten yang dihilangkan karena bendera filter konten.
  • null: Respons API masih berlangsung atau tidak lengkap.

Pertimbangkan pengaturan MaxOutputTokenCount ke nilai yang sedikit lebih tinggi dari biasanya. Nilai yang lebih tinggi memastikan bahwa model tidak berhenti menghasilkan teks sebelum mencapai akhir pesan.

Bekerja dengan API Penyelesaian Obrolan

OpenAI melatih model penyelesaian obrolan untuk menerima input yang diformat sebagai percakapan. Parameter pesan mengambil array objek pesan dengan percakapan yang diatur berdasarkan peran. Saat Anda menggunakan SDK .NET, Anda menggunakan kelas pesan yang ditik dengan kuat untuk setiap peran.

Format penyelesaian obrolan dasar adalah:

new SystemChatMessage("Provide some context and/or instructions to the model"),
new UserChatMessage("The user's message goes here")

Percakapan dengan satu contoh jawaban diikuti dengan pertanyaan akan terlihat seperti:

new SystemChatMessage("Provide some context and/or instructions to the model."),
new UserChatMessage("Example question goes here."),
new AssistantChatMessage("Example answer goes here."),
new UserChatMessage("First question/message for the model to actually respond to.")

Peran sistem

Peran sistem, juga dikenal sebagai pesan sistem, disertakan di awal array. Pesan ini memberikan instruksi awal untuk model. Anda dapat memberikan berbagai informasi dalam peran sistem, seperti:

  • Deskripsi singkat tentang asisten.
  • Sifat kepribadian dari asisten.
  • Instruksi atau aturan yang Anda inginkan untuk diikuti asisten.
  • Data atau informasi yang diperlukan untuk model, seperti pertanyaan yang relevan dari FAQ.

Anda dapat menyesuaikan peran sistem untuk kasus penggunaan Anda atau menyertakan instruksi dasar. Peran/pesan sistem bersifat opsional, tetapi kami sarankan Anda setidaknya menyertakan peran dasar untuk mendapatkan hasil terbaik.

Pesan

Setelah peran sistem, Anda dapat menyertakan serangkaian pesan antara user dan assistant.

new UserChatMessage("What is thermodynamics?")

Untuk memicu respons dari model, akhiri dengan pesan pengguna untuk menunjukkan bahwa itu adalah giliran asisten untuk merespons. Anda juga dapat menyertakan serangkaian contoh pesan antara pengguna dan asisten sebagai cara untuk melakukan pembelajaran beberapa kali.

Contoh petunjuk pesan

Bagian berikut menunjukkan contoh berbagai gaya permintaan yang dapat Anda gunakan dengan model penyelesaian obrolan. Contoh-contoh ini hanyalah titik awal. Anda dapat bereksperimen dengan permintaan yang berbeda untuk menyesuaikan perilaku untuk kasus penggunaan Anda sendiri.

Contoh dasar

Jika Anda ingin model penyelesaian obrolan Anda bertingkah mirip dengan chatgpt.com, Anda dapat menggunakan pesan sistem dasar seperti Assistant is a large language model trained by OpenAI.

new SystemChatMessage("Assistant is a large language model trained by OpenAI."),
new UserChatMessage("Who were the founders of Microsoft?")

Contoh dengan instruksi

Untuk beberapa skenario, Anda mungkin ingin memberikan lebih banyak instruksi kepada model untuk menentukan pagar pembatas untuk apa yang dapat dilakukan model.

new SystemChatMessage(@"Assistant is an intelligent chatbot designed to help users answer their tax related questions.
Instructions:
- Only answer questions related to taxes.
- If you're unsure of an answer, you can say ""I don't know"" or ""I'm not sure"" and recommend users go to the IRS website for more information."),
new UserChatMessage("When are my taxes due?")

Menggunakan data untuk dasar

Anda juga dapat menyertakan data atau informasi yang relevan dalam pesan sistem untuk memberikan konteks tambahan model untuk percakapan. Jika Anda hanya perlu menyertakan sejumlah kecil informasi, Anda dapat menghardcode di pesan sistem. Jika Anda memiliki sejumlah besar data yang harus diperhatikan model, Anda dapat menggunakan embeddings atau produk seperti Pencarian Azure AI untuk mengambil informasi yang paling relevan pada waktu kueri.

new SystemChatMessage(@"Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI in Microsoft Foundry Models. Only answer questions using the context below and if you're not sure of an answer, you can say 'I don't know'.

Context:
- Azure OpenAI provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI gives customers advanced language AI with OpenAI GPT-4o, GPT-image series, and Embeddings models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft's principles for responsible AI use."),
new UserChatMessage("What is Azure OpenAI?")

Pembelajaran beberapa bidikan dengan penyelesaian obrolan

Anda juga dapat memberikan contoh beberapa bidikan untuk model. Anda dapat menyertakan serangkaian pesan antara pengguna dan asisten dalam perintah sebagai contoh beberapa bidikan. Dengan menggunakan contoh-contoh ini, Anda dapat menyemai jawaban atas pertanyaan umum untuk memandu model atau mengajarkan perilaku tertentu kepada model.

new SystemChatMessage("Assistant is an intelligent chatbot designed to help users answer their tax related questions."),
new UserChatMessage("When do I need to file my taxes by?"),
new AssistantChatMessage("In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file."),
new UserChatMessage("How can I check the status of my tax refund?"),
new AssistantChatMessage("You can check the status of your tax refund by visiting https://www.irs.gov/refunds")

Gunakan fitur penyelesaian obrolan untuk skenario nonchat

API Penyelesaian Obrolan dirancang untuk bekerja dengan percakapan multi-giliran, tetapi juga berfungsi dengan baik untuk skenario nonchat.

Misalnya, untuk skenario ekstraksi entitas, Anda mungkin menggunakan perintah berikut:

new SystemChatMessage(@"You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
   ""name"": """",
   ""company"": """",
   ""phone_number"": """"
}"),
new UserChatMessage("Hello. My name is Robert Smith. I'm calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?")

Membuat perulangan percakapan dasar

Contoh sejauh ini menunjukkan mekanisme dasar berinteraksi dengan API Penyelesaian Obrolan. Contoh ini memperlihatkan kepada Anda cara membuat perulangan percakapan yang melakukan tindakan berikut:

  • Terus memproses input konsol dan memformatnya dengan tepat sebagai bagian dari daftar pesan sebagai konten terkait peran pengguna.
  • Menghasilkan tanggapan yang dicetak ke konsol, diformat, dan ditambahkan ke daftar pesan sebagai konten peran asisten.

Setiap kali pertanyaan baru diajukan, transkrip percakapan yang sedang berjalan sejauh ini dikirim bersama dengan pertanyaan terbaru. Karena model tidak memiliki memori, Anda perlu mengirim transkrip yang diperbarui dengan setiap pertanyaan baru atau model akan kehilangan konteks pertanyaan dan jawaban sebelumnya.

using Azure.Identity;
using OpenAI;
using OpenAI.Chat;
using System.ClientModel.Primitives;

#pragma warning disable OPENAI001

BearerTokenPolicy tokenPolicy = new(
    new DefaultAzureCredential(),
    "https://ai.azure.com/.default");

ChatClient client = new(
    model: "YOUR-DEPLOYMENT-NAME",
    authenticationPolicy: tokenPolicy,
    options: new OpenAIClientOptions()
    {
        Endpoint = new Uri("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/")
    }
);

List<ChatMessage> conversation =
[
    new SystemChatMessage("You are a helpful assistant."),
];

while (true)
{
    Console.Write("Q: ");
    string? userInput = Console.ReadLine();
    if (string.IsNullOrWhiteSpace(userInput)) break;

    conversation.Add(new UserChatMessage(userInput));

    ChatCompletion response = await client.CompleteChatAsync(conversation);
    string assistantMessage = response.Content[0].Text;

    conversation.Add(new AssistantChatMessage(assistantMessage));
    Console.WriteLine($"\n{assistantMessage}\n");
}

Saat menjalankan kode sebelumnya, Anda mendapatkan jendela konsol kosong. Masukkan pertanyaan pertama Anda di jendela lalu pilih Enter kunci. Setelah respons dikembalikan, Anda dapat mengulangi proses dan terus mengajukan pertanyaan.

Mengelola percakapan

Contoh sebelumnya berjalan hingga batas token model (jendela konteks) tercapai. Dengan setiap pertanyaan yang diajukan conversation dan jawaban yang diterima, daftar bertambah dalam ukuran. Jumlah token gabungan pesan Anda ditambah token output yang diminta harus tetap berada dalam batas model, atau permintaan gagal. Lihat halaman model untuk batas token saat ini.

Anda bertanggung jawab untuk memastikan bahwa perintah dan penyelesaian berada dalam batas token. Untuk percakapan yang lebih lama, Anda perlu melacak jumlah token dan hanya mengirim permintaan model yang termasuk dalam batas. Atau, dengan API respons , Anda dapat memiliki API menangani pemotongan dan manajemen riwayat percakapan untuk Anda.

Sampel kode berikut menunjukkan contoh perulangan obrolan sederhana yang memangkas riwayat percakapan saat jumlah pesan tersimpan mendekati batas. Ini menghapus pesan non-sistem terlama agar percakapan tetap dalam batas.

Anda dapat menginstal paket Microsoft.ML.Tokenizers dan Microsoft.ML.Tokenizers.Data.0200kBase untuk penghitungan token yang akurat:

dotnet add package Microsoft.ML.Tokenizers
dotnet add package Microsoft.ML.Tokenizers.Data.O200kBase
using Azure.Identity;
using Microsoft.ML.Tokenizers;
using OpenAI;
using OpenAI.Chat;
using System.ClientModel.Primitives;

#pragma warning disable OPENAI001

BearerTokenPolicy tokenPolicy = new(
    new DefaultAzureCredential(),
    "https://ai.azure.com/.default");

ChatClient client = new(
    model: "YOUR-DEPLOYMENT-NAME",
    authenticationPolicy: tokenPolicy,
    options: new OpenAIClientOptions()
    {
        Endpoint = new Uri("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/")
    }
);

const int MaxResponseTokens = 250;
const int TokenLimit = 4096;

var tokenizer = TiktokenTokenizer.CreateForModel("gpt-4o");

List<ChatMessage> conversation =
[
    new SystemChatMessage("You are a helpful assistant."),
];

static int CountTokens(TiktokenTokenizer tokenizer, IEnumerable<ChatMessage> messages)
{
    int count = 3; // base overhead for reply priming
    foreach (var message in messages)
    {
        count += 4; // per-message overhead
        string content = message switch
        {
            SystemChatMessage s => s.Content[0].Text ?? string.Empty,
            UserChatMessage u => u.Content[0].Text ?? string.Empty,
            AssistantChatMessage a => a.Content[0].Text ?? string.Empty,
            _ => string.Empty
        };
        count += tokenizer.CountTokens(content);
    }
    return count;
}

while (true)
{
    Console.Write("Q: ");
    string? userInput = Console.ReadLine();
    if (string.IsNullOrWhiteSpace(userInput)) break;

    conversation.Add(new UserChatMessage(userInput));

    int historyTokens = CountTokens(tokenizer, conversation);
    while (historyTokens + MaxResponseTokens >= TokenLimit && conversation.Count > 2)
    {
        conversation.RemoveAt(1); // remove oldest non-system message
        historyTokens = CountTokens(tokenizer, conversation);
    }

    ChatCompletionOptions options = new() { MaxOutputTokenCount = MaxResponseTokens };
    ChatCompletion response = await client.CompleteChatAsync(conversation, options);
    string assistantMessage = response.Content[0].Text;

    conversation.Add(new AssistantChatMessage(assistantMessage));
    Console.WriteLine($"\n{assistantMessage}\n");
}

Dalam contoh ini, setelah jumlah token tercapai, pesan terlama dalam transkrip percakapan dihapus. Kami selalu mempertahankan pesan sistem dan hanya menghapus pesan pengguna atau asisten. Seiring waktu, metode pengelolaan percakapan ini dapat menyebabkan kualitas percakapan menurun karena model secara bertahap kehilangan konteks bagian percakapan sebelumnya.

Pendekatan alternatif adalah membatasi durasi percakapan hingga panjang token maksimum atau jumlah giliran tertentu. Setelah batas token maksimum tercapai, model akan kehilangan konteks jika Anda mengizinkan percakapan untuk melanjutkan. Anda dapat meminta pengguna untuk memulai percakapan baru dan menghapus daftar pesan untuk memulai percakapan baru dengan batas token lengkap yang tersedia.

Pemecahan masalah

Gagal membuat penyelesaian karena model menghasilkan output Unicode yang tidak valid

Kode Kesalahan Pesan Kesalahan Solusi
500 500 - InternalServerError: Kode kesalahan: 500 - {"error": {"message": "Gagal membuat penyelesaian karena model menghasilkan keluaran Unicode yang tidak valid"}} Anda dapat meminimalkan terjadinya kesalahan ini dengan mengurangi Temperature di dalam ChatCompletionOptions menjadi kurang dari 1 dan memastikan bahwa Anda menggunakan klien dengan logika coba ulang. Mengulangi permintaan sering kali menghasilkan respons yang berhasil.

Kesalahan umum

  • 401/403 (autentikasi): Verifikasi kunci API Anda atau konfirmasikan bahwa Anda memiliki akses Microsoft Entra ID ke sumber daya OpenAI Azure.
  • 400/404 (penerapan tidak ditemukan): Konfirmasikan bahwa nama model yang diberikan pada ChatClient konstruktor sesuai dengan nama penerapan Anda.
  • Titik akhir tidak valid: Konfirmasikan bahwa Endpoint URI di OpenAIClientOptions menunjuk ke https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/.