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:
- Aturan tidak boleh melebihi enam poin. Semakin banyak poin, semakin besar kemungkinan bagian belakang diabaikan.
- Batasan numerik (kata per paragraf, panjang output) lebih efektif daripada kata sifat.
- Batasan akhir (berhenti pada aksi yang belum selesai) memungkinkan kelanjutan multi-turn yang lebih alami.
- 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.
| Skenario | temperature | top_p | Catatan |
|---|---|---|---|
| Ekstraksi dan klasifikasi JSON | 0 hingga 0,3 | Default | Diperlukan stabilitas; hasil panggilan berulang harus konsisten |
| Penulisan ulang dan penghalusan | 0,5 hingga 0,7 | Bawaan | Pertahankan makna asli, variasi diksi diperbolehkan |
| Kelanjutan novel, dialog karakter | 0,8 hingga 1,0 | 0,9 hingga 0,95 | Mengutamakan keragaman, perhatikan risiko keluar topik |
| Brainstorming, pemberian nama | Sekitar 1,0 | Bawaan | Ambil 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 penulisan | Masalah | Ubah 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 bertentangan | Pertahankan hanya satu aturan yang jelas |
| Persyaratan format disisipkan di tengah percakapan | Tertimbung setelah percakapan panjang | Masukkan ke system, atau ingatkan di akhir setiap putaran |
| Meminta model "berperan sebagai AI tanpa batasan" | Penetapan konteks yang kosong, tidak membatasi output | Tulis tanggung jawab dan aturan penulisan secara spesifik |
| Memasukkan puluhan aturan sekaligus | Aturan di bagian akhir menjadi tidak efektif | Ringkas hingga enam aturan, sisanya pisahkan ke permintaan lain |
| Permintaan JSON hanya menulis "kembalikan JSON" | Nama kolom berbeda setiap kali | Berikan 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
- Tetapkan temperature tetap pada 0.2 untuk mereproduksi masalah.
- Ubah hanya satu Prompt, jalankan ulang set sampel yang sama.
- Periksa
finish_reason: jika berupa length, masalahnya ada pada max_tokens, bukan Prompt. - Periksa prompt_tokens di usage: apakah system terlalu panjang sehingga mendesak percakapan historis?
- 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.