تم التحديث
الروايات الإلكترونية الصينية وتطبيقات لعب الأدوار: السياق والشخصيات والتكلفة
أدب الويب الصيني المتسلسل والدردشة بشخصيات هي من بين أحمال العمل النصية الأكثر طلباً: آلاف الأحرف لكل فصل، وشخصيات يجب أن تظل متسقة لعدة أشهر، وقراء يلاحظون كل خطأ. يوضح هذا الدليل كيفية هيكلة الموجّهات، وإدارة نافذة السياق المكونة من 100,000 رمز، وتقدير التكلفة بناءً على الافتراضات المذكورة.
كيف تبدو أحمال العمل هذه
تُكتب سلاسل أدب الويب في فصول تتراوح بين 2,000 و4,000 حرف، وغالباً ما تُنشر يومياً، مع حبكة تمتد لمئات الفصول. تطبيقات لعب الأدوار هي النسخة المحادثة: شخصية، سيناريو، وسجل طويل. كلاهما يحتاج إلى نفس ثلاثة أشياء من واجهة برمجة التطبيقات: سياق كافٍ للتذكر، ميزانية مخرج كافية للكتابة بتوسع، وأسلوب لا ينحرف.
تقدم الخدمة نقطة نهاية دردشة متوافقة مع OpenAI عند https://api.chinesellmapi.com/v1 مع نموذج نصي واحد، معرفه uncensored. نافذة السياق هي 100,000 رمز مشتركة بين الموجّه والإكمال، ويبلغ الافتراضي لـ max_tokens 2,048 ويمكن أن يصل إلى 32,000، وتُمرر حقول أخذ العينات القياسية مثل temperature، top_p وstop كما هي. البث المتدفق مدعوم، وهو ما يناسب الدردشة. توجد ملاحظات الإعداد والترميز الأساسية في دليل التطبيق السريع.
قواعد المحتوى، مذكورة من البداية
هذه الخدمة مخصصة للبالغين فقط. الخيال البالغ والمواضيع الناضجة والمواضيع الجديلة للنقاش لا تُرفض بحد ذاتها، والخدمة موجهة للمستخدمين الذين تبلغ أعمارهم 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 عندما تحتاج إلى التزام الشخصية بالنص بدقة.
التحكم في الأسلوب الذي يصمد أمام سلسلة طويلة
انحراف الأسلوب هو الفشل الذي يشتكي منه القراء أكثر من غيره: يصبح الراوي أكثر انفتاحًا في الحديث، ويتحول الحوار إلى الرسمية، ويتسارع الإيقاع. قاتله بالتفاصيل. بدلًا من "اكتب بأسلوب راقٍ"، صف عادات قابلة للقياس: طول الجملة، وتكرار استخدام المصطلحات العامية، وكمية تفاصيل الطقس والأشياء التي يجب تضمينها، وما إذا كانت الفصول تنتهي بمعلقة أو بنبرة هادئة. فقرة أو فقرتان قصيرتان كنماذج بالصوت المستهدف، مدمجة في كتلة النمط، تفيد أكثر من صفحة من الصفات.
الأجناس المختلفة تحتاج إلى مقاييس مختلفة. السلسلة التاريخية أو الخيالية تستفيد من قاموس للمصطلحات المخترعة، مثل الممالك والطوائف والتقنيات، لضمان عدم تهجئة الاسم نفسه بطريقتين. الرومانسية الحديثة تعتمد على إيقاع الحوار والتفاصيل الجسدية الصغيرة. اللغز يحتاج إلى دفتر أدلة للقرائن: قائمة بالحقائق التي رآها القارئ، حتى لا يتناقض النموذج معها. احتفظ بكل هذه القوائم في موجّه النظام وحدّثها مع تقدم القصة.
أخيرًا، ثبّت درجة الحرارة وقيمة 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 فصلاً تحت افتراضات الصف الأول. تحقق من الأسعار للأسعار الحالية، وانظر الأسئلة الشائعة حول التجربة لتفاصيل الحساب.
ملاحظات تشغيلية للإنتاج
توليد الفصل طلب طويل، لذا استخدم مهلات زمنية سخية أو استخدم البث وجمع النص بنفسك. تعامل مع خطأ 429 بزيادة تأخير قصيرة، حيث يسمح كل مفتاح بـ 300 طلب في الدقيقة، واعتبر خطأ 503 مع upstream_busy كحدث لإعادة المحاولة بعد ثوانٍ قليلة. يعني خطأ 402 أن رصيد مسبق الدفع قد استُنفد أو انتهت فترة التجربة المجاني، وهو ما يجب أن ينبهك بدلاً من إعادة المحاولة.
احفظ كل فصل تم توليده وملخصه في قاعدة بياناتك الخاصة قبل توليد الفصل التالي. إذا فشل الاستدعاء في منتصف دفع ليلي، يمكنك الاستئناف من آخر فصل تم تخزينه، ولا تدفع مرتين مقابل نفس النص. احفظ نسخة الموجّه وأرقام الاستخدام بجانب كل فصل بحيث تكون التكلفة لكل فصل استعلاماً بدلاً من تخمين.
لمنتجات لعب الأدوار، احجز ميزانية لكل جلسة. حدّ عدد الأدوار أو إجمالي الرموز التي يمكن أن تستهلكها جلسة واحدة، وأظهر للمستخدمين رسالة واضحة عند الوصول إلى الحد الأقصى. لأن الموجّهات تتضمن سجل المحادثة، فإن الجلسة الطويلة جدًا تكلف أكثر بكثير لكل دور من الجلسة الجديدة، ولهذا فإن تلخيص الأدوار القديمة مهم بما يتجاوز مجرد ملاءمة نافذة السياق. لا تُستخدم الموجّهات للتدريب، وهو ما يمكنك ذكره في ملاحظات الخصوصية الخاصة بمنتجك جنبًا إلى جنب مع سياسة التخزين الخاصة بك.
أسئلة وأجوبة
ما الحد الأقصى لطول الفصل في الطلب الواحد؟
يُقتصر المخرج على 32,000 رمز (token) لكل طلب، ويتقاسم نافذة السياق ذات الـ 100,000 رمز مع الموجّه. بما أن فصلًا مكونًا من 3,000 حرف يتسع بسهولة، اضبط max_tokens أعلى من تقديرك بقليل.
كيف أحافظ على اتساق الشخصيات عبر مئات الفصول؟
احتفظ بورقة الشخصية وكتلة النمط في الموجّه في كل استدعاء، وتابع القصة كملخص متحرك بالإضافة إلى الفصل السابق.
هل يُسمح بالخيال البالغ؟
لا تُرفض الخيال البالغ بين شخصيات بالغة، والخدمة مخصصة للمستخدمين الذين تبلغ أعمارهم 18 عامًا أو أكثر. يُحظر دائمًا محتوى الجنس الذي يتضمن قاصرين بخطأ 403، بما في ذلك في الخيال ولعب الأدوار.
هل يمكنني بث ردود لعب الأدوار؟
نعم. اضبط stream إلى true لتلقي أحداث مُرسلة من الخادم، واستخدم تسلسلات التوقف لمنع النموذج من كتابة أسطر المستخدم.
مفتاحك على بُعد نموذج واحد
أنشئ حسابًا، انسخ المفتاح، غيّر URL الأساسي. هذا هو الإعداد الكامل.