فاز 5 · درس 28

ارزیابی کانتکست طولانی مدل‌های زبانی: از NIAH و RULER تا LongBench

نوع
مفهومی
زمان
حدود 60 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 5 · درس 13 (پرسش‌وپاسخ)، فاز 5 · درس 23 (استراتژی‌های تکه‌بندی)
یک سوزن فلزی باریک و درخشان که درون بافت متراکمی از علف‌های خشک و طومارهای کاغذی قدیمی قرار دارد و باریکه‌ای از نور روی آن متمرکز شده است.
فهرست مطالب
  1. صورت مسئله
  2. مفاهیم پایه
  3. در گزارش‌ها دقیقاً چه معیارهایی ثبت شود؟
  4. پیاده‌سازی
  5. گام 1: ساخت آزمون NIAH سفارشی برای دامنه‌ی کاری شما
  6. گام 2: نسخه‌ی چندسوزنه (Multi-needle)
  7. گام 3: ردیابی متغیرها در چند مرحله (سبک RULER)
  8. گام 4: اجرای LongBench v2 روی زیرساخت خودتان
  9. تله‌ها
  10. کاربرد عملی
  11. تحویل نهایی
  12. تمرین‌ها
  13. اصطلاحات کلیدی
  14. برای مطالعه‌ی بیشتر

در تبلیغات مدل‌های زبانی بزرگ (LLM)، پنجره‌های کانتکست میلیونی به یک مزیت رقابتی تبدیل شده‌اند. با این حال در محیط‌های عملیاتی، بسیاری از توسعه‌دهندگان متوجه می‌شوند که مدل‌ها در استخراج داده‌های پراکنده یا تحلیل اسناد چندصدصفحه‌ای دقت کافی را ندارند و اطلاعات قرارگرفته در میانه‌ی متن را نادیده می‌گیرند.

این درس به شما نشان می‌دهد چطور ظرفیت واقعی پنجره کانتکست یک مدل را پیش از ورود به محیط پروداکشن اندازه‌گیری کنید. با استفاده از چارچوب‌هایی مانند NIAH، RULER و LongBench، متوجه خواهید شد که ظرفیت استدلال مؤثر مدل در متن‌های طولانی معمولاً بسیار کمتر از سقف تبلیغاتی اعلام‌شده است.

اگر از داخل ایران به API ارائه‌دهندگان مطرح مانند OpenAI یا Anthropic دسترسی مستقیم ندارید و پرداخت ارزی یا تحریم‌های دسترسی مانع آزمون‌های پرهزینه می‌شوند، پیاده‌سازی آزمون‌های سبک و سفارشی روی مدل‌های باز به شما کمک می‌کند قبل از پرداخت هرگونه هزینه برای توکن‌های انبوه، از رفتار مدل در دامنه‌ی کاری خود مطمئن شوید.

مدل Gemini 3 Pro ادعای کانتکست 10M توکنی دارد. اما در 1M توکن، دقت آزمون 8-needle MRCR آن تا 26.3% افت می‌کند. عدد تبلیغاتی لزوماً معادل ظرفیت کاربردی نیست. ارزیابی کانتکست طولانی ظرفیت واقعی مدلی را که می‌خواهید به پروداکشن ببرید مشخص می‌کند.

صورت مسئله

قراردادی 200 صفحه‌ای دارید و مدل انتخابی شما ادعای کانتکست 1M توکنی دارد. کل قرارداد را پیست می‌کنید و می‌پرسید: «بند فسخ قرارداد چیست؟» مدل جواب می‌دهد، اما پاسخش را از روی جلد سرهم می‌کند؛ چون بند فسخ در عمق 120k توکنی قرار گرفته، یعنی فراتر از جایی که مدل واقعاً روی آن اتنشن دارد.

این همان شکاف ظرفیت کانتکست در سال 2026 است. برگه‌های مشخصات فنی اعداد 1M یا 10M را نشان می‌دهند، اما واقعیت این است که تنها 60 تا 70 درصد آن قابل استفاده است؛ تازه همین «قابل استفاده بودن» هم به نوع تسک بستگی دارد:

  • بازیابی (تک‌سوزن در انبار کاه): در مدل‌های مرز دانایی (Frontier models) تا سقف تبلیغاتی تقریباً بی‌نقص کار می‌کند.
  • استدلال چندمرحله‌ای (Multi-hop) و تجمیع داده‌ها: در بیشتر مدل‌ها فراتر از حدود 128k با افت شدید روبه‌رو می‌شود.
  • استدلال روی فکت‌های پراکنده: اولین تسکی است که از کار می‌افتد.

