الوحدة 6 — النقد الذاتي والتحقّق من النتائج
الوكيل قد يعطي جوابًا يبدو صحيحًا، ثمّ يظهر أنّه يخترع مصدرًا، أو يجمع رقمَين خطأ، أو يستشهد بصفحة قديمة. النقد الذاتي محاولة لالتقاط هذه الأخطاء قبل تسليم المذكّرة. لكنّها تقنيّة ذات حدود؛ وسنرى متى تفيد ومتى تُضيع الرموز.
ثلاث آليّات للتحقّق
تفكير ذاتي (self-reflection): النموذج نفسه يقرأ جوابه ويسأل: «هل هذه المصادر تدعم ما قلته؟». يُنتِج قائمة ملاحظات، ثمّ نُعيد النداء لتحسين الجواب.
نموذج متحقِّق (verifier): نموذج ثانٍ مستقلّ، ربّما أقوى أو مُتخصّص، يقرأ الجواب ويُقيّمه. الاستقلال هنا مهمّ: النموذج الذي أنتج الجواب مُنحاز إلى قبوله.
تحقّق بأداة (tool-based): الأداة تُنفّذ عمليّة تُقارِن. مثال: أعاد الوكيل «تاريخ الإصدار: 2024-03-10»؛ نُشغّل verifier_date(url, date_extraite) تُعيد إلى الصفحة الأصليّة وتقارن. هذا الأصلب من الثلاثة.
متى يعمل كلّ نوع
التفكير الذاتي يعمل حين النموذج يمتلك المعلومة الكافية للحكم، ويفشل حين مصدر الخطأ خارج نطاقه. يُصلح الأخطاء المنطقيّة (استنتاج غلط من وقائع صحيحة)، لا الأخطاء الوقائعيّة (رقم مخترَع).
النموذج المتحقِّق يعمل جيّدًا لأنّ الاستقلال يُخفض الاحتياز؛ لكنّه يضاعف الفاتورة. تجارب على مذكّرات وكيل البحث: التحقّق بنموذج ثانٍ يلتقط 43 ٪ من الأخطاء، مقابل 18 ٪ للتفكير الذاتي.
التحقّق بأداة يعمل جيّدًا حين تكون الأداة موضوعيّة: verifier_date، recalculer_somme، verifier_url_existante. عائد الاستثمار أعلى؛ يلتقط 78 ٪ من أخطاء نوعه، بأقلّ من نصف كلفة النموذج المتحقِّق.
التنفيذ العمليّ
نمط أساسيّ للنموذج المتحقِّق:
def verifier_reponse(question, reponse):
r = client.chat.completions.create(
model="gpt-4o", temperature=0,
messages=[
{"role": "system", "content": "أنت مُتحقِّق. اقرأ الجواب. أعِد JSON: {\"ok\": bool, \"problemes\": [str]}. الأنواع: مصدر مخترَع، رقم خطأ، ادّعاء بلا مصدر."},
{"role": "user", "content": f"السؤال: {question}\nالجواب: {reponse}"},
],
response_format={"type": "json_object"},
)
return json.loads(r.choices[0].message.content)
verdict = verifier_reponse(question, reponse_initiale)
if not verdict["ok"]:
reponse = ameliorer(reponse_initiale, verdict["problemes"])
نقطة أساسيّة: نُعطي المتحقِّق قائمة أنواع أخطاء محدَّدة، لا نطلب «تحقّقًا عامًّا». نموذج «افحص هذا الجواب» يُنتج ملاحظات مبهمة عديمة الفائدة.
التحقّق بأداة: الأصلب
مثال على وكيل البحث: بعد كلّ مذكّرة، نُشغِّل تحقّقًا آليًّا:
def verifier_mo dhakkarah(memo):
problemes = []
for citation in memo.citations:
# الرابط يعمل؟
if not url_existe(citation.url):
problemes.append(f"رابط ميت: {citation.url}")
# الاقتباس موجود فعلًا في الصفحة؟
page = telecharger(citation.url)
if citation.texte not in page:
problemes.append(f"اقتباس غير موجود في {citation.url}")
for fait in memo.faits_chiffres:
# الرقم يُطابق مصدره؟
if not verifier_chiffre(fait.valeur, fait.source):
problemes.append(f"رقم لا يُطابق مصدره: {fait}")
return problemes
هذه ليست ذكاء اصطناعيًّا؛ هي شيفرة عاديّة. لذلك تعمل تمامًا. قاعدة: كلّ ما يمكن التحقّق منه بشيفرة قديمة، لا تُوكِله لنموذج.
حدود التصحيح الذاتيّ
نمط خطر يُسمّى «ال تصحيح الوهميّ» (illusory correction): النموذج يقرأ جوابه، يعتقد أنّه يُصلحه، لكنّه في الواقع يُغيّر صياغة الخطأ لا مضمونه. الرقم يبقى خطأ، والمصدر يبقى مخترَعًا، لكن الجواب يبدو «أكثر ثقة». تجربة عمليّة: على 100 خطأ وقائعيّ، التصحيح الذاتي بلا أدوات يُصلح 12 خطأ فقط، ويُخفي 34 خطأ بأسلوب أكثر إقناعًا.
الحلّ: لا تصحيح ذاتيّ بلا آليّة موضوعيّة. النموذج يقترح تصحيحًا؛ الأداة تتحقّق؛ ثمّ نتّخذ القرار.
متى يصبح النقد مضيعة
بعد جولتَين من النقد، عائد الاستثمار ينهار: الجولة الأولى تلتقط 43 ٪ من الأخطاء، الثانية 12 ٪ إضافيّة، الثالثة 4 ٪. جولة رابعة تُضيّع رموزًا وتُطيل الزمن بلا فائدة. قاعدة عمليّة:
- جولة نقد واحدة على كلّ مذكّرة.
- جولة ثانية فقط إن كانت الأولى قد رصدت أخطاء وأُصلحت.
- توقّف بعد الثانية بلا استثناء.