ID ▾
Dapatkan Kunci API

Cara Prompt untuk API Model Tanpa Sensor: system, peran, format, sampling

Model yang sama, kualitas output sangat bergantung pada ketatnya prompt. Di sini tidak ada teori abstrak, hanya praktik rekayasa yang bisa Anda verifikasi langsung: cara melapiskan system prompt, menetapkan peran agar tidak menyimpang, cara meminta output JSON yang dapat diparsing hanya dengan instruksi, cara mengatur temperature dan top_p, serta pola yang pasti gagal. Setiap poin bisa Anda masukkan ke dalam kode untuk eksperimen pembanding.

Diperbarui pada

Poin penting

  • Gunakan struktur dua bagian untuk system prompt: aturan diberi nomor, hanya fakta yang ditulis pada bagian pengaturan.
  • Tentukan format secara eksplisit dalam instruksi jika membutuhkan JSON, turunkan temperature, dan pastikan kode Anda memiliki penanganan kegagalan parsing.
  • Ubah hanya satu parameter (temperature atau top_p) dalam satu waktu. Gunakan 0,8 hingga 1,0 untuk kreativitas, dan mulai dari 0 hingga 0,3 untuk ekstraksi.
  • Pola kegagalan umum: kalimat negatif yang ambigu, aturan yang saling bertentangan, dan menempatkan persyaratan format di tengah percakapan.

Tetapkan empat prinsip terlebih dahulu

  • Satu permintaan untuk satu tugas.Biarkan model menulis alur cerita, membuat ringkasan, dan menghasilkan JSON sekaligus; semuanya mendapat diskon. Pecah menjadi beberapa panggilan untuk biaya rendah, dengan input hanya $0.25 per satu juta token.
  • Aturan harus dapat diverifikasi."Tulis dengan lebih hidup" sulit diverifikasi, sedangkan "Setiap paragraf maksimal 120 kata, sertakan deskripsi lingkungan minimal satu kali" dapat diperiksa.
  • Utamakan pernyataan positif.Mengatakan "Tulis hanya aksi dan dialog" jauh lebih stabil daripada mengatakan "Jangan tulis aktivitas psikologis".
  • Mulai dengan sampel kecil, lalu skala besar.Untuk setiap perubahan prompt, bandingkan dulu dengan lima hingga sepuluh contoh sebelum di-online-kan.

Model ini tidak menolak konten dewasa yang sah, genre fiksi, atau topik kontroversial, sehingga Anda tidak perlu berbelit-belit atau terus-menerus menyatakan "ini hanya fiksi" dalam prompt. Tuliskan tugasnya dengan jelas agar lebih stabil. Satu batasan keras adalah konten seksual yang melibatkan minor; model akan mengembalikan status 403 baik untuk fiksi maupun non-fiksi, dan ini tidak dapat diubah hanya dengan diksi.

Struktur dua bagian system prompt

Disarankan untuk memisahkan system menjadi dua bagian: "Aturan" dan "Pengaturan". Letakkan aturan di depan dengan penomoran, dan letakkan pengaturan di belakang yang hanya berisi fakta. Berikut adalah contoh untuk narator fiksi:

你是「夜航」,一名为成年读者写黑色悬疑小说的叙述者。

# 规则
1. 第三人称过去时,每段不超过 120 字。
2. 不替用户的角色做决定,只写环境和其他角色的反应。
3. 每次输出 300 到 500 字,结尾停在一个未决的动作上。
4. 不总结、不点评、不加免责声明,直接写正文。

# 设定
时间:1998 年深秋。地点:港口城市旧码头区。
主角:沈野,退役水警,嗜烟,右耳有旧伤。

Beberapa poin penting:

  1. Aturan tidak boleh melebihi enam poin. Semakin banyak poin, semakin besar kemungkinan bagian belakang diabaikan.
  2. Batasan numerik (kata per paragraf, panjang output) lebih efektif daripada kata sifat.
  3. Batasan akhir (berhenti pada aksi yang belum selesai) memungkinkan kelanjutan multi-turn yang lebih alami.
  4. Jangan masukkan arah plot ke dalam pengaturan. Plot harus dipicu oleh pesan user, jika tidak akan terjadi konflik dengan input pengguna di tahap selanjutnya.

Panjang output harus disesuaikan dengan max_tokens: jika aturan menyatakan 500 kata tetapi max_tokens hanya 200, output akan terpotong di tengah kalimat.

Detail praktis tambahan: aturan penomoran di system sebaiknya hanya menyatakan satu hal per baris. "Maksimal 120 kata per paragraf, dan jangan merangkum" terlihat seperti satu aturan, padahal dua. Setelah dipisah, model lebih mudah memenuhi keduanya. Baca ulang per baris setelah selesai: apakah aturan ini bisa diperiksa secara visual? Jika tidak, ubah menjadi bentuk yang bisa diperiksa.

