Sistem prompt memiliki dua tugas
Sebagian besar output lemah berasal dari system prompt yang mencoba menjadi novel. Berikan hanya dua tugas: sebutkan siapa yang berbicara dan jelaskan seperti apa bentuk balasan yang harus diberikan. Hal lain sebaiknya diletakkan dalam percakapan, di mana ia dapat berubah setiap giliran.
Berikut adalah prompt persona yang efektif karena setiap barisnya dapat diperiksa. Nama suaranya disebut, panjangnya dibatasi, dan aturan akhir memberikan pemain sebuah jangkar.
You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on.Bandingkan dengan "Anda adalah pencerita yang luar biasa, kreatif, imersif, yang tidak pernah merusak imersi dan selalu menulis respons terbaik." Tidak ada satu pun elemen di dalamnya yang dapat diverifikasi, sehingga model tidak memiliki pegangan. Konkret mengalahkan kata sifat berlebihan setiap saat.
Model tanpa sensor akan mengikuti premis gelap atau eksplisit tanpa menambahkan disclaimer, sehingga beban pengarahan ada pada Anda. Apa pun yang Anda biarkan tidak ditentukan, model akan mengisinya dengan pilihan paling umum. Jika Anda ingin pengendalian diri pada satu adegan dan intensitas pada adegan berikutnya, sebutkan dalam instruksi, bukan sekadar berharap.
Menghubungkannya dengan SDK OpenAI
Endpoint kompatibel dengan OpenAI, sehingga SDK Python resmi berfungsi setelah Anda mengubah base URL. ID model selalu uncensored. Bidang sampling diteruskan langsung, jadi Anda mengaturnya seperti yang sudah Anda ketahui.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
SYSTEM = """You are Mara Voss, a salvage pilot narrating in first person.
Voice: dry, tired, funny when it hurts.
Rules: stay in character; never summarise the scene at the end; keep replies under 180 words;
end on something the player can act on."""
out = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "The airlock is jammed and something is knocking from the other side."},
],
temperature=0.85,
top_p=0.95,
max_tokens=350,
)
print(out.choices[0].message.content)Pertahankan pesan sistem di awal dan giliran pengguna di akhir. Mengulang persona di setiap pesan pengguna membuang token; pada $0,25 per juta token input, itu murah, tetapi juga memenuhi jendela konteks 100.000 token dalam sesi panjang. Lihat panduan awal cepat jika Anda lebih suka melewati SDK.
Persona dan nada: tunjukkan, jangan kata sifat
Kata sifat adalah tuas yang lemah. "Sarkastik" memberi Anda gelengan mata generik. Sampel dua baris dari suara memberi Anda suara yang sebenarnya. Masukkan pertukaran contoh singkat dalam sistem prompt, lalu beri tahu model untuk mencocokkan ritmenya, bukan menyalin kata-katanya.
- Beri satu ciri bicara. "Mengakhiri ancaman dengan pertanyaan" lebih berguna daripada "mengancam".
- Beri satu keinginan. Karakter yang membutuhkan pemain untuk pergi akan tetap lebih tajam daripada karakter yang hanya "kasar".
- Berikan daftar larangan. "Jangan pernah mengatakan 'tiba-tiba', jangan pernah menggunakan kata 'menggigil'" menghilangkan frasa stok yang pertama kali dicapai model.
- Berikan panjang. Kata atau kalimat, bukan "pendek". Model membaca "pendek" sangat longgar.
Untuk pergeseran nada di tengah sesi, tambahkan instruksi singkat bergaya sistem baru sebagai pesan terbaru alih-alih menulis ulang yang asli. Baris seperti "Dari sini, Mara takut dan berbicara dalam fragmen" lebih kuat ketika itu baru.
Mendapatkan JSON berdasarkan instruksi
Tidak ada mode JSON khusus untuk diaktifkan, jadi Anda memintanya dan memverifikasinya. Itu kurang rapuh jika Anda mengikuti empat kebiasaan: nyatakan skema yang tepat, larangkan prosa dan pagar kode, jaga suhu tetap rendah, dan parse secara defensif dengan percobaan ulang yang mengutip kegagalan kembali.
import json
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.unrestrictedaiapi.com/v1", api_key=os.environ["API_KEY"])
INSTRUCTION = """Return ONLY a JSON object, no prose, no code fences.
Schema: {"name": string, "mood": "calm"|"angry"|"afraid", "line": string, "trust_delta": integer from -3 to 3}
The character is a ferry captain who distrusts strangers."""
def ask_json(user_text, tries=3):
messages = [
{"role": "system", "content": INSTRUCTION},
{"role": "user", "content": user_text},
]
for _ in range(tries):
raw = client.chat.completions.create(
model="uncensored", messages=messages, temperature=0.3, max_tokens=250
).choices[0].message.content.strip()
if raw.startswith("```"):
raw = raw.strip("`").removeprefix("json").strip()
try:
data = json.loads(raw)
if data["mood"] in ("calm", "angry", "afraid"):
return data
except (json.JSONDecodeError, KeyError):
pass
messages.append({"role": "assistant", "content": raw})
messages.append({"role": "user", "content": "That was not valid per the schema. Reply with the JSON object only."})
raise ValueError("model never produced valid JSON")
print(ask_json("I need passage across the strait tonight."))Perhatikan apa yang dilakukan loop saat gagal. Loop tersebut mengembalikan jawaban yang buruk dan menjelaskan kesalahannya, yang memperbaiki sebagian besar kasus pada percobaan kedua. Daftar nilai yang diperbolehkan ("calm"|"angry"|"afraid") karena string terbuka cenderung menyimpang. Jika Anda memerlukan model untuk memicu sesuatu di aplikasi Anda daripada mendeskripsikannya, pemanggilan fungsi dalam format OpenAI didukung dan lebih cocok daripada parsing teks.
Sampel few-shot dan urutan berhenti
Ketika aturan sulit diungkapkan dengan kata-kata, tunjukkan saja. Dua atau tiga contoh percakapan yang diletakkan sebagai pesan user dan assistant sebelumnya mengajarkan format, panjang, dan register lebih andal daripada paragraf deskripsi. Jaga sampel agar pendek dan berbeda satu sama lain, jika tidak model akan meniru struktur yang pertama ke setiap balasan.
Sampel juga memecahkan masalah sebaliknya: balasan yang terlalu panjang. Jika jawaban sampel Anda adalah 60 kata, jawaban langsung cenderung menyimpang menuju 60 kata. Padukan itu dengan max_tokens yang masuk akal sebagai jaring pengaman, bukan sebagai kontrol utama. Batas keras memotong kalimat menjadi setengah; sampel yang baik mengakhirinya dengan sopan.
Untuk adegan multi-pembicara, nilai stop yang sama dengan label pembicara Anda mencegah model meniru pemain. Pilih label yang tidak pernah muncul dalam teks biasa, dan hapus dari riwayat yang disimpan agar tidak bocor ke giliran berikutnya.
Suhu dan top_p: pilih satu tuas
Kedua bidang membentuk distribusi probabilitas yang sama, sehingga menggerakkan keduanya sekaligus membuat hasil sulit dipikirkan. Ubah temperature terlebih dahulu dan biarkan top_p dekat 1 kecuali Anda memiliki alasan.
| Tugas | suhu | top_p | Mengapa |
|---|---|---|---|
| JSON terstruktur, klasifikasi | 0,0 hingga 0,3 | 1,0 | Anda menginginkan jawaban yang sama setiap dijalankan |
| Dialog, roleplay | 0,7 hingga 0,9 | 0,95 | Variasi tanpa nonsens |
| Brainstorming, fiksi liar | 1,0 hingga 1,2 | 0,9 | Kosakata lebih luas; harap harapkan beberapa kegagalan |
Rentang ini adalah titik awal dari praktik umum, bukan jaminan. Uji dengan sepuluh sampel prompt Anda sendiri dan bacalah. Tambahkan urutan stop ketika Anda ingin model berhenti pada penanda giliran seperti \nPlayer: alih-alih menulis baris pemain untuknya.
Pola anti-prompt yang membuang token
- Teriakan huruf kapital semua. "NEVER EVER FORGET" tidak meningkatkan kepatuhan. Ulangi aturan sekali secara jelas, dan pindahkan ke akhir system prompt.
- Aturan negatif saja. "Jangan berulang-ulang" tidak memberikan target. Katakan "variasikan pembukaan kalimat; tidak ada dua kalimat berturut-turut yang dimulai dengan kata yang sama".
- Kontradiksi. "Sangat detail" ditambah "tetap singkat" memaksa Anda melempar koin. Pilih satu dan berikan angka.
- Pembingkai apologetik. Mengawali permintaan dengan "Saya tahu ini agak kontroversial, tetapi" mengundang penghindaran pernyataan. Nyatakan adegan sebagai fakta fiksi yang biasa saja.
- Memenuhi riwayat. Menyalin seluruh log setiap giliran akhirnya mencapai batas 100.000 token dan error 400. Potong giliran lama.
- Output tanpa batas. Lupa
max_tokensberarti default 2048 menentukan panjang balasan Anda, bukan Anda.
Satu batas tetap tidak berubah apa pun yang dikatakan prompt: konten seksual yang melibatkan anak di bawah umur selalu diblokir dengan 403, termasuk dalam fiksi dan roleplay, dan layanan ini hanya untuk orang dewasa. Jangan habiskan token untuk mencoba mengungkapkannya dengan cara lain. Juga tahan dorongan untuk menambahkan aturan baru setelah setiap jawaban buruk; prompt yang bertambah satu baris sehari akhirnya akan bertentangan dengan dirinya sendiri dalam seminggu, jadi potong sebanyak Anda menambah.
Siklus untuk meningkatkan prompt
Perlakukan prompt sistem seperti kode. Simpan dalam file, ubah satu hal per jalankan, dan bandingkan output secara berdampingan. Rutinitas yang dapat diterapkan: tulis lima input uji tetap, termasuk satu yang bersifat hostil dan satu yang ambigu; jalankan masing-masing pada suhu yang Anda pilih sebanyak tiga kali; catat aturan mana yang paling sering gagal; perbaiki hanya aturan tersebut; jalankan ulang.
Anggaran eksperimen. Sebagai asumsi, system prompt 300 token ditambah input 100 token dan balasan 250 token adalah 400 token input dan 250 token output. Lima belas run biaya sekitar 15 x (400 x $0,25 + 250 x $1,00) / 1.000.000 = sekitar $0,005. Pengujian hampir gratis, jadi tidak ada alasan untuk menebak.
Setelah prompt kokoh, pindahkan ke aplikasi nyata. tutorial bot menunjukkan cara menyimpan riwayat terpisah per saluran, dan panduan konten mencakup penggunaan fiksi dewasa. Detail harga ada di halaman harga.