حدد أربع مبادئ أولاً
- طلب واحد لكل مهمة.إذا طلبت من النموذج كتابة القصة وملخصًا وإخراج JSON، ستخسر في الثلاثة. افصلها إلى استدعاءات متعددة، التكلفة منخفضة جداً، مليون رمز (token) في الإدخال يكلف $0.25 فقط.
- القواعد يجب أن تكون قابلة للتحقق.'اكتب بأسلوب حيوي' غير قابل للتحقق، لكن 'لا تتجاوز 120 حرفًا لكل فقرة، مع وصف بيئي واحد على الأقل' قابل للتحقق.
- أولوية الصياغة الإيجابية.قول «اكتب فقط الحركات والحوار» أكثر استقراراً من قول «لا تكتب أفكاراً داخلية».
- ابدأ بعينات صغيرة، ثم انتقل إلى الدفعات.أي تعديل على الموجّه، قارن أولاً بخمسة إلى عشرة أمثلة، ثم انشره.
هذا النموذج لا يرفض المحتوى البالغ القانوني، والخيال، والمواضيع المثيرة للجدل، لذا لا داعي للالتفاف في الموجّه أو التكرار في إعلان "هذا مجرد رواية". وضّح المهمة مباشرة. الحد الوحيد الصارم هو المحتوى الجنسي مع القاصرين (حتى لو كان خيالياً) الذي يعيد 403، ولا يمكن تغييره بالصياغة.
هيكل نظام الموجّه ذو القسمين
نوصي بتقسيم نظام الموجّه إلى جزأين: 'قواعد' و'إعدادات'. ضع القواعد أولاً ومرقّمة، والإعدادات لاحقًا وتكتب الحقائق فقط. فيما يلي مثال لكتابة راوٍ روائي:
你是「夜航」,一名为成年读者写黑色悬疑小说的叙述者。
# 规则
1. 第三人称过去时,每段不超过 120 字。
2. 不替用户的角色做决定,只写环境和其他角色的反应。
3. 每次输出 300 到 500 字,结尾停在一个未决的动作上。
4. 不总结、不点评、不加免责声明,直接写正文。
# 设定
时间:1998 年深秋。地点:港口城市旧码头区。
主角:沈野,退役水警,嗜烟,右耳有旧伤。بعض النقاط الرئيسية:
- لا تتجاوز ست قواعد. كلما زادت القواعد، زاد إهمال القواعد اللاحقة.
- القيود الرقمية (عدد كلمات الفقرة، طول المخرجات) أكثر فعالية من الصفات.
- قيود النهاية (التوقف عند فعل معلق) تسهل استمرارية المحادثات متعددة الجولات.
- لا تدرج مسار القصة في الإعدادات. القصة تتقدم عبر رسائل المستخدم، وإلا ستتنافس مع مدخلات المستخدم لاحقاً.
طول المخرجات يجب أن يتوافق مع max_tokens: إذا كانت القاعدة تقول 500 كلمة و max_tokens تساوي 200، سيتم قطع الجملة في المنتصف.
تفاصيل إضافية: أفضل أن تعبر كل قاعدة مرقمة في النظام عن فكرة واحدة. "لا تتجاوز 120 كلمة، ولا تلخص" تبدو قاعدة واحدة لكنها اثنتان. افصلها لسهولة الالتزام. اقرأ القواعد واحداً تلو الآخر واسأل: هل يمكنني فحص الالتزام بها بصرياً؟ إذا لا، أعد صياغتها لتكون قابلة للفحص.
كيفية كتابة الشخصية دون انحراف
انحراف الشخصية هو المشكلة الأكثر شيوعاً في المحادثات متعددة الأدوار: تكون النبرة طبيعية في الحلقات الخمس الأولى، ثم تبدأ الشخصية في «الخروج من الدور» بحلول الحلقة العشرين. هناك ثلاثة حلول.
- حدد خصائص قابلة للملاحظة فقط.«شِن يِي: مدخن، لديه جرح قديم في الأذن اليمنى، يتحدث بجمل قصيرة» أفضل من «شِن يِي شخص معقد وجذاب».
- اكتب أسلوب الكلام كأمثلة.قدم جملتين أو ثلاث جمل كأمثلة؛ يتفوق النموذج في محاكاة الجمل النموذجية على قدرته على فهم الصفات.
- أعد التذكير بشكل دوري.عندما تكون المحادثة طويلة، أضف سطر تذكير قصير في نهاية رسالة المستخدم كل بضع حلقات، مثل «حافظ على أسلوب الجمل القصيرة لشِن يِي»، وتكلفتها بضع عشرات من الرموز فقط.
إضافة، لا تخلط بين إعداد الشخصية وقواعد المخرجات. القواعد هي "كيف تكتب"، والإعداد هو "من يكتب". افصلهما لتتمكن من تغيير الشخصية دون تغيير القواعد، ولتسهيل مقارنة A/B. انتبه لإجمالي سياق المحادثات الطويلة، انظر إلى 100k سياق طويل عملي.
في سيناريوهات الشخصيات المتعددة، أضف قاعدة: كل شخصية في سطر منفصل، مع جملة نموذجية لأسلوب الكلام لكل شخصية لتجنب تشابه الأصوات. للشخصيات التي يلعبها المستخدم، اكتب فقط "يتم التحكم بها من قبل المستخدم" في الإعداد، واجعل النموذج لا يكتب نيابة عنه.
التحكم في مخرجات JSON عبر التعليمات
لا تفترض أن النموذج 'سيعيد' حتماً JSON صالحاً. الطريقة الموثوقة هي ثلاثية: تحديد التنسيق في الأوامر، خفض العشوائية في المعاملات، وحل بديل في الكود.
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("老周把钥匙拍在桌上,冷着脸说:账本和那把铜钥匙,今晚都得还我。"))هذا الكود يظهر بعض العادات:
- شرح التنسيق في النظام، مع نطاقات القيم (
calm|tense|angry). - منع الكتل النصية والنصوص التفسيرية بوضوح، مع إزالة أي حواجز محتملة في الكود كإجراء احتياطي مزدوج.
- اتفاق الحقول المفقودة في التعليمات (null، مصفوفة فارغة) لتجنب تخيل النموذج.
- إعادة المحاولة عند فشل التحليل لها حد أقصى، ثم إرجاع None ليقرر المتصل ماذا يفعل.
إذا كانت الحقول كثيرة، الصق كائن مثال كامل في الموجّه أولاً، ثم اطلب منه الإخراج وفقاً له. هذا عادة أدق من وصف الكثير من القواعد.
اقتراحات قيم temperature و top_p
هذه نقاط بداية وليست حقائق نهائية. اعتمد على مقارنة عيناتك. المبدأ: غيّر معامل واحد فقط في كل مرة، واترك الآخر افتراضياً.
| السيناريو | temperature | top_p | ملاحظات |
|---|---|---|---|
| استخراج JSON، التصنيف | 0 إلى 0.3 | الافتراضي | للثبات، يجب أن تكون نتائج الاستدعاء المتكرر متسقة |
| إعادة الصياغة، التحسين | 0.5 إلى 0.7 | الافتراضي | الحفاظ على المعنى الأصلي مع السماح بتغيير الصياغة |
| استكمال الروايات، حوار الشخصيات | 0.8 إلى 1.0 | 0.9 إلى 0.95 | لزيادة التنوع، انتبه إلى الانحراف العرضي |
| العصف الذهني، التسمية | حوالي 1.0 | الافتراضي | أخذ أفضل نتيجة من عدة عينات |
إشارتان تساعدانك على تحديد الاتجاه: التكرار اللفظي أو استخدام نفس النمط يشير إلى انخفاض درجة الحرارة؛ ظهور محتوى غير ذي صلة أو عدم اتساق أسماء الشخصيات يشير إلى ارتفاع درجة الحرارة أو top_p. معامل stop مفيد أيضًا، مثل إيقاف النموذج عند علامة معينة لتسهيل التوليد على مراحل.
أخطاء شائعة في الصياغة
| الصياغة | المشكلة | التعديل |
|---|---|---|
| "حاول ألا يكون النص طويلاً جداً" | لا توجد أرقام، مما يجعل التنفيذ صعباً | "لا تتجاوز 400 كلمة" |
| "لا تكتب A، ولا تترك A فارغاً" | تناقض القواعد مع بعضها | الاحتفاظ بقاعدة واحدة واضحة فقط |
| متطلبات التنسيق مختلطة وسط الحوار | تُطغى عليها بعد حوار طويل | وضعها في system، أو إعادة التأكيد عليها في نهاية كل دورة |
| طلب النموذج "أن يلعب دور AI بدون قيود" | إطار عمل فارغ لا يفرض قيوداً على المخرجات | تحديد المهام وقواعد الكتابة بشكل محدد |
| إدراج عشرات القواعد دفعة واحدة | فقدان فعالية القواعد في النصف الثاني | الاختزال إلى ست قواعد أو أقل، وتوزيع الباقي على طلبات أخرى |
| طلب JSON يقتصر على "أعد JSON" | أسماء الحقول تتغير في كل مرة | توفير التنسيق الكامل مع أمثلة |
الخلاصة المشتركة في هذا الجدول هي: كلما كان النص أكثر تحديداً كان أكثر فعالية، وكلما كان أكثر عمومية كان أقل فائدة. لا تعتمد على "التكرار" كحل؛ فكتابة نفس الجملة ثلاث مرات مع التغميق وعلامات التعجب غالباً ما تكون أقل فعالية من تحويلها إلى قاعدة رقمية واضحة. المفتاح هو الدقة والاختصار، مدعوماً بالتحقق عبر الأمثلة.
قائمة إجراءات التصحيح
- تثبيت درجة الحرارة عند 0.2 لإعادة إنتاج المشكلة.
- تغيير جزء واحد فقط من الـ Prompt وإعادة تشغيل نفس مجموعة الأمثلة.
- فحص
finish_reason: إذا كانت القيمة length، فالمشكلة في max_tokens وليس في الـ Prompt. - فحص prompt_tokens في usage: هل نظام التعليمات طويل جداً مما استهلك مساحة الحوار التاريخي؟
- بعد الإصلاح، أعد ضبط درجة الحرارة إلى القيمة المناسبة للتطبيق وأعد التحقق عبر أخذ عينات جديدة.
لمزيد من تفاصيل التكامل، يُرجى الرجوع إلى دليل التكامل، والقائمة الكاملة للمعلمات متاحة في الوثائق. إذا كنت تقيّم ما إذا كنت ستستخدم خدمات الوكيل (Relay)، فإن تحليل التكلفة والمفاضلات موجود في مقال تحليل وكلاء API، ولن نكرره هنا.