长上下文评估


文档摘要

长上下文评估 本节摘要:Gemini 3 Pro 标称 1000 万 token 上下文,但在 100 万 token 时,8 针 MRCR 掉到 26.3%——标称不等于可用,长上下文评估告诉你所发布的模型的真实容量。你有一份 200 页合同,模型声称百万 token 上下文,你贴进去问「解约条款是什么」,它却从封面页作答——因为解约条款埋在 12 万 token 深处,过了模型真正注意的范围。这是 2026 的上下文容量鸿沟:规格书写 100 万或 1000 万,现实说可用只有 6070%,且「可用」取决于任务——单针检索在前沿模型上接近满分到标称上限;多跳/聚合在多数模型上过约 12.8 万就骤降;对分散事实的推理是最先失败的任务。

长上下文评估

本节摘要:Gemini 3 Pro 标称 1000 万 token 上下文,但在 100 万 token 时,8 针 MRCR 掉到 26.3%——标称不等于可用,长上下文评估告诉你所发布的模型的真实容量。你有一份 200 页合同,模型声称百万 token 上下文,你贴进去问「解约条款是什么」,它却从封面页作答——因为解约条款埋在 12 万 token 深处,过了模型真正注意的范围。这是 2026 的上下文容量鸿沟:规格书写 100 万或 1000 万,现实说可用只有 6070%,且「可用」取决于任务——单针检索在前沿模型上接近满分到标称上限;多跳/聚合在多数模型上过约 12.8 万就骤降;对分散事实的推理是最先失败的任务。本节命名各基准(NIAH、RULER、LongBench v2、MRCR、NoLiMa、HELMET、BABILong)各自测什么,教你为领域搭一个自定义针测试,并指出该报的两个数:检索有效长度与推理有效长度——后者通常只有标称窗口的 2550%。

对应原课程:Phase 5 · Lesson 28 · long-context-evaluation(原英文 phases/05-nlp-foundations-to-advanced/28-long-context-evaluation/docs/en.md)。前置依赖:第 13 节(问答系统)、第 23 节(分块策略)。

学习目标

阅读完本节,你应当能够:

  1. 区分各长上下文基准(NIAH、RULER、LongBench v2、MRCR、NoLiMa、BABILong)各自测什么。
  2. 从零搭领域自定义的针插草堆测试与多针、多跳变元追踪变体。
  3. 报出两个关键数:有效检索长度有效推理长度(通常 25~50% 标称)。
  4. 识别只测 NIAH、深度采样不均、词法重叠、忽视延迟、厂商自报等陷阱。

一、问题与直觉

你有一份 200 页合同。模型声称百万 token 上下文。你贴进去问:「解约条款是什么?」模型答了——却从封面页答,因为解约条款埋在 12 万 token 深处,过了模型真正注意的范围。

这是 2026 的上下文容量鸿沟。规格书写 100 万或 1000 万,现实说可用只有 60~70%,且「可用」取决于任务。

  • 检索(草堆单针):前沿模型上接近满分到标称上限。
  • 多跳 / 聚合:多数模型上过约 12.8 万骤降。
  • 对分散事实的推理:最先失败的任务。

长上下文评估测的就是这几条轴。本节命名各基准、各自测什么,以及如何为领域搭一个自定义针测试。

  • 针插草堆(NIAH, 2023):把一个事实(「魔法词是 pineapple」)放在长上下文里可控的深度,问模型把它检索出来。扫深度 × 长度。原始的长上下文基准。前沿模型现在已饱和它——它是必要但不充分的基线。
  • RULER(Nvidia, 2024):跨 4 类的 13 种任务——检索(单键/多键/多值)、多跳追踪(变量追踪)、聚合(常见词频)、QA。长度可配(4k 到 128k+)。揭示那些饱和 NIAH 却挂在多跳上的模型。2024 发布时,17 个声称 32k+ 上下文的模型里,只有一半在 32k 上保住质量。
  • LongBench v2(2024):503 道多选题,8k~200 万词上下文,六大类:单文档 QA、多文档 QA、长上下文学习、长对话、代码仓库、长结构化数据。真实世界长上下文行为的生产基准。
  • MRCR(多轮共指消解):规模化的多轮共指,有 8 针、24 针、100 针变体。暴露一个模型在注意力退化前能同时玩转多少事实。
  • NoLiMa:「非词法针」。针与查询无字面重叠,检索需一步语义推理,比 NIAH 难。
  • HELMET:拼接许多文档,问其中任意一篇的问题。测选择性注意力。
  • BABILong:把 bAbI 推理链嵌进无关草堆里。测「草堆里的推理」,而非仅检索。

