انتقل إلى المحتوى الرئيسي

الوحدة 8 — التلخيص الآلي والإجابة عن الأسئلة

انتقلت المهامّ السابقة من نصّ إلى تصنيف أو وسم. هنا ينتقل النموذج من نصّ إلى نصّ جديد. هذا يفتح إمكانات كبيرة (التلخيص، الإجابة، الترجمة، إعادة الصياغة)، لكنّه يفتح أيضًا صنفًا من الأخطاء لم نعرفه من قبل: الهلوسة، أي إنتاج معلومات لا وجود لها في المصدر.

على مراجعاتنا: نريد تلخيص 50 مراجعة عن منتج معيّن في فقرة واحدة قابلة للقراءة، ونريد أيضًا الإجابة عن أسئلة محدّدة مثل «هل يشكو المستخدمون من عمر البطارية؟».

التلخيص الاستخراجي: انتقاء لا صياغة

المقاربة الأولى، التلخيص الاستخراجي، لا تُنتج جُملًا جديدة. تنتقي جُملًا موجودة أصلًا في النصّ الأصلي. النموذج يُقيّم أهمّية كلّ جملة، ثمّ يعرض الأعلى ترتيبًا.

الفائدة الجوهرية: الجُملة المُعادة موجودة حرفيًّا في المصدر. لا هلوسة ممكنة. الحدّ الأدنى للجودة معروف: النصّ الأصلي.

خوارزميّة كلاسيكية بسيطة هي LexRank: تُبنى جملُ النصّ كعُقَد في رسم بيانيّ، والحواف بينها موزونة بالتشابه الجيبي (TF-IDF أو تضمينات). ثمّ يُطبَّق PageRank لإيجاد الجُمَل الأكثر «مركزيّة». الجُمل الأعلى ترتيبًا تدخل الملخّص.

from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer

nass = " ".join(muraja3at_muntaj) # 50 مراجعة مضمومة كنصّ واحد
parser = PlaintextParser.from_string(nass, Tokenizer("arabic"))
mulakhkhis = LexRankSummarizer()

for jumlah in mulakhkhis(parser.document, sentences_count=5):
print(jumlah)

النتيجة نصّ من خمس جُمَل، كلّها موجودة أصلًا في المراجعات. عيبه: الجُمَل قد تكون مقتطعة من سياقها، وقد تتناقض بينها إن انتقيت من مراجعات متعارضة، ولا يمكنه إنتاج ملخّص لا يقول ما لم يقله أحد أصلًا («المستخدمون عمومًا راضون رغم الشكاوى من البطارية»).

التلخيص التوليدي: صياغة جديدة

التلخيص التوليدي يستعمل نموذجًا مُشفِّر-مُفكِّك (encoder-decoder) مثل BART أو T5 أو AraT5. يقرأ المُشفِّر النصّ الكامل، ويُنتج المُفكِّك ملخّصًا جديدًا كلمة كلمة.

قدرة أعلى بكثير: يمكنه إعادة الصياغة، والتلخيص التركيبي، وإنتاج ملخّص أقصر من أيّ جملة موجودة. لكن يمكنه أيضًا اختراع أشياء لم تُقَل.

from transformers import pipeline

mulakhkhis = pipeline(
"summarization",
model="csebuetnlp/mT5_multilingual_XLSum",
max_length=100,
min_length=30,
)

natija = mulakhkhis(nass)
print(natija[0]["summary_text"])

على مراجعاتنا، النتيجة تبدو أنيقة، لكنّها قد تحتوي على معلومات ملفَّقة: «معظم المستخدمين ينصحون بهذا المنتج بأكثر من 90 بالمئة» — الرقم لم يُذكر في أيّ مراجعة، النموذج اختلقه لأنّه شائع في نصوص المراجعات التي تدرَّب عليها.

ROUGE: المقياس الذي لا يقيس ما تظنّ