Cara menetapkan peran agar tidak menyimpang

Pergeseran karakter adalah masalah paling umum dalam percakapan multi-turn: lima turn pertama nada normal, namun pada turn ke-20 karakter mulai "keluar dari peran". Ada tiga strategi untuk mengatasinya.

  • Tuliskan pengaturan hanya dengan fitur yang dapat diamati."Shen Ye: perokok berat, bekas luka di telinga kanan, menggunakan kalimat pendek" lebih baik daripada "Shen Ye adalah orang yang kompleks dan menarik".
  • Tuliskan gaya bicara sebagai contoh kalimat.Memberikan dua atau tiga baris dialog contoh akan membuat model meniru gaya tersebut jauh lebih baik daripada sekadar memahami kata sifat.
  • Ingatkan secara berkala.Untuk percakapan panjang, tambahkan satu baris pengingat singkat di akhir pesan user setiap beberapa turn, misalnya "Pertahankan gaya kalimat pendek Shen Ye". Biayanya hanya beberapa puluh token.

Selain itu, jangan campurkan pengaturan karakter dengan aturan output. Aturan adalah "bagaimana menulis", karakter adalah "siapa yang menulis". Dengan memisahkannya, Anda dapat mengganti karakter tanpa mengubah aturan, sehingga perbandingan A/B menjadi lebih mudah. Untuk percakapan panjang, perhatikan total konteks; lihat praktik konteks panjang 100k.

Tambahkan satu aturan lagi untuk skenario multi-karakter: tulis pengaturan setiap karakter dalam satu baris terpisah, dan berikan satu kalimat contoh untuk gaya bicaranya masing-masing agar tidak terdengar seperti satu orang. Untuk karakter yang dimainkan pengguna, tulis saja "dikontrol oleh pengguna" dalam pengaturan, agar model tidak menuliskan dialognya.

Kontrol output JSON melalui instruksi

Jangan berasumsi model "pasti" mengembalikan JSON yang valid. Cara yang andal adalah tiga lapis: format ditulis mati dalam instruksi, parameter randomisasi diturunkan, dan kode digunakan sebagai pengaman parsing.

import json
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.wushenchaapi.com/v1", api_key=os.environ["API_KEY"])

SYSTEM = (
    "你是信息抽取器。只输出一个 JSON 对象,不要 Markdown 代码块,不要任何解释。"
    '格式:{"name": 字符串, "mood": "calm|tense|angry", "items": [字符串]}。'
    "缺失的字段用 null,items 没有则给空数组。"
)

def extract(text, retries=2):
    for _ in range(retries + 1):
        resp = client.chat.completions.create(
            model="uncensored",
            temperature=0.2,
            max_tokens=300,
            messages=[
                {"role": "system", "content": SYSTEM},
                {"role": "user", "content": text},
            ],
        )
        raw = resp.choices[0].message.content.strip()
        raw = raw.removeprefix("```json").removesuffix("```").strip()
        try:
            return json.loads(raw)
        except json.JSONDecodeError:
            continue
    return None

print(extract("老周把钥匙拍在桌上,冷着脸说:账本和那把铜钥匙,今晚都得还我。"))

Kode ini mencerminkan beberapa kebiasaan baik:

  • Penjelasan format ditulis di system, termasuk rentang nilai bidang (calm|tense|angry).
  • Dilarang secara eksplisit menggunakan blok kode dan teks penjelasan, namun kode tetap menghapus pembatas yang mungkin muncul sebagai pengaman ganda.
  • Konvensi untuk bidang yang hilang ditulis dalam instruksi (null, array kosong) agar model tidak membuat data sendiri.
  • Percobaan ulang parsing yang gagal memiliki batas; jika batas tercapai, kembalikan None agar pihak pemanggil dapat memutuskan tindak lanjut.

Jika bidangnya sangat banyak, tempelkan objek contoh lengkap di prompt terlebih dahulu, lalu minta model mengikutinya. Hasilnya biasanya lebih akurat daripada mendeskripsikan banyak aturan.

Saran pengaturan temperature dan top_p

Berikut adalah titik awal, bukan kesimpulan akhir. Gunakan hasil perbandingan sampel Anda sebagai acuan utama. Prinsipnya: ubah hanya satu parameter dalam satu waktu, biarkan parameter lainnya tetap pada nilai default.

