Skip to main content
Generasi teks

Percakapan multi-putaran

API Qwen bersifat tanpa status (stateless). Untuk mengimplementasikan percakapan multi-putaran, sertakan riwayat percakapan dalam setiap permintaan. Gunakan pemotongan (truncation), ringkasan (summarization), atau pengambilan (retrieval) untuk mengelola konteks dan mengurangi konsumsi token.

Topik ini mencakup antarmuka Chat Completion yang kompatibel dengan OpenAI dan DashScope. Untuk alternatif yang lebih sederhana, lihat Kompatibel dengan OpenAI - Respons.

Cara kerja

Untuk mengimplementasikan percakapan multi-putaran, pertahankan array messages. Setelah setiap putaran, tambahkan pertanyaan pengguna dan respons model, lalu gunakan array yang telah diperbarui tersebut untuk permintaan berikutnya. Contoh berikut menunjukkan bagaimana keadaan array messages berubah selama percakapan multi-putaran:
  1. Putaran pertama Tambahkan pertanyaan pengguna ke array messages.
// Gunakan model teks
[
    {"role": "user", "content": "Rekomendasikan film fiksi ilmiah tentang eksplorasi luar angkasa."}
]

// Gunakan model multimodal, misalnya Qwen-VL
// {"role": "user",
//       "content": [{"type": "image_url","image_url": {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"}},
//                   {"type": "text", "text": "Produk apa saja yang ditampilkan dalam gambar ini?"}]
// }
  1. Putaran kedua Tambahkan respons model dan pertanyaan terbaru pengguna ke array messages.
// Gunakan model teks
[
    {"role": "user", "content": "Rekomendasikan film fiksi ilmiah tentang eksplorasi luar angkasa."},
    {"role": "assistant", "content": "Saya merekomendasikan 'XXX'. Ini adalah karya fiksi ilmiah klasik."},
    {"role": "user", "content": "Siapa sutradara film ini?"}
]

// Gunakan model multimodal, misalnya Qwen-VL
//[
//    {"role": "user", "content": [
//                    {"type": "image_url","image_url": {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"}},
//                   {"type": "text", "text": "Produk apa saja yang ditampilkan dalam gambar ini?"}]},
//    {"role": "assistant", "content": "Gambar tersebut menampilkan tiga item: sepasang overall biru muda, kaus lengan pendek bergaris biru-putih, dan sepasang sepatu kets putih."},
//    {"role": "user", "content": "Gaya apa itu?"}
//]

Mulai

  • Kompatibel dengan OpenAI
  • DashScope
Python
import os
from openai import OpenAI

def get_response(messages):
    client = OpenAI(
        # Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
        # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Studio Model Anda: api_key="sk-xxx",
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL bervariasi berdasarkan wilayah.

        base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
    )
    # Untuk daftar model, lihat https://www.alibabacloud.com/help/en/model-studio/getting-started/models
    completion = client.chat.completions.create(model="qwen-plus", messages=messages)
    return completion

# Inisialisasi array messages
messages = [
    {
        "role": "system",
        "content": """Anda adalah tenaga penjual di toko ponsel Bailian. Tugas Anda adalah merekomendasikan ponsel kepada pengguna. Ponsel memiliki dua parameter: ukuran layar (termasuk 6,1 inci, 6,5 inci, dan 6,7 inci) dan resolusi (termasuk 2K dan 4K).
        Anda hanya boleh menanyakan satu parameter kepada pengguna dalam satu waktu. Jika pengguna tidak memberikan informasi lengkap, Anda perlu mengajukan pertanyaan lanjutan untuk mendapatkan parameter yang hilang. Ketika semua parameter telah dikumpulkan, Anda harus mengatakan: Saya telah memahami maksud pembelian Anda. Mohon tunggu.""",
    }
]
assistant_output = "Selamat datang di toko ponsel Bailian. Ukuran layar seperti apa yang Anda cari?"
print(f"Output model: {assistant_output}\n")
while "Saya telah memahami maksud pembelian Anda" not in assistant_output:
    user_input = input("Silakan masukkan: ")
    # Tambahkan pertanyaan pengguna ke daftar messages
    messages.append({"role": "user", "content": user_input})
    assistant_output = get_response(messages).choices[0].message.content
    # Tambahkan respons model ke daftar messages
    messages.append({"role": "assistant", "content": assistant_output})
    print(f"Output model: {assistant_output}")
    print("\n")

