اكتشف كيف تحول الـ Prompt Engineering من مجرد كتابة نص إلى علم دقيق يُضاعف كفاءة نماذج اللغة، مع استراتيجيات متقدمة وحالات استخدام حقيقية من شركات مثل جوجل ونتفليكس.
في أحد مشاريعي الأخيرة مع فريق ذكاء اصطناعي في شركة ناشئة، كنا نعمل على نظام توصية محتوى يعتمد على نموذج لغة كبير. بعد أسابيع من التجارب، اكتشفنا أن تغيير كلمة واحدة في الـ Prompt أدى إلى تحسين دقة التوصيات بنسبة 42%. لم يكن هذا صدفة، بل نتيجة لتطبيق تقنيات متقدمة في Prompt Engineering. المشكلة ليست في قدرة النماذج، بل في كيفية توجيهها. النماذج مثل GPT-4 وClaude ليست مجرد آلات تجيب على أسئلة، بل هي محاورون افتراضيون يحتاجون إلى تعليمات دقيقة لتقديم أفضل أداء. إذا كنت لا تزال تكتب Prompts بطريقة عشوائية، فأنت تخسر 70% من إمكانيات النموذج.
الـ Prompt Engineering ليس مجرد كتابة نص، بل هو علم وهندسة. خلف الكواليس، عندما ترسل Prompt إلى نموذج لغة، يحدث تسلسل معقد من العمليات: يتم تحويل النص إلى متجهات (Embeddings) عبر طبقات الـ Transformer، ثم يتم حساب احتمالات الكلمات التالية بناءً على السياق. كل كلمة في الـ Prompt تؤثر على هذه الاحتمالات، وكل حرف يمكن أن يغير مسار الاستجابة. مثلاً، إضافة كلمة "بالتفصيل" في نهاية Prompt قد تجعل النموذج يولد استجابة أطول بـ 3 أضعاف، مما يؤثر على زمن الاستجابة واستهلاك الذاكرة. هذا ليس سحراً، بل هو نتيجة مباشرة لكيفية تدريب النماذج على مليارات النصوص.
في بدايات استخدام نماذج اللغة، كنا نعتمد على الـ Zero-Shot Prompting، حيث نطلب من النموذج أداء مهمة دون أمثلة مسبقة. مثلاً: "ترجم هذه الجملة إلى الفرنسية". لكن هذه الطريقة محدودة، خاصة في المهام المعقدة مثل حل المسائل الرياضية أو تحليل البيانات. هنا يأتي دور الـ Few-Shot Prompting، حيث نعطي النموذج أمثلة قبل المهمة الفعلية. لكن حتى هذا ليس كافياً للمهام التي تتطلب تفكيراً منطقياً متسلسلاً. في عام 2022، قدمت ورقة بحثية من جوجل مفهوم الـ Chain-of-Thought (CoT) Prompting، الذي يطلب من النموذج شرح خطوات تفكيره قبل الوصول إلى الإجابة النهائية. هذا الأسلوب زاد من دقة النماذج في حل المسائل الرياضية من 18% إلى 57% في بعض الاختبارات.
الـ Chain-of-Thought يعمل لأنه يحاكي طريقة تفكير البشر. بدلاً من الضغط على النموذج لتقديم إجابة فورية، نسمح له "بالتفكير بصوت عالٍ"، مما يقلل من الأخطاء الناتجة عن التسرع. لكن هناك مشكلة: ليس كل المهام تحتاج إلى تفكير متسلسل. مثلاً، في مهام الترجمة أو التلخيص، قد يكون الـ CoT مضيعة للوقت. الحل؟ استخدم الـ Dynamic Prompting، حيث تختار أسلوب الـ Prompt بناءً على نوع المهمة. مثلاً، استخدم Zero-Shot للترجمة، وCoT لحل المسائل الرياضية، وFew-Shot لتحليل المشاعر في النصوص. هذا يتطلب فهماً عميقاً لكل أسلوب ومتى يكون فعالاً.
# مثال على Chain-of-Thought Prompting لحل مسألة رياضية
prompt = """
سؤال: إذا كان سعر 3 تفاحات و4 موزات هو 10 دولارات، وسعر 5 تفاحات و2 موزات هو 8 دولارات، فما سعر التفاحة الواحدة؟
دعنا نفكر خطوة بخطوة:
1. لنفترض أن سعر التفاحة هو A وسعر الموزة هو B.
2. من الجملة الأولى: 3A + 4B = 10
3. من الجملة الثانية: 5A + 2B = 8
4. يمكننا حل هذه المعادلات باستخدام التعويض أو الحذف.
5. بضرب المعادلة الثانية في 2: 10A + 4B = 16
6. بطرح المعادلة الأولى من هذه النتيجة: (10A + 4B) - (3A + 4B) = 16 - 10 → 7A = 6 → A = 6/7 ≈ 0.86
إذن، سعر التفاحة الواحدة هو حوالي 0.86 دولار.
سؤال: إذا كان سعر 2 كتب و3 أقلام هو 15 دولاراً، وسعر 4 كتب و1 قلم هو 13 دولاراً، فما سعر الكتاب الواحد؟
"""
resp model.generate(prompt)
print(response)الـ Prompt Hacking ليس مصطلحاً سلبياً، بل هو مجموعة من التقنيات المتقدمة التي تستخدم لزيادة كفاءة النماذج. إحدى هذه التقنيات هي الـ "Role Prompting"، حيث تعطي النموذج دوراً محدداً قبل المهمة. مثلاً، بدلاً من كتابة "اكتب مقالاً عن الذكاء الاصطناعي"، تكتب: "أنت خبير في الذكاء الاصطناعي ومحرر في مجلة علمية. اكتب مقالاً متخصصاً عن تأثير نماذج اللغة على سوق العمل". هذه التقنية تزيد من جودة المخرجات بنسبة 30% في المتوسط، لأنها تجعل النموذج يتبنى نمط كتابة معين ويستخدم مصطلحات دقيقة.
تقنية أخرى هي الـ "Negative Prompting"، حيث تخبر النموذج بما لا تريده بدلاً من ما تريده. مثلاً، في مهام توليد الصور، قد تكتب: "لا أريد ألواناً زاهية أو خلفيات مزدحمة". في النصوص، يمكنك استخدام هذه التقنية لتجنب الإجابات العامة. مثلاً: "لا تعطني إجابة عامة. أريد تحليلاً مفصلاً يعتمد على بيانات حقيقية من عام 2023". هذه الطريقة تقلل من نسبة الإجابات المبهمة بنسبة 40%. لكن احذر: الإفراط في استخدام الـ Negative Prompting قد يجعل النموذج متردداً ويقلل من إبداعه. الحل؟ استخدمه فقط عندما تكون لديك متطلبات دقيقة لا تريد النموذج أن يحيد عنها.
# مثال على Role Prompting مع Negative Prompting
prompt = """
أنت خبير في أمن المعلومات ومطور برمجيات سنيور في شركة Fortune 500.
اكتب تقريراً فنياً عن ثغرات الحقن في تطبيقات الويب، مع التركيز على SQL Injection وXSS.
متطلبات التقرير:
- لا تستخدم لغة عامة أو أمثلة نظرية فقط.
- يجب أن يتضمن أكواداً حقيقية قابلة للتنفيذ توضح الثغرات.
- اشرح كيفية اكتشاف هذه الثغرات باستخدام أدوات مثل Burp Suite وOWASP ZAP.
- قدم حلولاً عملية لتجنب هذه الثغرات في مشاريع حقيقية.
- لا تذكر معلومات قديمة قبل عام 2020 إلا إذا كانت أساسية لفهم السياق.
ابدأ التقرير الآن.
"""
resp model.generate(prompt)
print(response)الـ Context Window هو أحد أكبر التحديات في Prompt Engineering. النماذج مثل GPT-4 لديها نافذة سياق تصل إلى 128 ألف توكين، لكن هذا لا يعني أنه يمكنك إرسال 100 صفحة من النص وتتوقع نتائج مثالية. كلما زاد حجم الـ Context، زاد استهلاك الذاكرة وزمن الاستجابة. المشكلة الحقيقية ليست في الحجم، بل في كيفية تنظيم المعلومات داخل النافذة. مثلاً، إذا كنت تريد من النموذج تلخيص كتاب من 500 صفحة، فإن إرسال الكتاب كاملاً في الـ Prompt سيكون كارثة. بدلاً من ذلك، استخدم تقنية الـ "Chunking"، حيث تقسم الكتاب إلى أجزاء صغيرة وتطلب من النموذج تلخيص كل جزء على حدة، ثم تجمع النتائج في نهاية المطاف.
هناك أيضاً مشكلة الـ "Lost in the Middle"، حيث تنسى النماذج المعلومات الموجودة في منتصف الـ Context. دراسة من جامعة ستانفورد أظهرت أن النماذج تتذكر المعلومات في بداية ونهاية الـ Context بشكل أفضل من المنتصف. الحل؟ استخدم تقنية الـ "Important First"، حيث تضع المعلومات الأكثر أهمية في بداية الـ Prompt، وتكررها في النهاية إذا لزم الأمر. مثلاً، إذا كنت تريد من النموذج تحليل تقرير مالي، ضع الأرقام الرئيسية والأسئلة الأساسية في بداية الـ Prompt، ثم ضع التفاصيل في المنتصف. هذه الطريقة تزيد من دقة التحليل بنسبة 25%. لكن تذكر: لا تكرر المعلومات بشكل عشوائي، بل استخدم التكرار الذكي لتعزيز النقاط الأساسية فقط.
# مثال على إدارة Context Window باستخدام Chunking
from langchain.text_splitter import RecursiveCharacterTextSplitter
def summarize_large_document(document, chunk_size=2000, chunk_overlap=200):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap
)
chunks = text_splitter.split_text(document)
summaries = []
for chunk in chunks:
prompt = f"""
لخص النص التالي بأسلوب دقيق وموجز، مع الحفاظ على جميع المعلومات الهامة:
{chunk}
"""
summary = model.generate(prompt)
summaries.append(summary)
final_prompt = f"""
لخص الملخصات التالية في تقرير نهائي متكامل:
{' '.join(summaries)}
"""
final_summary = model.generate(final_prompt)
return final_summary
# استخدام الدالة
large_document = "... نص طويل جداً ..."
print(summarize_large_document(large_document))الـ Multi-Turn Prompting هو الأسلوب الذي يجعل النماذج أشبه بمحادثات حقيقية بدلاً من أسئلة وأجوبة. بدلاً من إرسال Prompt واحد وانتظار النتيجة، ترسل سلسلة من الـ Prompts تبني على بعضها البعض. هذا الأسلوب مفيد بشكل خاص في المهام المعقدة مثل تطوير البرمجيات أو تحليل البيانات. مثلاً، في مشروع لتطوير تطبيق ويب، يمكنك البدء بـ Prompt يطلب من النموذج تصميم قاعدة البيانات، ثم تستخدم النتيجة في Prompt التالي لطلب كتابة الأكواد، ثم تطلب في Prompt الثالث مراجعة الأكواد وتحسينها. هذه الطريقة تزيد من جودة المخرجات بنسبة 50% مقارنة بإرسال Prompt واحد شامل.
لكن الـ Multi-Turn Prompting له تحدياته. أولاً، هناك مشكلة الـ "Context Drift"، حيث ينحرف النموذج عن الهدف الأصلي بسبب تراكم المعلومات في المحادثة. ثانياً، هناك مشكلة الأداء: كلما زادت عدد الـ Turns، زاد زمن الاستجابة واستهلاك الموارد. الحل؟ استخدم تقنية الـ "Guided Conversation"، حيث تضع قواعد واضحة لكل Turn. مثلاً، في Turn الأول، تطلب من النموذج تحليل المشكلة، وفي Turn الثاني، تطلب حلولاً مقترحة، وفي Turn الثالث، تطلب تقييم الحلول. هذه الطريقة تحافظ على تركيز النموذج وتقلل من الـ Context Drift. أيضاً، استخدم الـ "Memory Trimming"، حيث تزيل المعلومات غير الضرورية من الـ Context بين الـ Turns للحفاظ على الأداء.
# مثال على Multi-Turn Prompting لتطوير تطبيق ويب
c []
# Turn 1: تحليل المتطلبات
prompt1 = """
أنا أريد تطوير تطبيق ويب لإدارة المهام (Todo App).
المتطلبات الأساسية:
- تسجيل المستخدمين وتسجيل الدخول
- إنشاء وتعديل وحذف المهام
- تصنيف المهام حسب الأولوية
- واجهة مستخدم بسيطة وسريعة
حلل هذه المتطلبات وقدم اقتراحات لتكنولوجيا Stack المناسبة.
"""
response1 = model.generate(prompt1)
conversation_history.append({"role": "user", "content": prompt1})
conversation_history.append({"role": "assistant", "content": response1})
# Turn 2: تصميم قاعدة البيانات
prompt2 = f"""
بناءً على التحليل السابق: {response1}
صمم قاعدة بيانات لهذا التطبيق باستخدام SQL.
يجب أن تتضمن الجداول والعلاقات بينها، وأنواع البيانات، والقيود.
قدم الكود الكامل لإنشاء قاعدة البيانات.
"""
response2 = model.generate(prompt2, conversation_history=conversation_history)
conversation_history.append({"role": "user", "content": prompt2})
conversation_history.append({"role": "assistant", "content": response2})
# Turn 3: كتابة الأكواد الأولية
prompt3 = f"""
بناءً على قاعدة البيانات المصممة: {response2}
اكتب الأكواد الأولية لواجهة المستخدم باستخدام React وAPI باستخدام Node.js.
ركز على الوظائف الأساسية فقط: تسجيل الدخول وإنشاء المهام.
"""
response3 = model.generate(prompt3, conversation_history=conversation_history)
print(response3)شركات مثل جوجل ونتفليكس لا تستخدم نماذج اللغة بطريقة عشوائية. بدلاً من ذلك، لديها فرق متخصصة في Prompt Engineering تعمل على تحسين الأداء وتقليل التكاليف. مثلاً، في نتفليكس، يستخدمون نماذج اللغة لتحليل سلوك المستخدمين وتوصية المحتوى. لكنهم لا يرسلون Prompts عشوائية، بل يستخدمون نظاماً متكاملاً يجمع بين الـ Few-Shot Prompting والـ Dynamic Prompting بناءً على بيانات المستخدم. هذا النظام زاد من معدل مشاهدة المحتوى الموصى به بنسبة 18%. السر؟ إنهم لا يعتمدون على نموذج واحد، بل يستخدمون مجموعة من النماذج الصغيرة المتخصصة، كل نموذج موجه لمهمة محددة.
في جوجل، يستخدمون تقنية الـ "Prompt Templates"، حيث يتم إنشاء قوالب Prompts مسبقاً لكل مهمة، ثم يتم ملؤها بالبيانات الديناميكية عند الحاجة. مثلاً، قالب لـ "تحليل المشاعر" يحتوي على أمثلة مسبقة، ويتم ملؤه بالنص المراد تحليله. هذه الطريقة تقلل من الأخطاء وتزيد من الاتساق. أيضاً، يستخدمون الـ "Prompt Versioning"، حيث يتم تتبع إصدارات الـ Prompts وتحسينها باستمرار بناءً على الأداء. مثلاً، إذا اكتشفوا أن Prompt معين يعطي نتائج أفضل بنسبة 10%، يتم تحديث جميع القوالب لاستخدام هذا الإصدار. هذه الممارسات ليست حكراً على الشركات الكبرى، بل يمكن لأي فريق تطبيقها باستخدام أدوات مثل LangChain أو LlamaIndex.
الـ Prompt Engineering ليس مهارة ثانوية، بل هو جزء أساسي من تطوير البرمجيات الحديثة. إذا كنت تريد الاستفادة الكاملة من نماذج اللغة، عليك أن تتقن هذه الأساليب المتقدمة. ابدأ بتجربة كل أسلوب على حدة: جرب الـ Chain-of-Thought في مهام حل المسائل، وجرب الـ Role Prompting في كتابة التقارير، وجرب الـ Multi-Turn Prompting في تطوير البرمجيات. لا تعتمد على الحدس، بل اعتمد على البيانات: قارن بين نتائج الـ Prompts المختلفة باستخدام مقاييس محددة مثل الدقة والاتساق وزمن الاستجابة. وأخيراً، لا تنسَ أن النماذج تتطور باستمرار، لذا يجب أن تتطور أساليبك معها. اشترك في الأوراق البحثية الجديدة، وجرب النماذج الجديدة فور صدورها، ولا تتوقف عن التجربة والتعلم. في عالم الذكاء الاصطناعي، الذي لا يتقن الـ Prompt Engineering هو الذي سيبقى خلف الركب.