ارزیابی کانتکست طولانی این ابعاد را می‌سنجد. در این درس بنچمارک‌ها را معرفی می‌کنیم، می‌گوییم هر کدام دقیقاً چه چیزی را می‌سنجند و چطور یک آزمون سوزن در انبار کاه اختصاصی برای دامنه‌ی کاری خود بسازید.

مفاهیم پایه

خط پایه‌ی NIAH، آزمون چندوظیفه‌ای RULER و ارزیابی جامع LongBench

سوزن در انبار کاه (NIAH، سال 2023): یک فکت مشخص (مثلاً «کلمه‌ی جادویی آناناس است») را در عمق حساب‌شده‌ای از یک کانتکست طولانی قرار دهید. از مدل بخواهید آن را پیدا کند. ترکیب‌های مختلف «عمق × طول» را جاروب (Sweep) کنید. این همان بنچمارک اولیه‌ی کانتکست طولانی است. مدل‌های پیشرو امروزه در این آزمون اشباع شده‌اند؛ بنابراین گذراندن آن یک خط پایه‌ی لازم است، اما اصلاً کافی نیست.

بنچمارک RULER (انویدیا، 2024): شامل 13 نوع تسک در 4 دسته: بازیابی (تک‌کلید / چندکلید / چندمقدار)، ردیابی چندمرحله‌ای (ردیابی متغیرها)، تجمیع (فراوانی کلمات مشترک) و پرسش‌وپاسخ (QA). طول کانتکست در آن قابل تنظیم است (از 4k تا بیش از 128k). این بنچمارک دست مدل‌هایی را که در NIAH نمره‌ی کامل می‌گیرند اما در استدلال چندمرحله‌ای شکست می‌خورند، رو می‌کند. در نسخه‌ی سال 2024، از میان 17 مدلی که ادعای کانتکست بالای 32k داشتند، فقط نیمی از آن‌ها کیفیت خود را در 32k حفظ کردند.

بنچمارک LongBench v2 (سال 2024): شامل 503 سؤال چهارگزینه‌ای در کانتکست‌هایی با طول 8k تا 2M کلمه، در شش دسته‌ی تسک: پرسش‌وپاسخ تک‌سندی، پرسش‌وپاسخ چندسندی، یادگیری درون‌کانتکستی (In-context learning) طولانی، مکالمه‌ی طولانی، مخزن کد، و داده‌های ساخت‌یافته‌ی طولانی. این بنچمارک استاندارد عملیاتی برای بررسی رفتار مدل‌ها در شرایط واقعی کانتکست طولانی است.

آزمون MRCR (حل ارجاع نام‌ها در چند دور): بررسی ارجاع‌های متنی درون مکالمات چندنوبتی در مقیاس بزرگ. در گونه‌های 8 سوزنه، 24 سوزنه و 100 سوزنه اجرا می‌شود و نشان می‌دهد مدل تا پیش از افت اتنشن، حداکثر چند فکت را می‌تواند هم‌زمان مدیریت کند.

آزمون NoLiMa: سوزن غیرواژگانی (Non-lexical needle). در این آزمون، سوزن و پرامپت پرسش هیچ اشتراک واژگانی مستقیمی ندارند؛ بازیابی اطلاعات نیازمند یک گام استدلال معنایی است، بنابراین از NIAH معمولی بسیار سخت‌تر است.

بنچمارک HELMET: چندین سند را پشت سر هم می‌چسباند و از یکی از آن‌ها سؤالی مطرح می‌کند. این کار اتنشن انتخابی مدل را می‌سنجد.

بنچمارک BABILong: زنجیره‌های استدلالی bAbI را داخل کانتکست‌های نامربوط (انبار کاه) جاسازی می‌کند. هدف آن سنجش «استدلال در انبار کاه» است، نه صرفاً بازیابی اطلاعات.

در گزارش‌ها دقیقاً چه معیارهایی ثبت شود؟

  • پنجره‌ی کانتکست تبلیغاتی: عددی که در برگه مشخصات رسمی مدل نوشته شده است.
  • طول بازیابی مؤثر: طولی از کانتکست که مدل در آزمون NIAH به یک آستانه‌ی مشخص (مثلاً 90%) می‌رسد.
  • طول استدلال مؤثر: طولی از کانتکست که مدل در آزمون‌های چندمرحله‌ای یا تجمیع به همان آستانه دست پیدا می‌کند.
  • منحنی افت کیفیت: نمودار دقت بر حسب طول کانتکست، رسم‌شده به تفکیک هر تسک.

