چیت‌شیت

خلاصه‌سازی، QA، NLI و NLP چندزبانه

Summarization, QA, NLI and Multilingual NLP

خلاصه‌سازی، پاسخ‌گویی، بررسی استلزام و انتقال بین‌زبانی. مدل‌ها، معیارها، مقادیر پیش‌فرض و خطاها.

  • ۱۲ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. ‏QA مبتنی بر شواهد با گیت NLI
  2. وظایف در کد
  3. نرمال‌سازی SQuAD
  4. ‏TextRank، گام‌به‌گام
  5. معیارها
  6. پرسش‌ها
  7. نکات کاربردی
  8. ‏NLI و وفاداری
  9. عیب‌یابی
  10. پیش‌فرض‌ها و ارقام
  11. اختصارات
  12. انتخاب مدل

‏QA مبتنی بر شواهد با گیت NLI

معماری
جستجوپاساژهاپاسخاستلزامپرسشبازیاب‏k پاساژ برترخوانندهاسپن یا پاسخ LLMبررسی NLIآیا زمینه مستلزم پاسخ است؟پیکره متنی‏BM25، متراکم یا ترکیبیپاسخیا «نمی‌دانم»

وظایف در کد

کار و کد
وظیفهکد
خلاصه استخراجیtextrank(text, top_k=3, damping=0.85, iterations=50, epsilon=1e-4)
خلاصه انتزاعیpipeline("summarization", model="facebook/bart-large-cnn")
تولید خلاصهsummarizer(article, max_length=120, min_length=60, do_sample=False)
‏ROUGE با ریشه‌یابی صرفیrouge_scorer.RougeScorer(["rouge1", "rouge2", "rougeL"], use_stemmer=True)
پاسخ به سوالات استخراجیpipeline("question-answering", model="deepset/roberta-base-squad2")
مجاز بودن پاسخ خالیpass `handle_impossible_answer=True` to the pipeline call
معیارهای SQuAD`exact_match(pred, gold)` and `token_f1(pred, gold)`
برچسب‌های موضوعی صفر-نمونهzs(text, candidate_labels=labels)

نرمال‌سازی SQuAD

کد
python
def normalize(text):
    text = text.lower()
    text = re.sub(r"\b(a|an|the)\b", " ", text)         # حذف حروف تعریف
    text = re.sub(r"[^\w\s]", " ", text)                # حذف علائم نگارشی
    return " ".join(text.split())

exact_match("June 29th, 2007", "June 29, 2007")  # 0.0
token_f1("June 29th, 2007", "June 29, 2007")     # 0.67
token_f1("29 June 2007", "June 29, 2007")               # 1.00، ولی EM برابر 0 است
refusal_from_score(top_retrieval_score, threshold=0.3)  # ‏True یعنی رد پاسخ

‏TextRank، گام‌به‌گام

گام‌به‌گام
  1. تقسیمsentence_split بعد از .، ! یا ? برش می‌زند. جملات کم: بازگرداندن همه.
  2. گرافsimilarity همان همپوشانی کلمات تقسیم بر لگاریتم مجموع طول هر دو است.
  3. تکرارهر امتیاز برابر 1 - damping به‌علاوه‌ی امتیازهای همسایه با ضریب میرایی است.
  4. توقفتغییر کمتر از epsilon، یا اتمام دورهای iterations.
  5. خروجیتعداد top_k جمله برتر، به همان ترتیب سند.

معیارها

مفهوم‌ها
ROUGE-1 و ROUGE-2
همپوشانی تک‌گرام و دوگرام با مرجع.
ROUGE-L
طولانی‌ترین زیردنباله‌ی مشترک. 40 خوب است. 50 فوق‌العاده است.
EM
تطابق دقیق پس از نرمال‌سازی؛ در غیر این صورت امتیاز 0 است.
F1 در سطح توکن
$F_1 = \frac{2PR}{P + R}$ روی همپوشانی توکن‌ها؛ امتیاز نسبی می‌دهد.
BERTScore
شباهت امبدینگ زمینه‌ای. کنار ROUGE گزارش شود.
G-Eval
داوری با LLM همراه با زنجیره تفکر. در ~80% موارد با انسان هم‌نظر است.
F1 در سطح موجودیت
موجودیت‌هایی که صرفاً در خلاصه آمده‌اند مشکوک هستند.
RAGAS
وفاداری، ارتباط پاسخ، دقت زمینه، بازخوانی زمینه.

پرسش‌ها

پرسش و پاسخ
استخراجی یا انتزاعی؟
استخراجی برای متن‌های خبری، پزشکی، حقوقی و مالی. انتزاعی نیازمند بررسی صحت فکت‌ها است.
دسته‌بندی صفر-نمونه چطور کار می‌کند؟
هر برچسب تبدیل به یک فرضیه می‌شود. برچسب با بالاترین استلزام را انتخاب کنید.
کدام زبان مبدأ برای انتقال؟
اول خویشاوند نزدیک پرمنبع را امتحان کنید؛ مثلاً هندی برای زبان‌های هندوآریایی.
چرا دقت به تفکیک زبان؟
میانگین کل، دم بلند زبان‌های ضعیف را پنهان می‌کند.
آیا RAGAS به پاسخ‌های مرجع نیاز دارد؟
خیر. چهار بعد را بدون مراجع امتیازدهی می‌کند.

نکات کاربردی

