عندما يرسل مطور مبتدئ برومبت لـ LLM فيعود الرد فارغاً أو مليئاً بالهلاوس، بينما يعود رد مطور محترف بدقة جراحية وسرعة البرق. الفرق ليس في النموذج، بل في هندسة البرومبت. إليك كيف تحول كلماتك إلى أوامر يفهمها الذكاء الاصطناعي كما لو كنت تتحدث مع سيرفر حقيقي.
في أحد المشاريع الكبيرة لشركة تكنولوجيا سعودية، كنا نعمل على نظام توصيات للمحتوى العربي باستخدام نماذج لغة كبيرة. أرسلنا برومبت بسيط: "اقترح محتوى عربياً مناسباً لهذا المستخدم". النتيجة؟ اقتراحات عشوائية لا علاقة لها باهتماماته، بعضها باللغة الإنجليزية رغم طلب العربية. بعد 3 أسابيع من التعديلات، اكتشفنا أن المشكلة لم تكن في النموذج، بل في طريقة صياغة البرومبت. عندما أضفنا السياق المناسب، والقواعد النحوية، والقيود الزمنية، تحولت النتائج من فوضى إلى دقة تصل 92%. هذا هو الفرق بين إرسال نص عشوائي وبين هندسة برومبت حقيقي.
الـ Prompt Engineering ليس مجرد كتابة أسئلة جميلة للنموذج. إنه علم وهندسة في آن واحد. خلف الكواليس، عندما ترسل برومبت لـ LLM، يحدث ما يشبه تجميع كود ديناميكي داخل ذاكرة النموذج. الكلمات التي تختارها، ترتيبها، وحتى علامات الترقيم، كلها تُترجم إلى ما يشبه تعليمات Assembly داخل الـ Transformer. إذا كنت تظن أن كتابة "اكتب مقال عن الذكاء الاصطناعي" كافية، فأنت تخسر 80% من قدرات النموذج. النموذج لا "يفكر" كما نفعل نحن، بل يعالج الـ Tokens بطريقة رياضية بحتة، وكل كلمة زائدة أو ناقصة تغير مسار الـ Attention Weights داخل الطبقات العصبية.
عندما تكتب كود جافا سكريبت، أنت لا ترسل نصاً عشوائياً للمتصفح. أنت ترسل تعليمات دقيقة يفهمها الـ Engine. نفس المبدأ ينطبق على البرومبت. كل كلمة في البرومبت هي مثل سطر كود في ملف .js. إذا كتبت if بدون شرط، الكود سينهار. إذا كتبت برومبت بدون سياق، النموذج سينهار. الفرق الوحيد هو أن الـ Syntax هنا ليس ثابتاً، بل يعتمد على فهمك لكيفية عمل النموذج داخلياً.
لنأخذ مثالاً عملياً. عندما تطلب من النموذج "اكتب لي كود بايثون لحساب المتوسط"، النموذج لا "يعرف" ما هو المتوسط. إنه يبحث في الـ Training Data عن أنماط مشابهة ويجمع بينها. لكن إذا كتبت "اكتب كود بايثون لحساب المتوسط الحسابي لعدد غير محدد من الأرقام باستخدام مكتبة NumPy، مع التحقق من أن المدخلات أرقام فقط، وإرجاع خطأ إذا كانت القائمة فارغة"، فأنت هنا تعطيه تعليمات دقيقة كما لو كنت تكتب دالة في كلاس. النتيجة؟ كود نظيف، دقيق، وخالٍ من الأخطاء التي قد تظهر في الكود العشوائي.
# برومبت سيئ: "اكتب كود بايثون لحساب المتوسط"
# النتيجة: كود بسيط قد لا يتعامل مع الحالات الحدية
def average(numbers):
return sum(numbers) / len(numbers)
# برومبت جيد: "اكتب كود بايثون لحساب المتوسط الحسابي لعدد غير محدد من الأرقام باستخدام مكتبة NumPy،
# مع التحقق من أن المدخلات أرقام فقط، وإرجاع خطأ إذا كانت القائمة فارغة"
import numpy as np
def safe_average(numbers):
if not numbers:
raise ValueError("List cannot be empty")
if not all(isinstance(x, (int, float)) for x in numbers):
raise TypeError("All elements must be numbers")
return np.mean(numbers)
# الفرق واضح: الكود الثاني يتعامل مع الأخطاء، يستخدم مكتبة متخصصة، ويتبع أفضل الممارساتمعظم المقالات تتحدث عن الأساسيات: كن واضحاً، أعطِ أمثلة، استخدم علامات الترقيم. لكن هذا ليس كافياً. لكي تصبح مهندس برومبت محترفاً، عليك أن تفهم كيف يتعامل النموذج مع الـ Tokens داخلياً. مثلاً، هل تعلم أن النموذج يعالج البرومبت من اليسار إلى اليمين، وأن الكلمات الأولى لها وزن أكبر في تحديد اتجاه الرد؟ هذا يشبه كتابة كود حيث أول سطر في الدالة يحدد كل شيء بعدها. إذا بدأت برومبتك بكلمة غامضة، ستضيع بقية الجملة في الضوضاء.
هناك تقنية تسمى "Priming" تستخدمها الشركات الكبرى مثل جوجل ومايكروسوفت. الفكرة بسيطة: بدلاً من بدء البرومبت بالسؤال، ابدأ بوصف المهمة كما لو كنت تكتب تعليقاً في الكود. مثلاً، بدلاً من "ما هي أفضل لغة برمجة؟"، اكتب: "أنت خبير برمجيات سنيور يعمل في وادي السيليكون منذ 15 عاماً. مهمتك هي تقييم لغات البرمجة بناءً على الأداء، قابلية الصيانة، ومجتمع المطورين. قدم إجابة مفصلة ومدعومة بالأدلة." هذا البرومبت يعطي النموذج سياقاً غنياً ويجبره على الرد بطريقة احترافية. الفرق بين الردين قد يصل إلى 40% في الدقة والموثوقية.
النماذج اللغوية الكبيرة لا تفكر كما نفعل نحن. هي تولد الردود بناءً على الأنماط التي رأتها في البيانات التدريبية. لكن هناك طريقة لجعلها "تظهر عملها" كما نقول في البرمجة: تقنية Chain of Thought. الفكرة هي أن تطلب من النموذج شرح خطوات تفكيره قبل إعطاء الإجابة النهائية. هذا لا يزيد فقط من دقة الرد، بل يجعله أكثر شفافية وقابلية للتصحيح.
# برومبت بدون Chain of Thought:
"ما هو ناتج 245 × 367؟"
# برومبت مع Chain of Thought:
"لحساب ناتج 245 × 367، اتبع هذه الخطوات:
1. حلل العددين إلى مكوناتهما باستخدام الخوارزمية القياسية للضرب.
2. اضرب كل رقم من العدد الأول بكل رقم من العدد الثاني.
3. اجمع النتائج الجزئية مع مراعاة الخانات العشرية.
4. اشرح كل خطوة بالتفصيل قبل إعطاء الناتج النهائي.
الآن، احسب ناتج 245 × 367 باستخدام هذه الطريقة."
# النتيجة: النموذج سيشرح أولاً كيف يضرب 200 × 300، ثم 200 × 60، وهكذا، قبل إعطاء الناتج النهائي.هذه التقنية مفيدة بشكل خاص في المهام المعقدة مثل حل المسائل الرياضية، كتابة الأكواد المعقدة، أو تحليل البيانات. في إحدى التجارب التي أجريناها، استخدمنا Chain of Thought لتحليل بيانات مالية لشركة ناشئة. بدون التقنية، كانت النتائج تحتوي على أخطاء منطقية. مع التقنية، أصبح التحليل دقيقاً بنسبة 95%، والنموذج كان قادراً على شرح كل خطوة كما لو كان محللاً بشرياً.
حتى المطورين ذوي الخبرة قد يقعوا في فخاخ بسيطة تدمر جودة البرومبت. أحد هذه الفخاخ هو استخدام كلمات غامضة. مثلاً، كلمة "جيد" أو "فعال" لا تعني شيئاً للنموذج. إذا كتبت "اكتب كود جيد لحساب المتوسط"، النموذج لا يعرف ما تعنيه "جيد". هل تريد كوداً سريعاً؟ سهل القراءة؟ متوافق مع إصدارات قديمة؟ عليك أن تحدد بالضبط ما تريده. هذا يشبه كتابة دالة بدون تحديد نوع المدخلات أو المخرجات.
فخ آخر هو تجاهل الـ Token Limits. معظم النماذج لها حد أقصى لعدد الـ Tokens في البرومبت والرد. إذا تجاوزت هذا الحد، النموذج إما سيقطع الرد أو سيهمل جزء من البرومبت. في أحد المشاريع، كنا نرسل برومبتات طويلة جداً للنموذج، وكان الرد دائماً غير مكتمل. اكتشفنا لاحقاً أن النموذج كان يتجاهل آخر 30% من البرومبت. الحل؟ قسمنا البرومبت إلى أجزاء أصغر واستخدمنا تقنية تسمى "Prompt Chaining" حيث نرسل البرومبتات على دفعات ونجمع النتائج في النهاية.
الهلاوس هي عندما يعطي النموذج معلومات خاطئة أو مختلقة وكأنه حقيقة. هذه المشكلة شائعة خصوصاً في المواضيع المتخصصة مثل الطب أو القانون. الحل ليس فقط في تحسين البرومبت، بل في تصميم النظام بشكل عام. مثلاً، يمكنك استخدام تقنية تسمى "Retrieval-Augmented Generation" حيث تدمج النموذج مع قاعدة بيانات موثوقة. بدلاً من أن يعتمد النموذج فقط على ذاكرته، يمكنه البحث في قاعدة البيانات وإعطاء ردود مدعومة بالمصادر.
# مثال على استخدام Retrieval-Augmented Generation مع LangChain
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# تحميل قاعدة بيانات الموثوقة
embeddings = OpenAIEmbeddings()
db = FAISS.load_local("faiss_index", embeddings)
# إنشاء سلسلة البحث
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=db.as_retriever()
)
# إرسال برومبت
resp qa_chain.run("ما هي أعراض مرض السكري من النوع الثاني؟")
print(response)
# النتيجة: رد مدعوم بمعلومات من قاعدة البيانات، وليس من ذاكرة النموذج فقطهذه التقنية تستخدمها شركات مثل IBM وMicrosoft في تطبيقاتها الطبية والقانونية. بدلاً من الاعتماد على النموذج فقط، النظام يبحث في قواعد بيانات موثوقة ويعطي ردوداً دقيقة ومدعومة بالمراجع. هذا يقلل الهلاوس بشكل كبير ويزيد من موثوقية النظام.
هندسة البرومبت ليست مجرد كتابة نصوص. هناك أدوات ومكتبات تساعدك على تحسين البرومبتات واختبارها بشكل منهجي. مثلاً، مكتبة LangChain توفر ميزات مثل Prompt Templates التي تسمح لك بإنشاء برومبتات ديناميكية باستخدام متغيرات. بدلاً من كتابة نفس البرومبت مراراً وتكراراً، يمكنك إنشاء قالب وتعبئته بالبيانات المطلوبة في كل مرة.
# استخدام Prompt Templates في LangChain
from langchain import PromptTemplate
# إنشاء قالب برومبت
template = """
أنت خبير في {field}. مهمتك هي الإجابة على السؤال التالي:
السؤال: {question}
الإجابة يجب أن تكون مفصلة ومدعومة بالأدلة. إذا لم تكن متأكداً، قل "لا أعرف" بدلاً من التخمين.
"""
prompt = PromptTemplate(
input_variables=["field", "question"],
template=template,
)
# تعبئة القالب بالبيانات
formatted_prompt = prompt.format(
field="الذكاء الاصطناعي",
question="ما هي أحدث التطورات في نماذج اللغة الكبيرة؟"
)
print(formatted_prompt)هناك أيضاً أدوات مثل PromptPerfect وPromptable.ai التي تساعدك على تحسين البرومبتات تلقائياً. هذه الأدوات تستخدم تقنيات مثل الـ Reinforcement Learning لتحسين البرومبتات بناءً على ردود النموذج. بدلاً من التجربة والخطأ، يمكنك استخدام هذه الأدوات للحصول على برومبتات مثالية في دقائق.
بعد سنوات من العمل مع النماذج اللغوية الكبيرة، هذه هي النصائح الذهبية التي أتمنى أن أعرفها منذ البداية:
في النهاية، هندسة البرومبت هي مهارة مثل أي مهارة برمجية أخرى. تحتاج إلى الممارسة، التجربة، والصبر. لكن عندما تتقنها، ستجد نفسك قادراً على استخراج أقصى قدرات النماذج اللغوية، كما لو كنت تتحدث مباشرة مع الـ Engine خلف الكواليس. لا تكتفِ بالأساسيات، ابحث عن التقنيات المتقدمة، واختبرها في مشاريعك الحقيقية. هذا هو الفرق بين مطور AI جيد ومطور AI خطير.