همیشه دو عدد برای برگه مشخصات خود ثبت کنید: طول بازیابی مؤثر و طول استدلال مؤثر. معمولاً طول استدلال مؤثر، تنها بین 25 تا 50 درصد پنجره‌ی کانتکست تبلیغاتی است.

سوزن در انبار کاهعمق در برابر بازخوانی
NEEDLE IN A HAYSTACKA needle test plants a single fact at a controlled depth in a long context and asks the model to retrieve it. Recall is near-perfect for shallow needles in short contexts, but as the fact sits deeper inside a longer haystack the accuracy gauge falls. The advertised context window is rarely the usable one, which is why depth-by-length sweeps matter.انبار کاه: رشد زمینه از چپ به راستسوزندقت بازخوانیزمینه تبلیغ‌شده تماماً قابل‌استفاده نیست
آزمون سوزن یک فکت منفرد را در عمقی مشخص درون زمینه‌ای طولانی قرار می‌دهد و از مدل می‌خواهد آن را بازیابی کند. دقت بازخوانی برای سوزن‌های سطحی در زمینه‌های کوتاه نزدیک به بی‌نقص است، اما با قرارگیری فکت در عمق بیشترِ یک انبار کاه طولانی‌تر، دقت افت می‌کند. پنجره زمینه تبلیغاتی به‌ندرت همان زمینه قابل‌استفاده است؛ به همین دلیل ارزیابی فراگیر در طول‌ها و عمق‌های مختلف اهمیت دارد.

پیاده‌سازی

گام 1: ساخت آزمون NIAH سفارشی برای دامنه‌ی کاری شما

فایل code/main.py را ببینید. اسکلت اصلی کد:

def build_haystack(filler_text, needle, depth_ratio, total_tokens):
    if not (0.0 <= depth_ratio <= 1.0):
        raise ValueError(f"depth_ratio must be in [0, 1], got {depth_ratio}")
    if total_tokens <= 0:
        raise ValueError(f"total_tokens must be positive, got {total_tokens}")

    filler_tokens = tokenize(filler_text)
    needle_tokens = tokenize(needle)
    if not filler_tokens:
        raise ValueError("filler_text produced no tokens")

    # تکرار متن پرکننده تا رسیدن به طول مناسب بدنه انبار کاه.
    body_len = max(total_tokens - len(needle_tokens), 0)
    while len(filler_tokens) < body_len:
        filler_tokens = filler_tokens + filler_tokens
    filler_tokens = filler_tokens[:body_len]

    insert_at = min(int(body_len * depth_ratio), body_len)
    haystack = filler_tokens[:insert_at] + needle_tokens + filler_tokens[insert_at:]
    return " ".join(haystack)


def score_niah(model, haystack, question, expected):
    answer = model.complete(f"Context: {haystack}\nQ: {question}\nA:", max_tokens=50)
    return 1 if expected.lower() in answer.lower() else 0

ترکیب‌های depth_ratio ∈ {0, 0.25, 0.5, 0.75, 1.0} × total_tokens ∈ {1k, 4k, 16k, 64k} را پیمایش کنید. سپس نمودار حرارتی (Heatmap) نتایج را رسم کنید؛ این همان شناسنامه‌ی NIAH مدل مدنظر شماست.

گام 2: نسخه‌ی چندسوزنه (Multi-needle)

def build_multi_needle(filler, needles, total_tokens):
    depths = [0.1, 0.4, 0.7]
    chunks = [filler[:int(total_tokens * 0.1)]]
    for depth, needle in zip(depths, needles):
        chunks.append(needle)
        next_chunk = filler[int(total_tokens * depth): int(total_tokens * (depth + 0.3))]
        chunks.append(next_chunk)
    return " ".join(chunks)

پاسخ به سؤال‌هایی مثل «سه کلمه‌ی جادویی چه بودند؟» نیازمند بازیابی هر سه مورد است. موفقیت در تک‌سوزن اصلاً به معنای موفقیت در چندسوزنه نیست.

گام 3: ردیابی متغیرها در چند مرحله (سبک RULER)

haystack = """X1 = 42. ... (filler) ... X2 = X1 + 10. ... (filler) ... X3 = X2 * 2."""
question = "What is X3?"