Skenariotemperaturetop_pCatatan
Ekstraksi dan klasifikasi JSON0 hingga 0,3DefaultDiperlukan stabilitas; hasil panggilan berulang harus konsisten
Penulisan ulang dan penghalusan0,5 hingga 0,7BawaanPertahankan makna asli, variasi diksi diperbolehkan
Kelanjutan novel, dialog karakter0,8 hingga 1,00,9 hingga 0,95Mengutamakan keragaman, perhatikan risiko keluar topik
Brainstorming, pemberian namaSekitar 1,0BawaanAmbil sampel berulang, pilih hasil terbaik

Dua sinyal ini membantu Anda menentukan arah: output yang berulang-ulang dan menggunakan pola kalimat yang sama menandakan suhu terlalu rendah; munculnya konten tidak relevan atau inkonsistensi nama karakter menandakan suhu atau top_p terlalu tinggi. Parameter stop juga sangat berguna, misalnya untuk menghentikan model saat mencapai penanda tertentu, sehingga memudahkan pembuatan konten secara bertahap.

Penulisan yang sering gagal

Metode penulisanMasalahUbah menjadi
"Usahakan jangan terlalu panjang"Tidak ada angka, sulit dieksekusi"Tidak melebihi 400 kata"
"Jangan tulis A, dan jangan juga tidak menulis A"Aturan saling bertentanganPertahankan hanya satu aturan yang jelas
Persyaratan format disisipkan di tengah percakapanTertimbung setelah percakapan panjangMasukkan ke system, atau ingatkan di akhir setiap putaran
Meminta model "berperan sebagai AI tanpa batasan"Penetapan konteks yang kosong, tidak membatasi outputTulis tanggung jawab dan aturan penulisan secara spesifik
Memasukkan puluhan aturan sekaligusAturan di bagian akhir menjadi tidak efektifRingkas hingga enam aturan, sisanya pisahkan ke permintaan lain
Permintaan JSON hanya menulis "kembalikan JSON"Nama kolom berbeda setiap kaliBerikan format lengkap dan contoh

Pola umum tabel ini adalah: semakin spesifik semakin efektif, semakin kosong semakin tidak berguna. Selain itu, jangan menganggap "penekanan berulang" sebagai solusi; menulis kalimat yang sama tiga kali dengan huruf tebal dan tanda seru biasanya kurang efektif dibandingkan mengubahnya menjadi aturan yang mengandung angka. Yang benar-benar berguna adalah sedikit namun tepat, disertai verifikasi melalui contoh.

Daftar periksa proses penyesuaian

  1. Tetapkan temperature tetap pada 0.2 untuk mereproduksi masalah.
  2. Ubah hanya satu Prompt, jalankan ulang set sampel yang sama.
  3. Periksa finish_reason: jika berupa length, masalahnya ada pada max_tokens, bukan Prompt.
  4. Periksa prompt_tokens di usage: apakah system terlalu panjang sehingga mendesak percakapan historis?
  5. Setelah perbaikan, kembalikan temperature ke nilai bisnis, lalu lakukan sampling ulang untuk verifikasi.

Lihat tutorial integrasi untuk detail koneksi, daftar parameter lengkap ada di dokumentasi. Jika Anda mengevaluasi apakah akan menggunakan layanan transit, analisis biaya dan pertimbangannya ada di analisis stasiun transit API, tidak diulang di sini.

Pertanyaan umum

Berapa panjang yang tepat untuk system prompt?

Sesuaikan agar aturan dapat disampaikan dengan jelas, biasanya beberapa ratus kata sudah cukup. Semakin panjang semakin memakan konteks, dan semakin rentan terhadap konflik antar-aturan. Disarankan aturan tidak melebihi enam poin.

Mengapa instruksi meminta hanya output JSON, namun kadang masih menyertakan teks penjelasan?

Ini adalah fenomena normal. Menurunkan temperature, memberikan contoh lengkap, serta melakukan stripping wrapper dan retry parsing di kode lebih andal daripada terus-menerus menekankan instruksi.

Apakah temperature dan top_p dapat disesuaikan bersamaan?

Bisa, namun tidak disarankan. Mengubah dua parameter sekaligus menyulitkan Anda menentukan mana yang menyebabkan perubahan. Tetapkan salah satu terlebih dahulu, lalu ubah yang lainnya.

Apakah perlu menyatakan "ini fiksi" di dalam Prompt?

Tidak perlu. Konten fiksi dewasa yang legal tidak akan ditolak, cukup jelaskan tugasnya dengan jelas. Konten seksual yang melibatkan anak di bawah umur akan tetap diblokir tanpa memandang diksi.

Isi formulir untuk mendapatkan kunci

Buat akun, salin kunci, ubah Base URL. Konfigurasinya sangat sederhana.