المستوى المطلوب: متوسط — لو بتبني تطبيق AI بيرد على مستخدمين فعليين، المقال ده ليك. لو لسه بتجرب الـ API لأول مرة، ابدأ بمقال Tokens أو RAG للمبتدئين قبل ما ترجع هنا.
لو سألت Claude عن مرجع علمي وجابلك اسم باحث وعنوان ورقة ورقم DOI، وروحت تتأكد ولاقيت إن كل ده مش موجود فعلاً، ده مش بَغ في النموذج. ده Hallucination، وهو السبب رقم 1 في إن تطبيقات AI بتفقد ثقة المستخدم في أول أسبوع من الإطلاق.
هلوسة الذكاء الاصطناعي: المشكلة والحل بالظبط
هلوسة الـ LLM مش حالة استثنائية. هي سلوك أساسي في طريقة شغل النموذج. حسب قياسات Vectara HHEM-2.1 لسنة 2025، أحسن نموذج (Gemini 2.0) عنده 0.7% hallucination rate في مهمة تلخيص نص أمامه مباشرةً، و GPT-4o عنده 1.5%، وفيه نماذج بتوصل لـ 8% أو أكتر. ده في مهمة التلخيص اللي المفروض تكون أسهل سيناريو. في الأسئلة المفتوحة بدون سياق، الرقم بيوصل لـ 27% في بعض النماذج.
المشكلة باختصار
الـ LLM مش قاعدة بيانات. هو نموذج احتمالي بيتنبأ بالكلمة التالية بناءً على التوزيع الإحصائي للنصوص اللي اتدرّب عليها. لما يلاقي فجوة في معرفته، مش بيقولك "مش عارف". بيختار أكثر تكملة محتملة لغويًا، حتى لو دي تكملة غلط.
مثال للمبتدئ: امتحان متعدد الخيارات
تخيّل طالب في امتحان فيه 50 سؤال، وهو عارف 40 منهم بس. الطالب الذكي بيقول "مش عارف" في الـ 10 الباقيين. الطالب اللي بيهلوس بيختار إجابة ظاهرها مقنع في كل الـ 50، لأن نظام التصحيح ما بيسمحلوش يسيب فراغ. الـ LLM زي الطالب التاني بالظبط، نظام التدريب علّمه إن المخرج لازم يكون نص متماسك، حتى لو مش صحيح.
التعريف العلمي الدقيق
الهلوسة في الـ LLMs بتنقسم لنوعين أساسيين، حسب تصنيف Ji et al. 2023 في ACM Computing Surveys:
- Intrinsic hallucination: النموذج بيناقض السياق المُعطى له مباشرةً. مثال: لو ديته PDF وقاللك حاجة مش موجودة فيه.
- Extrinsic hallucination: النموذج بيخترع معلومة مش في السياق ومش في بيانات التدريب الموثوقة. مثال: اختراع اسم باحث ورقم DOI.
الفرق مهم لأن كل نوع ليه طريقة منع مختلفة. الـ Intrinsic بتتحل بـ grounding صارم. الـ Extrinsic بتحتاج verification خارجي.
3 طبقات حماية شغّالة في Production
الطبقة الواحدة مش كفاية. الـ stack اللي بيشتغل فعلاً بيجمع 3 طبقات. الكود ده بيتشغّل على Anthropic SDK 0.40+ مع Python 3.11+:
from anthropic import Anthropic
import re
client = Anthropic()
SYSTEM_PROMPT = """أنت مساعد بحثي. القاعدة الصارمة:
- استخدم فقط النص اللي في <context>.
- لو الإجابة مش في السياق، رد بالضبط: "المعلومة دي مش في المصادر المتاحة."
- ممنوع تخترع أسماء باحثين أو مراجع أو أرقام DOI.
- كل ادعاء لازم يكون متبوع بـ [مصدر: رقم_الفقرة]."""
def ask_with_grounding(question: str, context: str) -> dict:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=[{
"role": "user",
"content": f"<context>{context}</context>\n\nالسؤال: {question}"
}],
)
answer = response.content[0].text
citations = re.findall(r"\[مصدر: (\d+)\]", answer)
is_grounded = len(citations) > 0 or "مش في المصادر" in answer
return {"answer": answer, "grounded": is_grounded, "citations": citations}