المقياس السائد لتقييم التلخيص هو ROUGE (Recall-Oriented Understudy for Gisting Evaluation). يقيس تداخل nn-غرامات بين الملخّص المولَّد والملخّص المرجعي.

  • ROUGE-1: تداخل الأحاديات (الكلمات المفردة).
  • ROUGE-2: تداخل الثنائيات.
  • ROUGE-L: أطول متتالية فرعية مشتركة.
ROUGE-1=كلمات المرجعكلمات التوليدكلمات المرجع\text{ROUGE-1} = \frac{|\text{كلمات المرجع} \cap \text{كلمات التوليد}|}{|\text{كلمات المرجع}|}

المشكلة: ROUGE يقيس التداخل اللفظي لا الدقّة الدلالية. ملخّصان يقولان الشيء نفسه بكلمات مختلفة يحصلان على ROUGE منخفض، وملخّصان مختلفان دلاليًّا لكنّهما يتشاركان مفردات كثيرة يحصلان على ROUGE مرتفع.

مثال عملي بسيط. المرجع: «المنتج جيّد لكنّه غالي الثمن». نموذجان:

  • توليد أ: «السعر مرتفع رغم الجودة الحسنة» — نفس المعنى تمامًا، ROUGE-1 ≈ 0,14.
  • توليد ب: «المنتج جيّد وسعره مناسب» — عكس المعنى، ROUGE-1 ≈ 0,67.

النموذج ب يحصل على ضِعْف تقييم أ، رغم أنّ أ أفضل. ROUGE ينبغي أن يُستكمَل دائمًا بتقييم بشري على عيّنة، أو بمقاييس دلالية (BERTScore، BLEURT) تستعمل تضمينات لقياس التقارب المعنويّ لا اللفظي.

الإجابة الاستخراجية على مقطع

المهمّة الأخرى: يُقدَّم مقطع نصّي وسؤال، ويُطلب من النموذج استخراج جواب محدَّد من المقطع.

  • المقطع: «الشحن مجّاني لجميع الطلبات فوق مئتي ريال داخل المملكة، وثلاثة أيام عمل للتوصيل.»
  • السؤال: «ما مدّة التوصيل؟»
  • الجواب المتوقّع: «ثلاثة أيام عمل»

النموذج المدرَّب على SQuAD أو نظيره العربي (Arabic-SQuAD، TyDiQA) يتعلّم أن يتوقّع مؤشِّرَي البداية والنهاية في المقطع. هذان الرقمان يحدّدان الجواب حرفيًّا، دون توليد. النتيجة: لا هلوسة ممكنة، لأنّ الجواب مقتطع من المقطع.

from transformers import pipeline

qanat = pipeline("question-answering", model="aubmindlab/bert-large-arabertv02-squad")

jawab = qanat(
question="ما مدة التوصيل داخل المملكة؟",
context="الشحن مجاني لجميع الطلبات فوق مئتي ريال داخل المملكة، وثلاثة أيام عمل للتوصيل.",
)
print(jawab)
# {'answer': 'ثلاثة أيام عمل', 'score': 0.94, 'start': 78, 'end': 92}

القيد: الجواب يجب أن يكون موجودًا حرفيًّا في المقطع. سؤال يحتاج جمع معلومات متفرّقة من مقطعَين، أو يحتاج استنتاجًا، لن يُجاب عنه بهذه المقاربة.

الإجابة التوليدية والهلوسة

للأسئلة التي تحتاج استنتاجًا أو دمج معلومات، نلجأ إلى نموذج توليدي: نُعطيه المقطع والسؤال، ونطلب منه إنتاج نصّ إجابة. الطريقة الشائعة الآن هي RAG (Retrieval-Augmented Generation): نسترجع أوّلًا المقاطع الأكثر صلة (بحث دلاليّ كما في الوحدة 5)، ثمّ نُقدّمها لنموذج لغويّ كبير مع السؤال.