رسیدن به جواب نیازمند اتصال سه مرحله انتساب مقدار است. مدل‌های پیشرو در کانتکست 128k اغلب در چنین تستی به دقت 50 تا 70 درصد سقوط می‌کنند.

گام 4: اجرای LongBench v2 روی زیرساخت خودتان

from datasets import load_dataset
longbench = load_dataset("THUDM/LongBench-v2")

def eval_model_on_longbench(model, subset="single-doc-qa"):
    tasks = [x for x in longbench["test"] if x["task"] == subset]
    correct = 0
    for x in tasks:
        answer = model.complete(x["context"] + "\n\nQ: " + x["question"], max_tokens=20)
        if normalize(answer) == normalize(x["answer"]):
            correct += 1
    return correct / len(tasks)

دقت را به تفکیک هر دسته گزارش کنید؛ میانگین نمرات کلی، تفاوت‌های بزرگ میان تسک‌ها را پنهان می‌کند.

تله‌ها

  • اکتفا به ارزیابی NIAH: قبولی در NIAH در کانتکست 1M توکن هیچ ربطی به توانایی استدلال چندمرحله‌ای ندارد. همیشه RULER یا یک تست چندمرحله‌ای سفارشی اجرا کنید.
  • نمونه‌برداری یکنواخت از عمق: خیلی از پیاده‌سازی‌ها فقط عمق وسط (depth=0.5) را تست می‌کنند. حتماً اعماق 0، 0.25، 0.5، 0.75 و 1.0 را بسنجید؛ پدیده‌ی «گم شدن در میانه» (Lost in the middle) کاملاً واقعی است.
  • اشتراک واژگانی با متن پرکننده: اگر سوزن شما کلمات کلیدی مشترکی با متن پرکننده داشته باشد، بازیابی آن پیش‌پاافتاده می‌شود. از روش‌های بدون اشتراک کلمه‌ای مثل NoLiMa استفاده کنید.
  • نادیده گرفتن تاخیر: پرامپت‌های 1M توکنی بین 30 تا 120 ثانیه زمان پردازش اولیه (Prefill) نیاز دارند. همیشه زمان تا دریافت اولین توکن (TTFT) را در کنار دقت بسنجید.
  • اعتماد به آمارهای اعلام‌شده از سمت ارائه‌دهندگان: شرکت‌های OpenAI، Google و Anthropic همگی بنچمارک‌های خودشان را منتشر می‌کنند. همیشه تست‌ها را مستقل و روی کاربرد مدنظر خودتان بازآزمایی کنید.

کاربرد عملی

استک ابزارها در سال 2026:

موقعیت بنچمارک انتخابی
ارزیابی اولیه‌ی سریع (Sanity check) آزمون سفارشی NIAH در 3 عمق × 3 طول
انتخاب مدل برای پروداکشن آزمون RULER (13 تسک) در طول کانتکست هدف
کیفیت پرسش‌وپاسخ در شرایط واقعی زیرمجموعه‌ی single-doc-QA از بنچمارک LongBench v2
استدلال چندمرحله‌ای بنچمارک BABILong یا ردیابی متغیر سفارشی
سیستم‌های گفتگومحور و چت آزمون MRCR با 8 سوزن در طول کانتکست هدف
آزمون رگرسیون هنگام ارتقای مدل مجموعه‌تست داخلی ثابت از ترکیب NIAH + RULER، روی هر مدل جدید

یک قانون سرانگشتی برای محیط‌های پروداکشن: هرگز به پنجره‌ی کانتکست اعتماد نکنید، مگر اینکه حداقل آزمون NIAH به‌علاوه‌ی یک تسک استدلالی را در طول مدنظرتان اجرا کرده باشید.

تحویل نهایی

خروجی را در مسیر outputs/skill-long-context-eval.md ذخیره کنید:

---
name: long-context-eval
description: Design a long-context evaluation battery for a given model and use case.
version: 1.0.0
phase: 5
lesson: 28
tags: [nlp, long-context, evaluation]
---

Given a target model, target context length, and use case, output:

1. Tests. NIAH depth × length grid; RULER multi-hop; custom domain task.
2. Sampling. Depths 0, 0.25, 0.5, 0.75, 1.0 at each length.
3. Metrics. Retrieval pass rate; reasoning pass rate; time-to-first-token; cost-per-query.
4. Cutoff. Effective retrieval length (90% pass) and effective reasoning length (70% pass). Report both.
5. Regression. Fixed harness, rerun on every model upgrade, surface deltas.