Untuk model multimodal

Model multimodal mendukung gambar dan audio dalam percakapan. Implementasinya berbeda dari model teks sebagai berikut:
  • Konstruksi pesan pengguna: Pesan pengguna untuk model multimodal dapat berisi informasi multimodal, seperti gambar dan audio, selain teks.
  • Antarmuka SDK DashScope: Saat menggunakan SDK Python DashScope, panggil antarmuka MultiModalConversation. Saat menggunakan SDK Java DashScope, panggil kelas MultiModalConversation.
Untuk model multimodal, lihat: Pemahaman gambar dan video, dan Kimi. Untuk Qwen-Omni, lihat Non-real-time (Qwen-Omni). Qwen-VL-OCR dan Qwen3-Omni-Captioner dirancang untuk tugas single-turn spesifik dan tidak mendukung percakapan multi-putaran.
  • Kompatibel dengan OpenAI
  • DashScope
Python
from openai import OpenAI
import os

client = OpenAI(
    # Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
    # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Studio Model Anda: api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL bervariasi berdasarkan wilayah.

    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
)
messages = [
        {"role": "user",
         "content": [
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"
                },
            },
            {"type": "text", "text": "Produk apa saja yang ditampilkan dalam gambar ini?"},
        ],
    }
]
completion = client.chat.completions.create(
    model="qwen3-vl-plus",  #  Anda dapat mengganti ini dengan model multimodal lain dan menyesuaikan messages sesuai kebutuhan
    messages=messages,
    )
print(f"Output putaran pertama: {completion.choices[0].message.content}")

assistant_message = completion.choices[0].message
messages.append(assistant_message.model_dump())
messages.append({
        "role": "user",
        "content": [
        {
            "type": "text",
            "text": "Gaya apa itu?"
        }
        ]
    })
completion = client.chat.completions.create(
    model="qwen3-vl-plus",
    messages=messages,
    )

print(f"Output putaran kedua: {completion.choices[0].message.content}")

Untuk model berpikir

Model berpikir mengembalikan reasoning_content (proses berpikir) dan content (respons). Saat memperbarui messages, simpan hanya content dan abaikan reasoning_content.
[
    {"role": "user", "content": "Rekomendasikan film fiksi ilmiah tentang eksplorasi luar angkasa."},
    {"role": "assistant", "content": "Saya merekomendasikan 'XXX'. Ini adalah karya fiksi ilmiah klasik."}, # Jangan tambahkan field reasoning_content saat menambahkan ke konteks
    {"role": "user", "content": "Siapa sutradara film ini?"}
]
Untuk informasi lebih lanjut tentang model berpikir, lihat Pemikiran mendalam, Pemahaman gambar dan video, dan Penalaran visual.
Untuk informasi lebih lanjut tentang mengimplementasikan percakapan multi-putaran dengan Qwen3-Omni-Flash (mode berpikir), lihat omni-modal.
  • Kompatibel dengan OpenAI
  • DashScope
  • Python
  • Node.js
  • HTTP

Kode contoh

from openai import OpenAI
import os

# Inisialisasi klien OpenAI
client = OpenAI(
    # Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
    # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Studio Model Anda: api_key="sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
)

