سلسلة الموجّهات (prompt chaining) تعني تقسيم العمل إلى سلسلة من الموجّهات، تصبح فيها مخرجات موجّه جزءًا من مُدخل الموجّه التالي. بدلًا من أن تطلب من النموذج قراءة خمسين مراجعة، وإيجاد المشكلات، وترتيبها، وكتابة تقرير دفعة واحدة، تطلب كلًا منها بدوره. لكل موجّه مهمة واحدة، وبين الخطوات تستطيع أنت (أو كودك) النظر في النتيجة، أو إصلاحها، أو التوقف.
المثال التالي سلسلة من ثلاث خطوات تحوّل مراجعات العملاء إلى ملاحظة لفريق المنتج. كل تبويب خطوة. مُدخل الخطوة 2 هو رد الخطوة 1 ملصوقًا، ومُدخل الخطوة 3 هو رد الخطوة 2.
[
{"review": 1, "complaint": "البطارية نفدت بعد 4 ساعات"},
{"review": 1, "complaint": "كابل الشحن قصير جدًا"},
{"review": 2, "complaint": "التطبيق يسجّل الخروج باستمرار"},
{"review": 3, "complaint": "البطارية لا تكفي طريق العودة"},
{"review": 4, "complaint": "التطبيق انهار أثناء الاقتران"},
{"review": 4, "complaint": "البطارية تنفد بسرعة"},
{"review": 5, "complaint": "الكابل أقصر من أن تُستخدم أثناء الشحن"}
]
الخطوة 1 تقرأ وتستخرج فقط. والخطوة 2 لا ترى المراجعات أبدًا، بل القائمة فقط، فلا تستطيع الانجراف نحو تلخيصها. والخطوة 3 تكتب فقط. إذا جاءت الخطوة 3 بنبرة خاطئة، تعيد تشغيل الخطوة 3 وحدها، ويبقى الاستخراج والتجميع كما هما.
لاحظ ما لا تقوله الخطوة 3: أن إحدى البطاريات نفدت بعد 4 ساعات، أو أن مشكلات التطبيق كانت تسجيل خروج وانهيارات. الخطوة 3 تلقت أسماء المحاور فقط، فلم تكن هذه التفاصيل في مُدخلها. تحديد ما تتلقاه كل خطوة هو قرار التصميم الأساسي في السلسلة، والتفصيل الذي تريده في الإجابة النهائية يجب أن يُمرَّر حتى النهاية.
لماذا السلسلة بدلًا من موجّه واحد كبير
لكل خطوة مهمة واحدة ومعيار واحد. الموجّه الواحد الذي يطلب الاستخراج والتحليل والكتابة المصقولة لديه ثلاثة أهداف يوازن بينها، ولا شيء يخبرك أيها قصّر فيه. أما الموجّه ذو المهمة الواحدة فيستطيع أن يقول بدقة كيف تبدو النتيجة الجيدة لتلك المهمة، وتستطيع أن تحكم على الرد وفقها.
تستطيع فحص الوسط. في الموجّه الواحد، تختفي الشكوى الفائتة داخل فقرة مكتوبة بإتقان ولا تراها أبدًا. أما في السلسلة، فقائمة الخطوة 1 أمامك. فحصها يستغرق ثوانٍ، وإصلاحها قبل الخطوة 2 أرخص من اكتشاف الخطأ في التقرير النهائي.
لكل خطوة إعداداتها الخاصة. الاستخراج والتجميع يحتاجان إلى درجة حرارة منخفضة ومخرجات منظمة يستطيع الكود تحليلها. أما خطوة الكتابة فيمكن أن تكون أكثر حرية. وفي الكود تستطيع حتى إرسال خطوات مختلفة إلى نماذج مختلفة، مثل نموذج صغير سريع للاستخراج.
الإخفاقات محلية. عندما تنكسر السلسلة، تعرف أي خطوة انكسرت، وتعيد تشغيلها وحدها.
والتكاليف حقيقية أيضًا. السلسلة تجري استدعاءات أكثر، فتستغرق وقتًا أطول وتكلّف أكثر من موجّه واحد. والخطأ الذي يمر من خطوة مبكرة يُحمل إلى كل خطوة لاحقة، ولهذا تستحق الخطوات الوسيطة الفحص.
كيف تصمم سلسلة
- اكتب الخطوات التي كنت ستتبعها يدويًا. إذا كنت ستعدّ قائمة أولًا، ثم ترتّبها، ثم تكتب عنها، فهذه ثلاثة موجّهات. الخطوات التي تحتاج إلى أنواع مختلفة من التفكير هي الأماكن الطبيعية للتقسيم.
- حدد صيغة مخرجات كل خطوة قبل أن تكتب موجّهها. كل ما تستهلكه الخطوة التالية يجب أن يكون سهل القراءة وسهل الفحص: مصفوفة JSON، أو قائمة مرقّمة، أو جدول. النثر الحر مقبول للخطوة الأخيرة فقط.
- مرّر ما تحتاجه الخطوة التالية فقط. الخطوة 2 أعلاه تتلقى قائمة الشكاوى، لا المراجعات. المُدخل الأقل يعني مشتتات أقل، ويجعل كل خطوة قابلة للاختبار وحدها.
- أضف فحصًا بين الخطوات. في الكود، حلّل JSON وتأكد من وجود الحقول. وفي المسائل التي تحتاج إلى حكم، يمكن أن يكون الفحص نفسه موجّهًا: "هل تحتوي هذه القائمة على كل شكوى في هذه المراجعات؟ أجب بنعم أو لا، ثم اذكر أي شكوى ناقصة."
- ميّز المادة الملصوقة بوضوح. مُدخل كل خطوة نص أنتجته خطوة سابقة، والفواصل تمنع النموذج من قراءته على أنه تعليمات جديدة.
إليك خطوة فحص للسلسلة أعلاه، تعمل على نسخة من مخرجات الخطوة 1 فاتتها شكوى. فحص كهذا موجّه منفصل بسؤال واحد ضيق، فتسهل إصابته أكثر من الاستخراج نفسه.
ناقصة
- المراجعة 4: البطارية تنفد بسرعة
إذا قال الفحص "ناقصة"، فأعد تشغيل الخطوة 1 أو أضف العنصر الناقص يدويًا قبل تشغيل الخطوة 2.
السلسلة في الكود
في الكود، السلسلة تتابع من الاستدعاءات يُبنى فيه كل موجّه من الإجابة السابقة. تستخدم هذه النسخة مكتبة Python من Anthropic، والشكل نفسه يعمل مع أي مزوّد.
import json
import anthropic
client = anthropic.Anthropic()
MODEL = "your-model-id" # e.g. from your provider's model list
def ask(prompt):
response = client.messages.create(
model=MODEL,
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return response.content[0].text
reviews = open("reviews.txt", encoding="utf-8").read()
complaints = ask(
"List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
'Return a JSON array of objects with the keys "review" and "complaint". '
"Return only the JSON, with no code fence.\n\n"
f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints) # raises an error here if step 1 did not return valid JSON
themes = ask(
"Group these complaints into themes. Return only a JSON array with the keys "
'"theme", "count" and "reviews", sorted by count, highest first.\n\n'
f"<complaints>\n{complaints}\n</complaints>"
)
note = ask(
"Write a note of at most four sentences to the product team based on these "
f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)
سطر json.loads هو أبسط فحص ممكن: إذا أجابت الخطوة 1 بنثر، تتوقف السلسلة هناك بدلًا من تمرير مُدخل سيئ. أما سلسلة الإنتاج فتفحص الحقول أيضًا، وتعيد تشغيل الخطوة الفاشلة مرة واحدة، وتسجّل كل نتيجة وسيطة حتى يمكن تتبّع الإجابة النهائية السيئة إلى الخطوة التي سبّبتها.
السلسلة في تطبيق محادثة
لا تحتاج إلى كود لبناء سلسلة موجّهات. شغّل الخطوة 1، واقرأ الإجابة، وصحّح أي خطأ، والصقها في موجّه الخطوة 2. تنفيذ كل خطوة في محادثة جديدة يُبقي المحادثة السابقة خارج السياق، فلا تؤثر تعليمة كُتبت لخطوة في التي تليها. البقاء في محادثة واحدة أسرع وينجح عندما تكون الخطوات مترابطة، لكن السجل كله ينتقل مع كل رسالة جديدة.
السلسلة مقارنة بالتقنيات القريبة
سلسلة التفكير استدلال مكتوب داخل رد واحد، أما سلسلة الموجّهات فعدة ردود وأنت المتحكم فيما يمر بينها. ويجتمع الاثنان جيدًا: أي خطوة في السلسلة يمكن أن تطلب استدلالًا خطوة بخطوة.
في السلسلة، تحدد أنت الخطوات مسبقًا. أما عندما يقرر النموذج نفسه ما الخطوة التالية، مثل أن يبحث ويقرأ نتيجة ثم يختار إجراءً آخر، فالنمط عندئذ حلقة وكيل (agent loop)، وتشرحها صفحة ReAct. السلاسل الثابتة أسهل في الاختبار والتوقع، فهي نقطة البداية الأفضل كلما عرفت الخطوات مسبقًا.
الأسئلة الشائعة
ما هي سلسلة الموجّهات؟
سلسلة الموجّهات تقنية تقسم فيها المهمة إلى عدة موجّهات تعمل واحدًا بعد الآخر، وتُدرج مخرجات كل موجّه في الموجّه التالي. مثلًا، يستخرج موجّه الشكاوى من المراجعات، ويجمعها ثانٍ في محاور، ويكتب ثالث تقريرًا من المحاور.
ما الفرق بين سلسلة الموجّهات وسلسلة التفكير؟
سلسلة التفكير تحدث داخل رد واحد: يكتب النموذج استدلاله قبل الإجابة. أما سلسلة الموجّهات فتستخدم عدة استدعاءات منفصلة، وأنت أو كودك تمررون نتيجة كل منها إلى التالي. يمكنك فحص أي خطوة منفردة في السلسلة أو إصلاحها أو إعادة تشغيلها، وهذا ما لا تستطيعه مع الاستدلال داخل رد واحد.
هل يمكنني استخدام سلسلة الموجّهات في ChatGPT أو Claude دون كود؟
نعم. شغّل الموجّه الأول، وافحص الإجابة، ثم الصقها في الموجّه التالي، إما في المحادثة نفسها أو في محادثة جديدة. بدء محادثة جديدة لكل خطوة يمنع المسودات والتعليمات السابقة من التأثير في الخطوات اللاحقة.
متى أستخدم سلسلة موجّهات بدلًا من موجّه واحد؟
استخدم السلسلة عندما يطلب موجّه واحد عدة أنواع مختلفة من العمل، مثل الاستخراج والتحليل والكتابة، أو عندما تحتاج إلى فحص نتيجة وسيطة أو إعادة استخدامها. إذا كان موجّه واحد يعطي أصلًا إجابة موثوقة، فالسلسلة لا تضيف إلا استدعاءات وتكلفة ووقت انتظار.