Refuse to trust a context window from the model card alone. Refuse NIAH-only evaluation for any multi-hop workload. Refuse vendor self-reported long-context scores as independent evidence.

تمرین‌ها

  1. ساده. یک آزمون NIAH با 3 عمق مختلف (0.25، 0.5، 0.75) در 3 طول (1k، 4k، 16k) بسازید. آن را روی هر مدلی که خواستید اجرا کنید و نرخ موفقیت را در قالب یک نمودار حرارتی 3×3 رسم کنید.
  2. متوسط. یک نسخه‌ی 3 سوزنه اضافه کنید. بازیابی هر 3 مورد را در هر طول بسنجید و با نرخ موفقیت تک‌سوزنه در همان طول مقایسه کنید.
  3. سخت. یک تسک ردیابی متغیر (با سه گام: X1 → X2 → X3) بسازید و آن را میان 64k متن پرکننده قرار دهید. دقت را در 3 مدل پیشرو بسنجید و طول استدلال مؤثر هر مدل را گزارش کنید.

اصطلاحات کلیدی

اصطلاح چیزی که بقیه می‌گویند معنای دقیق فنی
NIAH سوزن در انبار کاه قرار دادن یک فکت میان متن پرکننده و درخواست بازیابی آن از مدل.
RULER نسخه ارتقایافته NIAH مجموعه‌ای شامل 13 تسک مختلف در حوزه‌های بازیابی، چندمرحله‌ای، تجمیع و QA.
کانتکست مؤثر ظرفیت واقعی طولی از کانتکست که در آن دقت بالاتر از آستانه باقی می‌ماند.
گم شدن در میانه سوگیری عمق ضعف مدل‌ها در اتنشن به محتوای قرارگرفته در بخش میانی ورودی‌های طولانی.
چندسوزنه (Multi-needle) چند فکت به‌طور هم‌زمان قرار دادن چند فکت مختلف؛ آزمونی برای مدیریت هم‌زمان اتنشن، نه صرفاً بازیابی تنها.
MRCR حل ارجاع چنددوره‌ای ارجاع‌یابی متنی با 8، 24 یا 100 سوزن؛ برای مشخص کردن نقطه اشباع اتنشن مدل.
NoLiMa سوزن غیرواژگانی عدم اشتراک واژگانی مستقیم میان سوزن و پرامپت پرسش؛ نیازمند استدلال.

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسبنچمارک اصلی NIAH چه چیزی را اندازه‌گیری می‌کند؟
  2. پیش از درسچرا پنجره زمینه تبلیغاتی معمولاً تفاوت زیادی با زمینه واقعاً قابل‌استفاده دارد؟
  3. حین درسبنچمارک RULER چه قابلیت‌هایی نسبت به NIAH اضافه می‌کند؟
  4. حین درساثر «گم‌شدن در میانه» (lost in the middle) چیست؟
  5. حین درسچرا باید ارزیابی صرفاً مبتنی بر NIAH با آزمون‌های چندمرحله‌ای تکمیل شود؟
  6. پس از درسبنچمارک NoLiMa چه جنبه‌ای را تحت فشار قرار می‌دهد؟
  7. پس از درسبرگه مشخصات فنیِ زمینه طولانی باید چه دو عددی را گزارش کند؟
  8. پس از درسچرا باید زمان تا اولین توکن (TTFT) را در زمینه‌های طولانی اندازه گرفت؟

سؤالات متداول

چرا موفقیت مدل در آزمون NIAH تضمین‌کننده‌ی کارکرد خوب آن نیست؟

آزمون NIAH صرفاً بازیابی یک فکت ساده را می‌سنجد، در حالی که در دنیای واقعی مدل‌ها باید بتوانند استدلال چندمرحله‌ای (Multi-hop) و تجمیع داده‌ها را انجام دهند که معمولاً فراتر از 128k توکن با افت شدید مواجه می‌شود.

پدیده‌ی گم شدن در میانه (Lost in the middle) چیست؟

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

تفاوت طول بازیابی مؤثر با طول استدلال مؤثر چیست؟

طول بازیابی مؤثر حداکثر طولی است که مدل فکت‌ها را با دقت مطلوب (مثلاً بالای 90%) می‌یابد، اما طول استدلال مؤثر حداکثر اندازه‌ای است که مدل می‌تواند روی فکت‌های پراکنده منطق و چند گام استنتاج پیاده کند (معمولاً 25 تا 50 درصد سقف اسمی).

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.