الميزة: النموذج يستنتج ويصوغ. العيب: الهلوسة. النموذج قد يخترع جوابًا معقولًا لكنّه غير مدعوم بالمقطع، خاصّة حين يكون السؤال يتجاوز ما فيه.

قواعد الحدّ من الهلوسة:

  • مطالبة صريحة بالاستشهاد: «أجب فقط من المقطع أعلاه، واذكر السطر». يستطيع النموذج غالبًا الالتزام إن دُرّب على ذلك.
  • إجابة «لا أعلم» مسموح بها: إعطاء النموذج خيار الاعتراف بعدم وجود المعلومة يُقلّل من اختراعها.
  • التحقّق ما بعد التوليد: بحث الجواب حرفيًّا في المقطع، أو حساب التشابه الدلالي مع أقرب جملة، وردّ الإجابة إذا كان الجواب بعيدًا.

قياس هلوسة عمليًّا

طريقة بسيطة على مراجعاتنا: أنتج ملخّصًا لعشر مراجعات عن منتج، ثمّ لكلّ رقم أو نسبة في الملخّص، تحقّق يدويًّا إن كان المصدر يذكره. النسبة التي تنجح تعطي فكرة عن معدّل الهلوسة.

على mT5 المتعدّد اللغات في تلخيص المراجعات العربية، المعدّل الملحوظ يتراوح بين 15 و30 بالمئة من الأرقام المولَّدة. غير مقبول لتقرير رسمي؛ مقبول لعرض داخلي مع تحذير.

لا تنشر تلخيصًا توليديًّا بلا تحكيم بشري

النموذج التوليدي أنيق ومقنع، وهذا بالضبط ما يجعله خطيرًا. يمكنه أن يخترع رقمًا بثقة عالية، وأن يستخرج «الاستنتاج» من مراجعات لا تدعمه، وأن يعمّم اقتباس مستخدم واحد وكأنّه رأي الأغلبية. قبل عرض ملخّصات مولَّدة على مستخدمي منتَجك، اشترط حلقة تحكيم بشري على عيّنة، أو اكتفِ باستخراجي أقلّ إبهارًا لكنّه صادق مع المصدر.

البدء الاستخراجي دائمًا

حتّى حين يكون الحلّ النهائي توليديًّا، ابدأ باستخراجي. يعطيك خطًّا أدنى صادقًا (لا يخترع)، ومقياسًا واقعيًّا لصعوبة المهمّة (كم مراجعة تصف المشكلة بجملة كافية؟)، ومرجعًا لمقارنة الملخّص التوليدي به (هل يقدّم أفضل، أم يقدّم شكلًا مختلفًا بالسوء نفسه؟).

في الخلاصة

  • التلخيص الاستخراجي ينتقي جُملًا موجودة أصلًا، فلا هلوسة ممكنة، لكن قد تكون النتيجة مقتطعة أو متناقضة؛ التلخيص التوليدي أنيق لكنّه قد يخترع.
  • ROUGE يقيس التداخل اللفظي لا الدقّة الدلالية؛ ملخّصان بنفس المعنى بكلمات مختلفة يحصلان على تقييم منخفض، ويجب استكماله بتقييم بشري أو بمقاييس تضمينية.
  • الإجابة الاستخراجية تختار مؤشّرَي بداية ونهاية في المقطع فلا تختلق، بينما الإجابة التوليدية أكثر مرونة لكنّها مصدر رئيسي للهلوسة.
  • الحدّ من الهلوسة يعتمد على مطالبات صريحة بالاستشهاد، وإتاحة «لا أعلم»، والتحقّق ما بعد التوليد، وتحكيم بشري قبل النشر.

الوحدة التالية: مكتبة Transformers من Hugging Face، الأداة العمليّة التي تجمع كلّ ما رأيناه في واجهة واحدة، مع خيارات ذكيّة لاختيار النموذج من الـHub.