大语言模型的上下文窗口从最早的4K、8K一路扩展到128K、200K甚至宣称百万级别,但窗口长度只是一个参数,模型是否真正具备处理长文本的能力,必须靠基准测试来验证。目前业界的评估方案大致分为两大流派:一类聚焦局部能力,即模型能否在长上下文中精准定位某个具体信息;另一类聚焦全局能力,即模型能否从整体上理解、总结、推理一篇或多篇长文档。这两类能力对应不同的技术挑战,评估方法也完全不同,把两者混为一谈往往会得出错误的结论。

局部能力评估:大海捞针测试的原理与陷阱
大海捞针测试是目前最流行的局部能力评估方法。它的基本流程是:先准备一篇长文本,比如一篇英文小说或者若干篇技术文档拼接,然后把一句关键语句(针)插入到文本的某个深度位置,最后让模型回答与这句关键信息相关的问题。通过在文本的不同深度(如开头10%、中段50%、结尾90%)分别插入针,并逐步增加文本长度,就能绘制出一张二维的检索热力图,直观展示模型在各个长度和深度下的召回表现。
一个最小化的实现可以用Python来完成。核心逻辑是把原文按比例切分,插入针句,再拼回去:
def insert_needle(haystack, needle, depth_percent):
# depth_percent 取 0 到 100,表示插入位置占全文的百分比
words = haystack.split()
insert_pos = int(len(words) * depth_percent / 100)
words.insert(insert_pos, needle)
return " ".join(words)
haystack = load_long_document() # 加载一篇足够长的原始文档
needle = "The secret magic number for the conference is 82691."
context = insert_needle(haystack, needle, 50)
question = "What is the secret magic number mentioned in the document?"
answer = model.chat(context + "\n\nQuestion: " + question)
print("82691" in answer) # 判断是否成功捞出针
这种方法实现简单、结果可视化程度高,但也有明显的局限。首先,它只测试单点信息检索,模型只要具备类似注意力定位的能力就能得高分,这并不代表它理解了整篇文档。其次,一些模型在训练时可能针对这类测试做过优化,导致热力图全绿但真实长文本任务表现平平,这就是所谓的刷分现象。因此大海捞针更适合作为入门筛选,而不是最终结论。
全局能力评估:LongBench的综合任务设计
与大海捞针不同,LongBench这类基准关注的是模型对长文本的整体理解能力。它涵盖了六大类共二十多个子任务,包括单文档问答、多文档问答、长文档摘要、少样本学习、合成任务和代码仓库理解,中英文任务都有覆盖。每个任务都有真实的业务背景,比如多文档问答模拟的是从多篇新闻报道中交叉查找答案的场景,代码任务则要求模型理解一个完整仓库的多个文件后回答关于函数调用关系的问题。
评测时的一个关键细节是长度截断策略。LongBench规定不同语言使用不同的截断上限,英文任务平均每词对应约1.3个token,中文任务则大约每词0.6个token,因此英文任务按20万词截断、中文任务按13.3万词截断。如果不做这种区分,直接用token数对齐会引入系统性偏差。评估指标也按任务类型区分:生成式任务用 Rouge-L 或 BLEU,问答任务用 F1,代码任务用 Pass@K,摘要任务还可以用人工设计的混合评分。
全局基准的难点在于数据污染控制和评测成本。一份公开的测试集一旦广泛流传,很容易混入后续模型的训练数据。一些团队的做法是保留一套不公开的私有测试集,定期轮换公开部分,或者干脆基于内部文档自建评测集。如果你的业务场景是法律合同审查或财报分析,基于自有语料构建几百条问答对,其参考价值往往远高于公开榜单。
搭建自己的长文本评估流程
实际选型或自研时,建议把局部和全局评估结合起来组成漏斗式的流程。第一层用大海捞针做快速筛查,成本低、速度快,几分钟就能跑完一个长度档位;第二层用LongBench这类公开基准看综合表现;第三层用自建业务评测集做最终验证。三层层层递进,既能控制成本,又能避免被单一维度的分数误导。
工程实现上有几个容易踩的坑需要特别注意。第一是分块策略,如果截断发生在句子中间,会破坏语义完整性,建议按段落或句子边界截断。第二是评估的公平性,不同模型的tokenizer词表不同,同样是128K窗口,实际能容纳的文字量可能相差百分之二十以上,对比时应该统一按字符数而不是token数给输入。第三是随机性控制,生成式任务的解码存在随机性,建议对每个样本至少评估一次以上并固定随机种子,或者将temperature设为0后再取平均分。
最后要提醒的是解读结果的方式。热力图上局部的几个红点(检索失败)未必致命,更值得关注的是随着长度增加整体成功率的衰减斜率,以及全局任务分数与局部任务分数的差值。如果一个模型大海捞针接近满分而LongBench明显落后,基本可以判断它只擅长定位而不擅长综合理解;反过来则说明模型有整体概括能力但细节检索不稳。把这两个维度的数据放在一起交叉分析,才能对模型的长文本能力画出一张相对准确的画像,进而做出可靠的选型决策。