messages = []
conversation_idx = 1
while True:
    reasoning_content = ""  # Definisikan proses berpikir lengkap
    answer_content = ""     # Definisikan respons lengkap
    is_answering = False   # Tentukan apakah akan mengakhiri proses berpikir dan mulai merespons
    print("="*20+f"Putaran Percakapan {conversation_idx}"+"="*20)
    conversation_idx += 1
    user_input = input("Masukkan pesan Anda (ketik 'exit' untuk mengakhiri): ")
    # Masukkan 'exit' untuk mengakhiri percakapan multi-putaran dan menghindari loop tak berujung
    if user_input.strip().lower() == "exit":
        print("Percakapan diakhiri.")
        break
    user_msg = {"role": "user", "content": user_input}
    messages.append(user_msg)
    # Buat permintaan chat completion
    completion = client.chat.completions.create(
        # Anda dapat mengganti ini dengan model pemikiran mendalam lain sesuai kebutuhan
        model="qwen-plus",
        messages=messages,
        extra_body={"enable_thinking": True},
        stream=True,
        # stream_options={
        #     "include_usage": True
        # }
    )
    print("\n" + "=" * 20 + "Proses Berpikir" + "=" * 20 + "\n")
    for chunk in completion:
        # Jika chunk.choices kosong, cetak penggunaan
        if not chunk.choices:
            print("\nPenggunaan:")
            print(chunk.usage)
        else:
            delta = chunk.choices[0].delta
            # Cetak proses berpikir
            if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
                print(delta.reasoning_content, end='', flush=True)
                reasoning_content += delta.reasoning_content
            else:
                # Mulai merespons
                if delta.content != "" and is_answering is False:
                    print("\n" + "=" * 20 + "Respons Lengkap" + "=" * 20 + "\n")
                    is_answering = True
                # Cetak proses respons
                print(delta.content, end='', flush=True)
                answer_content += delta.content
    # Tambahkan konten respons model ke konteks
    messages.append({"role": "assistant", "content": answer_content})
    print("\n")

Menerapkan ke produksi

Percakapan multi-putaran dapat mengonsumsi banyak token dan melebihi panjang konteks model, menyebabkan kesalahan. Gunakan strategi berikut untuk mengelola konteks dan mengendalikan biaya.

1. Manajemen konteks

Array messages bertambah panjang setiap putaran dan dapat melebihi batas token model. Gunakan metode berikut untuk mengelola panjang konteks:

1.1. Pemotongan konteks

Pertahankan hanya N putaran terbaru ketika riwayat menjadi terlalu panjang. Metode ini mudah diimplementasikan tetapi kehilangan informasi percakapan sebelumnya.

1.2. Ringkasan bergulir

Buat ringkasan konteks seiring berjalannya percakapan untuk memadatkan riwayat dan mengontrol panjang tanpa kehilangan informasi inti: a. Ketika riwayat mencapai 70% dari panjang konteks maksimum, ekstrak bagian awal (misalnya separuh pertama) dan buat panggilan API terpisah untuk menghasilkan "ringkasan memori". b. Pada permintaan berikutnya, ganti riwayat panjang dengan "ringkasan memori" dan tambahkan putaran terbaru.

1.3. Pengambilan berbasis vektor

Ringkasan bergulir dapat kehilangan beberapa informasi. Untuk memungkinkan model mengingat kembali informasi relevan dari riwayat percakapan yang panjang, gunakan pengambilan berdasarkan permintaan alih-alih meneruskan konteks secara linear: a. Setelah setiap putaran percakapan, simpan percakapan dalam database vektor. b. Ketika pengguna mengajukan pertanyaan, ambil catatan percakapan yang relevan berdasarkan kemiripan. c. Gabungkan catatan percakapan yang diambil dengan input pengguna terbaru dan kirim konten gabungan tersebut ke model.

2. Pengendalian biaya

Token input meningkat setiap putaran, sehingga secara signifikan menaikkan biaya. Gunakan strategi manajemen biaya berikut:

2.1. Kurangi token input

Gunakan strategi manajemen konteks yang dijelaskan sebelumnya untuk mengurangi token input dan menurunkan biaya.

2.2. Gunakan model yang mendukung cache konteks

Pada permintaan multi-putaran, array messages diproses dan ditagih berulang kali. Model Studio menyediakan cache konteks untuk model seperti qwen-max dan qwen-plus, yang mengurangi biaya dan meningkatkan kecepatan respons. Utamakan model yang mendukung cache konteks.
Cache konteks diaktifkan secara otomatis—tidak diperlukan perubahan kode.

Kode kesalahan

Jika pemanggilan model gagal dan mengembalikan pesan kesalahan, lihat Kode kesalahan untuk penyelesaian.
Rencana Token (Team Edition)
Model playground
Statistik dan Pemantauan
Asset Center
Dukungan layanan