实际该报什么

  • 标称上下文窗口:规格书上的数。
  • 有效检索长度:NIAH 在某阈值(如 90%)上的通过长度。
  • 有效推理长度:多跳或聚合在该阈值上的通过长度。
  • 退化曲线:准确率 vs 上下文长度,按任务类型分别绘。

💡 给你的规格书两个数:检索有效与推理有效。通常推理有效是标称窗口的 25~50%。

二、从零实现

第 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},绘热力图。那就是你目标模型的 NIAH 卡。

第 2 步:多针变体

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. ... (填充) ... X2 = X1 + 10. ... (填充) ... 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:在 100 万 token 上过 NIAH 不说明多跳行。总要跑 RULER 或自定义多跳。
  • 深度采样不均:许多实现只测 depth=0.5。要测 0、0.25、0.5、0.75、1.0——「迷失在中间」效应是真的。
  • 与填充文的词法重叠:若针与填充文共享关键词,检索就变平凡。用 NoLiMa 式无重叠针。
  • 忽视延迟:100 万 token 提示预填要 30~120 秒。准确率之外要测首个 token 时延。
  • 厂商自报数字:OpenAI、Google、Anthropic 都发自己的分。总在你的用例上独立重跑。

2026 的栈:

情形 基准
快速健全检查 自定义 NIAH,3 深度 × 3 长度
生产模型选型 RULER(13 任务)在你目标长度
真实世界 QA 质量 LongBench v2 单文档 QA 子集
多跳推理 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. 基础:搭一个 3 深度(0.25、0.5、0.75)× 3 长度(1k、4k、16k)的 NIAH,在任意模型上跑,把通过率绘成 3×3 热力图。
  2. 进阶:加一个 3 针变体,在每个长度上测三针全中的检索,对比同长度的单针通过率。
  3. 挑战:构一个变元追踪任务(X1→X2→X3,三跳)嵌进 64k 填充文,在三个前沿模型上测准确率,报告各自的有效推理长度。

本节要点回顾

  1. 标称不等于可用:1M10M 标称,现实 6070%,推理有效常只 25~50%。
  2. 任务决定可用:单针检索近满分到上限,多跳/聚合过 ~128k 骤降,分散事实推理最先挂。
  3. NIAH 是必要不充分基线:把事实放可控深度检索,前沿已饱和。
  4. RULER 是 13 任务多类:揭示饱和 NIAH 却挂多跳的模型,17 个 32k+ 模型只一半保质量。
  5. LongBench v2 是真实世界基准:503 题,8k~2M 词,六类任务。
  6. MRCR 测注意力饱和:8/24/100 针共指,100 万 token 时 8 针可掉到 26.3%。
  7. NoLiMa 无词法重叠:针与查询不共享字面,需一步语义推理,比 NIAH 难。
  8. BABILong 测草堆里的推理:bAbI 链嵌无关草堆,而非仅检索。
  9. 报两个数:检索有效长度(90% 通过)与推理有效长度(70% 通过)。
  10. 迷失在中间是真的:要测深度 0/0.25/0.5/0.75/1.0,只测 0.5 会漏;厂商自报数字要独立重跑。

下一节,我们进入全章的收尾——「对话状态跟踪」,看任务型对话系统如何用槽位与信念状态在多轮间记住用户的意图,这也是本 NLP 章的最后一节。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U