Diperbarui
Fiksi web (网文) dan aplikasi roleplay Tiongkok: konteks, karakter, dan biaya
Fiksi web Tiongkok yang diserialkan dan obrolan peran adalah dua beban kerja teks paling menuntut: ribuan karakter per bab, pemeran yang harus tetap konsisten selama berbulan-bulan, dan pembaca yang memperhatikan setiap kesalahan. Panduan ini menunjukkan cara menyusun prompt, mengelola jendela konteks 100.000 token, dan memperkirakan biaya berdasarkan asumsi yang dinyatakan.
Seperti apa beban kerja ini
Serial fiksi web ditulis dalam bab-bab 2.000 hingga 4.000 karakter, sering diterbitkan setiap hari, dengan alur cerita yang mencakup ratusan bab. Aplikasi roleplay adalah sepupu percakapan: persona, skenario, dan riwayat panjang. Keduanya membutuhkan tiga hal yang sama dari model API: cukup konteks untuk mengingat, cukup anggaran output untuk menulis panjang lebar, dan gaya yang tidak menyimpang.
Layanan ini menawarkan endpoint chat yang kompatibel dengan OpenAI di https://api.chinesellmapi.com/v1 dengan satu model teks, id uncensored. Jendela konteks adalah 100.000 token yang dibagi antara prompt dan completion, max_tokens disetel ke 2.048 dan dapat mencapai 32.000, dan bidang sampling standar seperti temperature, top_p dan stop diteruskan. Streaming didukung, yang cocok untuk chat. Penyiapan dasar dan catatan pengodean terdapat di app quickstart.
Aturan konten, dinyatakan di awal
Ini adalah layanan untuk orang dewasa. Fiksi dewasa yang sah, tema dewasa, dan subjek kontroversial tidak ditolak sebagai such, dan layanan ini ditujukan untuk pengguna berusia 18 tahun ke atas. Konten seksual yang melibatkan anak di bawah umur selalu diblokir dan mengembalikan error 403 content_blocked, termasuk ketika dibingkai sebagai fiksi atau roleplay. Tidak ada pengaturan yang mengubah hal ini.
Bangun untuk itu sejak awal. Nyatakan dalam lembar karakter Anda bahwa setiap karakter adalah dewasa dan berikan usia eksplisit. Tambahkan gerbang usia ke produk Anda sendiri. Anggap 403 sebagai jawaban akhir untuk permintaan itu: tampilkan pesan netral dan jangan coba lagi dengan prompt yang diubah kata-katanya. Langkah-langkah ini adalah kebersihan produk yang baik apa pun aturan platformnya.
Lembar karakter dan blok gaya
Konsistensi berasal dari menempatkan fakta stabil di satu tempat dan mengulanginya pada setiap panggilan. Lembar karakter adalah catatan ringkas nama, usia, peran, kebiasaan bicara, hubungan, dan batasan keras, termasuk rahasia yang tidak boleh karakter ungkapkan. Blok gaya terpisah memperbaiki sudut pandang, kecepatan, rasio dialog, panjang bab, dan kebiasaan akhir. Keduanya masuk ke pesan sistem sehingga berada di awal setiap permintaan.
CHARACTER_SHEET = """\
【人物卡】
姓名:沈清禾(女,28岁)
身份:江城古籍修复师,性格沉静,嘴硬心软
口头禅:“先别急,东西不会跑。”
说话方式:短句,少用感叹号,偶尔引用旧书里的句子
关系:与顾远舟(男,31岁,旧书商)是多年好友,彼此有未说出口的好感
禁忌:不提及她离开出版社的真正原因(第40章才揭晓)
"""
STYLE = """\
【文风】第三人称限知视角,贴近沈清禾;节奏舒缓,多写物件与天气的细节;
对话占比约四成;每章 2500 到 3000 字;结尾留一个小悬念。"""
Tulis ini dalam bahasa Mandarin. Kebiasaan bicara yang dinyatakan dalam contoh Mandarin, seperti catchphrase atau panjang kalimat, ditransfer jauh lebih andal daripada deskripsi bahasa Inggris tentang hal tersebut. Simpan setiap lembar di bawah beberapa ratus token, dan berikan setiap karakter yang muncul satu; pemeran sepuluh orang masih hanya beberapa ribu token. Ketika situasi karakter berubah, perbarui lembar itu sendiri daripada mengandalkan riwayat untuk membawa perubahan tersebut.
Konteks panjang untuk bab berseri
Godaannya adalah menempelkan setiap bab sebelumnya ke dalam prompt. Lakukan aritmatika terlebih dahulu. Dengan jendela 100.000 token dan bab sekitar 4.500 token, seluruh jendela menampung sekitar empat belas bab tanpa sisa ruang untuk output, dan serial berjalan selama ratusan. Pola yang dapat bekerja adalah memori berlapis:
- Lembar karakter dan blok gaya, selalu hadir.
- Ringkasan cerita bergulir, beberapa ratus karakter per bab, digabungkan menjadi satu ringkasan berjalan yang Anda segarkan setiap beberapa bab.
- Teks lengkap bab sebelumnya, sehingga prosa terhubung di sambungan.
- Kerangka bab yang sedang ditulis.
Setelah setiap bab, minta model untuk ringkasan pendek yang mempertahankan perubahan hubungan dan alur cerita terbuka, dan tambahkan ke ringkasan. Kode di bawah ini menulis bab dan menghasilkan ringkasan berikutnya. Ini juga mengembalikan usage sehingga Anda dapat mencatat jumlah token nyata:
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.chinesellmapi.com/v1", api_key=os.environ["API_KEY"])
def write_chapter(sheet, style, story_so_far, last_chapter, outline):
messages = [
{"role": "system", "content": "你是一位连载网络小说的作者,所有人物均为成年人。严格遵守人物卡和文风设定。\n" + sheet + "\n" + style},
{"role": "user", "content": (
"【前情提要】\n" + story_so_far +
"\n\n【上一章全文】\n" + last_chapter +
"\n\n【本章大纲】\n" + outline +
"\n\n请直接写出本章正文,不要写标题以外的说明。")},
]
r = client.chat.completions.create(
model="uncensored",
messages=messages,
max_tokens=5000, # ~3,000 characters needs roughly 4,500 tokens under our assumption
temperature=0.9,
top_p=0.95,
)
return r.choices[0].message.content, r.usage
def summarize(chapter_text):
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "用 200 字以内概括下面这一章的剧情,保留人物关系的变化和未解的伏笔:\n" + chapter_text}],
max_tokens=400,
temperature=0.3,
)
return r.choices[0].message.content
Roleplay: persona, bentuk giliran dan stop sequences
Roleplay membutuhkan disiplin lembaran-gaya ditambah beberapa kontrol khusus obrolan. Masukkan persona dalam pesan sistem, nyatakan siapa memainkan siapa, perbaiki rentang panjang balasan, dan beri tahu model untuk tidak menulis tindakan karakter pengguna. Gunakan stop untuk memotong output jika model mulai menulis baris berikutnya pengguna, dan streaming balasan sehingga teks muncul saat dihasilkan.
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.chinesellmapi.com/v1", api_key=os.environ["API_KEY"])
PERSONA = (
"你扮演顾远舟,31岁的旧书商,说话随和,爱开玩笑,但在重要的事上很认真。"
"用户扮演沈清禾。所有角色均为成年人。保持第一人称,每次回复 80 到 200 字,"
"用(括号)写简短的动作描写,不要替用户的角色做决定。"
)
history = [{"role": "system", "content": PERSONA}]
def turn(user_text):
history.append({"role": "user", "content": user_text})
stream = client.chat.completions.create(
model="uncensored",
messages=history,
max_tokens=400,
temperature=1.0,
stop=["\n用户:"], # keep the model from writing the user's next line
stream=True,
)
reply = ""
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
piece = chunk.choices[0].delta.content
reply += piece
print(piece, end="", flush=True)
print()
history.append({"role": "assistant", "content": reply})
turn("(推开书店的门)这场雨下得真不是时候。")
Riwayat tumbuh dengan satu pesan pengguna dan satu pesan asisten per giliran. Setelah mendekati anggaran Anda, ringkas bagian tertua menjadi satu pesan dan pertahankan giliran terbaru secara verbatim. Suhu sekitar 0,9 hingga 1,0 memberikan dialog yang hidup untuk karakter; turunkan mendekati 0,5 ketika Anda membutuhkan persona untuk tetap ketat pada skrip.
Kontrol gaya yang bertahan serial panjang
Pergeseran gaya adalah kegagalan yang paling dikeluhkan pembaca: narator perlahan menjadi lebih banyak bicara, dialog menjadi formal, dan kecepatan meningkat. Lawan dengan spesifikasi. Alih-alih "tulis dengan gaya elegan", jelaskan kebiasaan yang dapat diukur: panjang kalimat, seberapa sering menggunakan idiom, seberapa banyak detail cuaca dan objek yang harus disertakan, apakah bab berakhir dengan hook atau adegan tenang. Dua atau tiga paragraf sampel pendek dalam suara target, ditempatkan di blok gaya, bernilai lebih dari satu halaman kata sifat.
Genre yang berbeda membutuhkan dial yang berbeda. Serial kultivasi atau fantasi mendapat manfaat dari glosarium istilah yang diciptakan, seperti realm, sect dan teknik, sehingga nama yang sama tidak pernah dieja dengan dua cara. Roman modern bergantung pada irama dialog dan detail fisik kecil. Misteri membutuhkan buku besar petunjuk: daftar fakta yang telah dilihat pembaca, sehingga model tidak bertentangan dengan mereka. Simpan setiap daftar ini dalam prompt sistem dan perbarui saat cerita bergerak.
Akhirnya, pertahankan suhu dan top_p tetap dalam serial. Jika Anda mengubah sampling antara bab, suara berubah. Naikkan suhu hanya untuk brainstorming kerangka, bukan untuk prosa itu sendiri.
Perhitungan biaya dengan asumsi yang dinyatakan
Semua angka menggunakan tarif yang diterbitkan sebesar $0,25 per juta token input dan $1,00 per juta token output, dan asumsi 1,5 token per karakter Mandarin. Ganti asumsi dengan angka dari log usage Anda sendiri.
| Skenario | Token input yang diasumsikan | Token output yang diasumsikan | Biaya per panggilan |
|---|---|---|---|
| Bab serial (3.000 karakter keluar) | 8.000 | 4.500 | $0.0020 + $0.0045 = $0.0065 |
| Giliran roleplay, riwayat 20.000 token | 20.000 | 300 | $0.0050 + $0.0003 = $0.0053 |
| Giliran roleplay, riwayat 60.000 token penuh | 60.000 | 500 | $0.0150 + $0.0005 = $0.0155 |
Di baris bab, 8.000 token input terurai menjadi lembar karakter dan blok gaya 1.200 token, ringkasan 2.000 token, bab sebelumnya 4.500 token, dan kerangka 300 token. Seratus bab seperti itu akan memakan biaya sekitar $0,65. Seratus giliran roleplay pada ukuran riwayat 20.000 token memakan biaya sekitar $0,53. Takeaway-nya adalah panjang riwayat mendorong biaya chat, sehingga pemangkasan dan ringkasan membayar diri mereka sendiri dengan cepat.
Kredit uji coba $0,50, berlaku selama tujuh hari, mencakup sekitar 76 bab di bawah asumsi baris pertama. Periksa harga untuk tarif saat ini, dan lihat FAQ uji coba untuk detail akun.
Catatan operasional untuk produksi
Pembuatan bab adalah permintaan panjang, jadi gunakan timeout yang longgar atau streaming dan kumpulkan teks sendiri. Tangani 429 dengan backoff singkat, karena setiap kunci memungkinkan 300 permintaan per menit, dan perlakukan 503 dengan upstream_busy sebagai peristiwa retry dalam beberapa detik. 402 berarti saldo prabayar telah habis atau uji coba telah berakhir, yang harus memberi tahu Anda daripada melakukan retry.
Simpan setiap bab yang dihasilkan dan ringkasannya ke database Anda sendiri sebelum menghasilkan yang berikutnya. Jika panggilan gagal di tengah batch malam, Anda dapat melanjutkan dari bab terakhir yang disimpan, dan Anda tidak pernah membayar dua kali untuk teks yang sama. Simpan versi prompt dan angka penggunaan di samping setiap bab sehingga biaya per bab adalah kueri daripada tebakan.
Untuk produk roleplay, pertahankan anggaran per sesi. Batasi jumlah giliran atau total token yang dapat dikonsumsi sesi tunggal, dan tampilkan pesan yang jelas kepada pengguna ketika batas tercapai. Karena prompt mencakup riwayat, sesi yang sangat panjang menelan biaya jauh lebih banyak per giliran daripada yang baru, itulah mengapa merangkum giliran lama penting selain hanya memuat jendela. Prompt tidak digunakan untuk pelatihan, yang dapat Anda nyatakan dalam catatan privasi produk Anda di samping kebijakan penyimpanan Anda sendiri.
Tanya jawab
Berapa panjang maksimal satu bab dalam satu permintaan?
Output dibatasi hingga 32.000 token per permintaan dan berbagi jendela konteks 100.000 token dengan prompt. Bab sepanjang 3.000 karakter muat dengan nyaman, jadi atur max_tokens sedikit di atas estimasi Anda.
Bagaimana cara menjaga konsistensi karakter di ratusan bab?
Simpan lembar karakter dan blok gaya dalam prompt sistem pada setiap panggilan, dan lanjutkan alur cerita sebagai ringkasan bergulir ditambah bab sebelumnya.
Apakah fiksi dewasa diperbolehkan?
Fiksi dewasa yang sesuai hukum antara karakter dewasa tidak ditolak, dan layanan ini untuk pengguna berusia 18 tahun ke atas. Konten seksual yang melibatkan anak di bawah umur selalu diblokir dengan kode 403, termasuk dalam fiksi dan roleplay.
Bisakah saya melakukan streaming balasan roleplay?
Ya. Setel stream ke true untuk menerima server-sent events, dan gunakan stop sequences untuk mencegah model menulis baris pengguna.
Kunci Anda hanya selangkah lagi dari satu formulir
Buat akun, salin kunci, ubah base URL. Itu saja seluruh penyiapannya.