نکته‌ها
  • در ROUGE همیشه از ریشه‌یابی صرفی استفاده کنید؛ وگرنه «running» و «run» تطابق نمی‌یابند.
  • معیارهای ROUGE-L، BERTScore و G-Eval را گزارش کنید. روی 50 تا 100 خلاصه‌ی برچسب‌خورده انسانی کالیبره کنید.
  • به مدل دستور دهید فقط از زمینه استفاده کند و در صورت لزوم بگوید «نمی‌دانم».
  • همیشه فیلد score پایپ‌لاین QA را بررسی کنید.
  • پیش از راه‌اندازی دسته‌بندی صفر-نمونه در محیط عملیاتی، آزمون بررسی سلامت با 100 نمونه برچسب‌دار اجرا کنید.
  • برای ورودی‌های بزرگ‌تر از پنجره‌ی بافتار، به‌جای کوتاه‌سازی از map-reduce تکه‌تکه استفاده کنید.

‏NLI و وفاداری

کد
python
nli = pipeline("text-classification",
               model="facebook/bart-large-mnli",
               top_k=None)                  # بازگرداندن هر سه برچسب
result = nli({"text": premise, "text_pair": hypothesis})[0]
zs = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
result = zs(text, candidate_labels=labels)  # برچسب‌ها مرتب بر اساس امتیاز

def is_faithful(answer, context, threshold=0.5):
    result = nli({"text": context, "text_pair": answer})[0]
    entail = next(s for s in result if s["label"] == "entailment")
    return entail["score"] > threshold      # زمینه از ادعا پشتیبانی می‌کند

عیب‌یابی

عیب‌یابی
  • خلاصه می‌گوید «جان براون»

    علت
    جابه‌جایی موجودیت در خروجی انتزاعی
    راه‌حل
    علامت‌گذاری موجودیت‌هایی که در منبع نیستند
  • «25,000» می‌شود «25 میلیون»

    علت
    دریفت اعداد
    راه‌حل
    استفاده از روش استخراجی یا گیت سنجش صحت فکت‌ها
  • بازگرداندن اسپن برای پرسش بدون پاسخ

    علت
    نادیده‌گرفتن امتیاز Null به‌طور پیش‌فرض
    راه‌حل
    تنظیم handle_impossible_answer=True
  • خواننده ضعیف عمل می‌کند

    علت
    بازیاب پاساژ را پیدا نکرده است
    راه‌حل
    اندازه‌گیری بازخوانی بازیابی در k مورد برتر
  • ~60% امتیاز فقط از روی فرضیه

    علت
    کلماتی مثل «not» و «never» برچسب را لو می‌دهند
    راه‌حل
    خط مبنا فقط با فرضیه، ANLI
  • افت 20+ نمره‌ای F1 روی مقدمه‌های طولانی

    علت
    مدل NLI در سطح جمله
    راه‌حل
    استفاده از مدلی که روی DocNLI آموزش دیده
  • نوسان 10+ نمره‌ای در صفر-نمونه

    علت
    حساسیت به پرامپت الگو
    راه‌حل
    تنظیم دقیق hypothesis_template
  • نادرستی جزئی در خروجی زبان هندی

    علت
    3 تا 5 برابر توکن به ازای هر کلمه
    راه‌حل
    بررسی نرخ باروری، byte_fallback=True

پیش‌فرض‌ها و ارقام

پیش‌فرض‌ها
تنظیمپیش‌فرضتوضیح
TextRank `damping`0.85پیش‌فرض PageRank
TextRank `iterations`50توقف زودهنگام در صورت کمتر شدن از epsilon برابر 1e-4
BART `max_length`120با min_length=60
Refusal `threshold`0.3امتیاز بازیابی برتر پایین‌تر از آن باشد: رد پاسخ
`is_faithful` threshold0.5امتیاز استلزام باید بالاتر از آن باشد
Few-shot examples100-500زبان مقصد؛ 95-98% زبان انگلیسی
learning_rate2e-5نرخ‌های بالاتر باعث به‌هم‌ریختگی هم‌ترازی می‌شوند
num_train_epochs5ایمن برای 100 تا 500 نمونه

اختصارات

اصطلاح‌ها
ROUGE
ارزیابی خلاصه‌سازی مبتنی بر بازخوانی. همپوشانی N-gram و LCS.
SQuAD
دیتاست پاسخ به سوالات استنفورد. معیارهای EM و F1.
NLI
استنتاج زبان طبیعی؛ استلزام، تناقض یا خنثی.
RTE
تشخیص استلزام متنی؛ نام قدیمی‌تر NLI.
MultiNLI
تعداد 433k جفت‌متن در 10 ژانر مختلف. پیکره متنی استاندارد آموزش NLI.
ANLI
ان‌ال‌آی چالش‌برانگیز؛ جفت‌هایی که انسان‌ها برای شکست‌دادن مدل‌ها نوشته‌اند.
XLM-R
مدل RoBERTa صدزبانه آموزش‌دیده روی CommonCrawl. نسخه Base با 270M و Large با 550M.
NLLB
پروژه‌ی متوقف نشدن هیچ زبانی؛ 200 زبان شامل 55 زبان کم‌منبع.

انتخاب مدل

دستورها
دستورکاربرد
facebook/bart-large-cnnخلاصه خبری 3 تا 5 جمله‌ای، انگلیسی
google/pegasus-pubmedخلاصه‌سازی مقالات علمی
philschmid/bart-large-cnn-samsumخلاصه‌سازی گفتگوها
deepset/roberta-base-squad2بخش پاسخ از یک پاساژ مشخص
facebook/bart-large-mnliدسته‌بندی صفر-نمونه سبک‌وزن
cross-encoder/nli-deberta-v3-base‏NLI سریع برای دستگاه‌های لبه (Edge)
joeddav/xlm-roberta-large-xnliدسته‌بندی صفر-نمونه در زبان‌های متعدد
facebook/nllb-200-distilled-600Mترجمه، 200 زبان