อัปเดต
นิยายจีนและแอปบทบาทสมมติ: บริบท ตัวละคร และต้นทุน
นิยายจีนแบบต่อเนื่องและการแชทในบทบาทเป็นงานประมวลผลข้อความที่หนักที่สุดสองประเภท: ตัวอักษรหลายพันตัวต่อตอน ตัวละครที่ต้องคงความสม่ำเสมอตลอดหลายเดือน และผู้อ่านที่สังเกตความผิดพลาดทุกจุด คู่มือนี้แสดงวิธีจัดโครงสร้างพรอมต์ จัดการหน้าต่างบริบท 100,000 โทเคน และประมาณการค่าใช้จ่ายจากสมมติฐานที่ระบุ
ลักษณะของงานเหล่านี้
นิยายเว็บแบบต่อเนื่องเขียนเป็นตอนๆ ความยาว 2,000 ถึง 4,000 ตัวอักษร มักเผยแพร่ทุกวัน และมีพล็อตเรื่องที่ยาวนานหลายร้อยตอน แอปบทบาทสมมติคือญาติสนิทด้านการสนทนา: มีบุคลิก สถานการณ์ และประวัติการสนทนาที่ยาวนาน ทั้งสองอย่างต้องการสามสิ่งเดียวกันจาก API โมเดล: บริบทที่เพียงพอสำหรับการจดจำ งบประมาณเอาต์พุตที่เพียงพอสำหรับการเขียนยาวๆ และสไตล์ที่ไม่เพี้ยน
บริการมีเอนด์พอยต์แชทที่เข้ากันได้กับ OpenAI ที่ https://api.chinesellmapi.com/v1 โดยมีโมเดลข้อความหนึ่งตัว คือ id uncensored หน้าต่างบริบทคือ 100,000 โทเคนที่แชร์ระหว่างพรอมต์และการสร้างข้อความ max_tokens ตั้งค่าเริ่มต้นที่ 2,048 และสามารถเพิ่มได้ถึง 32,000 และฟิลด์การสุ่มตัวอย่างมาตรฐานเช่น temperature, top_p และ stop จะถูกส่งผ่าน การสตรีมมิงรองรับ ซึ่งเหมาะสำหรับแชท การตั้งค่าพื้นฐานและบันทึกการเข้ารหัสอยู่ใน app quickstart
กฎเนื้อหา ระบุไว้ล่วงหน้า
นี่คือบริการสำหรับผู้ใหญ่เท่านั้น นิยายผู้ใหญ่ที่ถูกต้องตามกฎหมาย ธีมผู้ใหญ่และหัวข้อที่ถกเถียงได้ไม่ถูกปฏิเสธในลักษณะนั้น และบริการนี้มุ่งหมายสำหรับผู้ใช้งานอายุ 18 ปีขึ้นไป เนื้อหาทางเพศที่เกี่ยวข้องกับเด็กจะถูกบล็อกเสมอและส่งข้อผิดพลาด 403 content_blocked รวมถึงเมื่อจัดกรอบเป็นนิยายหรือบทบาทสมมติ ไม่มีค่าตั้งค่าใดที่เปลี่ยนแปลงสิ่งนี้ได้
สร้างเพื่อสิ่งนั้นตั้งแต่เริ่มต้น ระบุในแผ่นตัวละครของคุณว่าตัวละครทุกตัวเป็นผู้ใหญ่และระบุอายุที่ชัดเจน เพิ่มการตรวจสอบอายุในผลิตภัณฑ์ของคุณเอง ถือว่า 403 เป็นคำตอบสุดท้ายสำหรับคำขอนั้น: แสดงข้อความที่เป็นกลางและอย่าลองใหม่ด้วยพรอมต์ที่ปรับคำพูดใหม่ ขั้นตอนเหล่านี้เป็นสุขอนามัยผลิตภัณฑ์ที่ดีไม่ว่ากฎของแพลตฟอร์มจะระบุอย่างไร
แผ่นตัวละครและบล็อกสไตล์
ความสม่ำเสมอเกิดจากการวางข้อเท็จจริงที่มั่นคงในที่เดียวและทำซ้ำในทุกคำขอ แผ่นตัวละครคือบันทึกย่อของชื่อ อายุ บทบาท พฤติกรรมการพูด ความสัมพันธ์ และข้อจำกัดที่แข็งกร้าว รวมถึงความลับที่ตัวละครต้องไม่เปิดเผยในขณะนี้ บล็อกสไตล์แยกต่างหากกำหนดมุมมอง การเร่งเรื่อง อัตราส่วนบทสนทนา ความยาวตอน และนิสัยการจบ ทั้งสองอยู่ในข้อความระบบเพื่อให้อยู่ด้านหน้าของทุกคำขอ
CHARACTER_SHEET = """\
【人物卡】
姓名:沈清禾(女,28岁)
身份:江城古籍修复师,性格沉静,嘴硬心软
口头禅:“先别急,东西不会跑。”
说话方式:短句,少用感叹号,偶尔引用旧书里的句子
关系:与顾远舟(男,31岁,旧书商)是多年好友,彼此有未说出口的好感
禁忌:不提及她离开出版社的真正原因(第40章才揭晓)
"""
STYLE = """\
【文风】第三人称限知视角,贴近沈清禾;节奏舒缓,多写物件与天气的细节;
对话占比约四成;每章 2500 到 3000 字;结尾留一个小悬念。"""
เขียนสิ่งเหล่านี้เป็นภาษาจีน พฤติกรรมการพูดที่แสดงด้วยตัวอย่างภาษาจีน เช่น คำติดปากหรือความยาวประโยค ถ่ายโอนได้เชื่อถือได้มากกว่าคำอธิบายภาษาอังกฤษ เก็บแต่ละแผ่นให้ต่ำกว่าไม่กี่ร้อยโทเคน และให้ตัวละครที่ปรากฏซ้ำแต่ละตัวหนึ่งแผ่น ตัวละครสิบตัวก็ยังมีค่าเพียงไม่กี่พันโทเคน เมื่อสถานการณ์ของตัวละครเปลี่ยน ให้อัปเดตแผ่นเองแทนที่จะพึ่งพาประวัติเพื่อส่งต่อการเปลี่ยนแปลง
บริบทยาวสำหรับตอนแบบต่อเนื่อง
แรงดึงดูดใจคือการวางตอนก่อนหน้าทั้งหมดลงในพรอมต์ ทำการคำนวณก่อน ด้วยหน้าต่างบริบท 100,000 โทเคนและตอนขนาดประมาณ 4,500 โทเคน หน้าต่างทั้งหมดรองรับประมาณสิบสี่ตอนโดยไม่มีพื้นที่เหลือสำหรับเอาต์พุต และนิยายต่อเนื่องดำเนินไปหลายร้อยตอน รูปแบบที่ใช้งานได้คือหน่วยความจำแบบชั้น:
- แผ่นตัวละครและบล็อกสไตล์ มีอยู่เสมอ
- บทสรุปเรื่องราวแบบเลื่อน ความยาวหลายร้อยตัวอักษรต่อตอน รวมเป็นบทสรุปต่อเนื่องที่คุณปรับปรุงทุกไม่กี่ตอน
- ข้อความเต็มของตอนก่อนหน้า เพื่อให้การเขียนเชื่อมโยงกันที่รอยต่อ
- โครงร่างสำหรับตอนที่กำลังเขียน
หลังจากแต่ละตอน ให้ถามโมเดลให้สรุปย่อสั้นๆ ที่รักษาการเปลี่ยนแปลงความสัมพันธ์และปมเรื่องที่ยังไม่คลี่คลาย แล้วเพิ่มลงในบทสรุป โค้ดด้านล่างเขียนตอนและสร้างสรุปถัดไป มันยังส่งคืน usage เพื่อให้คุณสามารถบันทึกจำนวนโทเคนจริงได้:
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
บทบาทสมมติ: บุคลิก รูปแบบการตอบกลับ และลำดับหยุด
การสวมบทบาทต้องการวินัยเดียวกันกับแผ่นข้อมูลและสไตล์ รวมถึงการควบคุมเฉพาะสำหรับการแชท ใส่บุคลิกภาพในข้อความระบบ ระบุใครเล่นเป็นใคร กำหนดช่วงความยาวของการตอบกลับ และบอกโมเดลไม่ให้เขียนการกระทำของตัวละครผู้ใช้ ใช้ stop เพื่อตัดเอาต์พุตหากโมเดลเริ่มเขียนบรรทัดถัดไปของผู้ใช้ และสตรีมการตอบกลับเพื่อให้ข้อความปรากฏเมื่อสร้างเสร็จ
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("(推开书店的门)这场雨下得真不是时候。")
ประวัติเติบโตด้วยข้อความผู้ใช้หนึ่งข้อความและข้อความผู้ช่วยหนึ่งข้อความต่อรอบ เมื่อใกล้ถึงงบประมาณของคุณ ให้สรุปส่วนที่เก่าที่สุดเป็นข้อความเดียวและเก็บรอบล่าสุดไว้ครบถ้วน อุณหภูมิประมาณ 0.9 ถึง 1.0 ให้บทสนทนาที่มีชีวิตชีวาสำหรับตัวละคร; ลดลงเหลือประมาณ 0.5 เมื่อคุณต้องการให้บุคลิกคงเส้นคงวาตามบท
การควบคุมสไตล์ที่รอดชีวิตจากนิยายต่อเนื่องยาว
การเปลี่ยนแนวเป็นความล้มเหลวที่ผู้อ่านบ่นมากที่สุด: ผู้บรรยายค่อยๆ พูดมากขึ้น บทสนทนาเป็นทางการขึ้น จังหวะเร็วขึ้น ต่อสู้ด้วยรายละเอียดเฉพาะ แทนที่จะเขียน "เขียนในสไตล์ที่สง่างาม" ให้บรรยายนิสัยที่วัดได้: ความยาวประโยค ความถี่ในการใช้สำนวน ปริมาณรายละเอียดสภาพอากาศและวัตถุที่จะรวมไว้ บทนำสั้นๆ สองหรือสามย่อหน้าในเสียงเป้าหมาย วางไว้ในบล็อกสไตล์ มีค่ามากกว่าหน้าหนึ่งหน้าของคำคุณศัพท์
แนวเรื่องต่างกันต้องการปุ่มปรับต่างกัน นิยาย cultivation หรือแฟนตาซีได้ประโยชน์จากพจนานุกรมของคำที่ประดิษฐ์ขึ้น เช่น อาณาจักร เซกต์ และเทคนิค เพื่อให้ชื่อเดียวกันไม่สะกดสองแบบ นิยายรักสมัยใหม่พึ่งพาจังหวะบทสนทนาและรายละเอียดทางกายภาพเล็กๆ น้อยๆ เรื่องลึกลับต้องการสมุดบันทึกเบาะแส: รายการข้อเท็จจริงที่ผู้อ่านได้เห็น เพื่อให้โมเดลไม่ขัดแย้งกัน เก็บรายการเหล่านี้ทั้งหมดในพรอมต์ระบบและอัปเดตเมื่อเรื่องราวดำเนินไป
สุดท้าย รักษาอุณหภูมิและ top_p ให้คงที่ภายในนิยายต่อเนื่อง หากเปลี่ยนการสุ่มตัวอย่างระหว่างตอน เสียงจะเปลี่ยน เพิ่มอุณหภูมิเฉพาะสำหรับการระดมสมองโครงร่าง ไม่ใช่สำหรับเนื้อเรื่องเอง
การคำนวณต้นทุนด้วยสมมติฐานที่ระบุ
ตัวเลขทั้งหมดใช้อัตราที่ประกาศไว้คือ $0.25 ต่อล้านโทเคนอินพุตและ $1.00 ต่อล้านโทเคนเอาต์พุต และสมมติฐาน 1.5 โทเคนต่อตัวอักษรจีน แทนที่สมมติฐานด้วยตัวเลขจาก usage บันทึกของคุณ
| สถานการณ์ | โทเคนอินพุตที่สมมติ | โทเคนเอาต์พุตที่สมมติ | ต้นทุนต่อคำขอ |
|---|---|---|---|
| ตอนต่อเนื่อง (เอาต์พุต 3,000 ตัวอักษร) | 8,000 | 4,500 | $0.0020 + $0.0045 = $0.0065 |
| รอบบทบาทสมมติ ประวัติความยาว 20,000 โทเคน | 20,000 | 300 | $0.0050 + $0.0003 = $0.0053 |
| รอบบทบาทสมมติ ประวัติความยาวเต็ม 60,000 โทเคน | 60,000 | 500 | $0.0150 + $0.0005 = $0.0155 |
ในแถวตอน โทเคนอินพุต 8,000 ตัวแบ่งย่อยเป็นแผ่นตัวละครและบล็อกสไตล์ขนาด 1,200 โทเคน บทสรุปขนาด 2,000 โทเคน ตอนก่อนหน้าขนาด 4,500 โทเคน และโครงร่างขนาด 300 โทเคน ตอนร้อยแบบนั้นจะมีต้นทุนประมาณ $0.65 รอบบทบาทสมมติร้อยรอบที่ขนาดประวัติ 20,000 โทเคนมีต้นทุนประมาณ $0.53 ข้อสรุปคือความยาวประวัติขับเคลื่อนต้นทุนแชท ดังนั้นการตัดและสรุปจึงคุ้มค่าอย่างรวดเร็ว
เครดิตทดลองใช้ $0.50 ใช้ได้เป็นเวลาเจ็ดวัน ครอบคลุมประมาณ 76 ตอนภายใต้สมมติฐานของแถวแรก ตรวจสอบ pricing สำหรับอัตราปัจจุบัน และดู trial FAQ สำหรับรายละเอียดบัญชี
บันทึกการดำเนินงานสำหรับการผลิต
การสร้างบทเป็นคำขอที่ใช้เวลานาน ดังนั้นจึงควรใช้เวลาหมดอายุที่ยาวนานหรือสตรีมและประกอบข้อความด้วยตนเอง จัดการ 429 ด้วยเวลาพักสั้นๆ เนื่องจากคีย์แต่ละอันอนุญาต 300 คำขอต่อนาที และจัดการ 503 ด้วย upstream_busy เป็นเหตุการณ์ลองใหม่ในไม่กี่วินาที 402 หมายถึงยอดเงินเติมเงินหมดหรือเครดิตทดลองใช้หมด ซึ่งควรแจ้งเตือนคุณแทนที่จะลองใหม่
บันทึกตอนแต่ละตอนและบทสรุปไปยังฐานข้อมูลของคุณเองก่อนสร้างตอนถัดไป หากคำขอล้มเหลวระหว่างทางในชุดงานกลางคืน คุณสามารถเริ่มใหม่จากตอนล่าสุดที่บันทึกไว้ และคุณไม่เคยจ่ายสองครั้งสำหรับข้อความเดียวกัน เก็บเวอร์ชันพรอมต์และตัวเลขการใช้งานไว้ข้างกันกับแต่ละตอนเพื่อให้ต้นทุนต่อตอนเป็นการสอบถามแทนที่จะเป็นการคาดเดา
สำหรับผลิตภัณฑ์บทบาทสมมติ ให้รักษางบประมาณต่อเซสชัน จำกัดจำนวนรอบหรือโทเคนรวมที่เซสชันเดียวสามารถบริโภคได้ และแสดงข้อความที่ชัดเจนแก่ผู้ใช้เมื่อถึงขีดจำกัด เนื่องจากพรอมต์รวมประวัติ เซสชันที่ยาวมากจะมีต้นทุนต่อรอบสูงกว่าเซสชันใหม่ ซึ่งคือเหตุผลที่การสรุปรอบเก่ามีความสำคัญมากกว่าการพอดีกับหน้าต่าง พรอมต์ไม่ถูกใช้ในการฝึกสอน ซึ่งคุณสามารถระบุในบันทึกความเป็นส่วนตัวของผลิตภัณฑ์ของคุณควบคู่ไปกับนโยบายการจัดเก็บข้อมูลของคุณเอง
ถาม-ตอบ
ตอนหนึ่งตอนสามารถยาวได้แค่ไหนในคำขอเดียว?
เอาต์พุตถูกจำกัดที่ 32,000 โทเคนต่อคำขอและแชร์หน้าต่างบริบท 100,000 โทเคนกับพรอมต์ บทความยาว 3,000 ตัวอักษรพอดีกับพื้นที่ ดังนั้นจึงตั้งค่า max_tokens สูงกว่าประมาณการเล็กน้อย
ฉันจะรักษาความสอดคล้องของตัวละครตลอดหลายร้อยตอนได้อย่างไร?
เก็บแผ่นตัวละครและบล็อกสไตล์ไว้ในระบบพรอมต์ในทุกคำขอ และนำพล็อตไปข้างหน้าโดยการสรุปแบบเลื่อนพร้อมด้วยบทก่อนหน้า
อนุญาตให้นิยายผู้ใหญ่หรือไม่?
นิยายผู้ใหญ่ที่ถูกต้องตามกฎหมายระหว่างตัวละครผู้ใหญ่ไม่ถูกปฏิเสธ และบริการนี้สำหรับผู้ใช้งานอายุ 18 ปีขึ้นไป เนื้อหาทางเพศที่เกี่ยวข้องกับเด็กจะถูกบล็อกเสมอด้วย 403 รวมถึงในนิยายและการสวมบทบาท
ฉันสามารถสตรีมการตอบกลับจากบทบาทสมมติได้หรือไม่?
ได้ ตั้งค่า stream เป็น true เพื่อรับเหตุการณ์ที่ส่งจากเซิร์ฟเวอร์ และใช้ลำดับหยุดเพื่อป้องกันไม่ให้โมเดลเขียนบรรทัดของผู้ใช้
คีย์ของคุณอยู่ห่างแค่แบบฟอร์มเดียว
สร้างบัญชี คีย์ คัดลอกคีย์ เปลี่ยน URL พื้นฐาน นั่นคือการตั้งค่าทั้งหมด