☰
OpenCompass 集成 BABILong:超长上下文推理基准的配置与评测实战
2026/9/29 3:25:59 网站建设 项目流程
  • 模型评测
  • 人工智能
  • 大模型
  • AI 评测

【免费下载链接】opencompass

OpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100+ datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.

项目地址:https://gitcode.com/gh_mirrors/op/opencompass
点击查看免费下载

BABILong 是一个面向超长上下文的 LLM 推理评测基准,通过在长达百万 token 的随机自然文本中隐藏事实,检验模型在多跳事实链、归纳、演绎、计数与集合处理等任务上的长上下文推理能力。OpenCompass 已将其原生接入,本文以仓库中的 babilong README 为骨架,结合数据集加载、评测器与提示词模板等源码实现,完整讲解如何配置、运行并理解 BABILong 评测,以及如何基于现有配置扩展你自己的长上下文评测任务。

BABILong 基准概览

BABILong(论文编号 arXiv:2406.10149)在超长文档上评估语言模型的长上下文推理能力,共包含 20 类多样化推理任务,覆盖:

  • 事实链(fact chaining);
  • 简单归纳(simple induction)与演绎(deduction);
  • 计数(counting);
  • 列表与集合处理(handling lists/sets)等。

该基准的设计目标是测试模型对分布在长自然文本中的事实进行推理的能力。其核心特点是可扩展性与可控性:可以通过构造几乎任意长度的任务,来适配不断出现的、能力更强的模型评测需求。在 OpenCompass 中,每个任务都以「问题事实隐藏在随机背景文本中」的形式组织,模型需要从噪声文本中定位事实并给出答案。

OpenCompass 中的 BABILong 集成现状

OpenCompass 为 BABILong 提供了自动下载支持,数据源为 Hugging Face 上的RMT-team/babilong数据集。需要特别注意的是:

  • 出于数据集体量考虑,仓库默认仅提供最长 1M token(1m)的数据;
  • 如需更长的上下文版本,可自行从 Hugging Face 直接下载数据。

BABILong 论文定义了总共 20 个任务,而 OpenCompass 在 configs/datasets/babilong 目录下提供了其中10 个任务(qa1–qa10)的配置,并按照不同的上下文长度(context size)组织成多组配置。

数据集目录结构

opencompass/configs/datasets/babilong/ ├── babilong_0k_gen.py # 0k 上下文,标准 Prompt 版本 ├── babilong_0k_rawprompt_gen.py ├── babilong_2k_gen.py ├── babilong_2k_rawprompt_gen.py ├── babilong_4k_gen.py ├── babilong_4k_rawprompt_gen.py ├── babilong_16k_gen.py ├── babilong_16k_rawprompt_gen.py ├── babilong_32k_gen.py ├── babilong_32k_rawprompt_gen.py ├── babilong_128k_gen.py ├── babilong_128k_rawprompt_gen.py ├── babilong_256k_gen.py ├── babilong_256k_rawprompt_gen.py ├── babilong_1m_gen.py # 1M 上下文,标准 Prompt 版本 └── babilong_1m_rawprompt_gen.py

可以看到,仓库共提供了 8 档上下文长度(0k/2k/4k/16k/32k/128k/256k/1m),每档都有两种 Prompt 变体:基于PromptTemplate的标准版本与基于RawPromptTemplate的原生 messages 版本。结合 源码中的 split 定义,数据集实际支持0k/1k/2k/4k/8k/16k/32k/64k/128k/256k/512k/1m共 12 档 split,仓库配置暂未全部覆盖,你完全可以自行补齐。

快速上手:运行 BABILong 评测

OpenCompass 提供了开箱即用的 BABILong 评测示例脚本:

opencompass examples/eval_babilong.py

该示例脚本 examples/eval_babilong.py 做了以下事情:

  1. 加载 6 档上下文的 BABILong 数据集:babilong_0k / 4k / 16k / 32k / 128k / 256k;
  2. 加载 4 个预配置模型:lmdeploy_internlm2_5_7b_chat、lmdeploy_llama3_1_8b_instruct、lmdeploy_ministral_8b_instruct_2410、lmdeploy_qwen2_5_7b_instruct(均来自 opencompass/configs/models 下的 LMDeploy 模型配置);
  3. 调整长上下文推理参数:为每个模型设置session_len = 1024 * 1024(1M)、max_seq_len = 1024 * 1024,并以tp=4、num_gpus=4的 4 卡张量并行方式运行;
  4. 配置总结器(summarizer):按babilong_0k ~ babilong_256k各档输出汇总结果;
  5. 指定输出目录:work_dir = './outputs/babilong'。

因此运行该示例前,请确保你的硬件环境能够支撑 1M 上下文的推理显存需求(示例按 4 卡配置),否则可先减少session_len或只评测较短档位(如0k/4k)。

评测配置深度解析

数据集配置文件:以 1M 为例

每个上下文档位的标准配置结构完全一致,以 babilong_1m_gen.py 为例:

from opencompass.datasets.babilong.babilong import BabiLongDataset, BabiLongEvaluator from opencompass.openicl.icl_prompt_template import PromptTemplate from opencompass.openicl.icl_retriever import ZeroRetriever from opencompass.openicl.icl_inferencer import GenInferencer babiLong_1m_datasets = [] split_name = '1m' tasks = ['qa1', 'qa2', 'qa3', 'qa4', 'qa5', 'qa6', 'qa7', 'qa8', 'qa9', 'qa10'] for task in tasks: tmp_dataset = { 'abbr': f'babilong_{task}_{split_name}', 'type': BabiLongDataset, 'path': 'opencompass/babilong', 'task': task, 'split_name': split_name, 'reader_cfg': dict(input_columns=['prompt'], output_column='answer'), 'infer_cfg': dict( prompt_template=dict( type=PromptTemplate, template=dict( round=[ dict(role='HUMAN', prompt='{prompt}'), dict(role='BOT', prompt='{answer}\n'), ] ), ), retriever=dict(type=ZeroRetriever), inferencer=dict(type=GenInferencer), ), 'eval_cfg': dict( evaluator=dict(type=BabiLongEvaluator), ), } babiLong_1m_datasets.append(tmp_dataset)

核心字段说明:

字段取值含义
abbrbabilong_{task}_{split_name}数据集缩写,用于结果展示与汇总分组
typeBabiLongDataset数据集加载类(注册于LOAD_DATASET)
pathopencompass/babilong数据路径,经get_data_path解析后定位本地缓存
taskqa1–qa10任务编号,决定提示词与数据文件
split_name0k/4k/1m/...上下文长度档位
reader_cfginput_columns=['prompt'],output_column='answer'读入 prompt 列、输出 answer 列
retrieverZeroRetriever零样本检索,全量上下文直接送入模型
inferencerGenInferencer生成式推理(max_seq_len可指定最大序列长度)
evaluatorBabiLongEvaluatorBABILong 专用答案比对评估器

值得注意的是,较长档位的配置(如 babilong_128k_gen.py)会额外在GenInferencer中设置max_seq_len = 128 * 1024,以保证输入序列被完整接收;在自定义档位时也应参照此做法显式设置与上下文长度匹配的max_seq_len。

RawPrompt 变体

每档配置还提供了基于RawPromptTemplate的变体(如 babilong_1m_rawprompt_gen.py),直接以原生 OpenAI 风格 messages 组织输入,不经过模板的 round 转换:

prompt_template=dict( type=RawPromptTemplate, messages=[ {'role': 'user', 'content': '{prompt}'}, ], ),

对于部分以 chat 模板为强制的模型,这种原生 messages 形式可以避免额外模板包装,具体选择取决于被测模型的对话格式兼容性。

底层实现:数据加载、提示词与评分

数据集加载(BabiLongDataset.load)

BabiLongDataset 的load静态方法负责数据装配,关键逻辑如下:

  1. 合法性校验:task必须位于qa1–qa10,split_name必须位于 12 档合法取值内,否则直接断言失败;
  2. 提示词组装:从DEFAULT_PROMPTS[task]中取instruction(总指令)、examples(上下文示例)与post_prompt(示例后的补充指令),通过get_formatted_input拼接;
  3. 读取数据文件:路径为{path}/{task}/{split_name}.json,逐条读取input(背景上下文)、question(问题)与target(标准答案);
  4. 构造样本:每条样本输出prompt与answer两列,最终封装为 Hugging FaceDataset供后续推理使用。

三个可选的布尔参数use_instruction、use_examples、use_post_prompt分别控制是否启用指令、示例与后置提示,为消融实验留出了扩展空间。

提示词模板(prompts.py)

prompts.py 定义了 BABILong 的提示词骨架:

SYSTEM_TEMPLATE = '{instruction}\n\n{examples}\n\n{post_prompt}' USER_TEMPLATE = '<context>\n{context}\n</context>\n\nQuestion: {question}' DEFAULT_TEMPLATE = f'{SYSTEM_TEMPLATE}\n\n{USER_TEMPLATE}'

最终输入由「指令 + 示例 + 后置指令」构成系统部分,背景上下文用<context>...</context>标记包裹后与问题组成用户部分。DEFAULT_PROMPTS为 20 个任务(qa1–qa20)分别定义了专属的指令、few-shot 示例与严格输出格式约束(例如 qa1 要求输出「The most recent location of ’person’ is ’location’.」格式、qa6/qa9 只允许yes/no、qa19 只允许n/s/e/w方向字母等),保证答案可被机器精确解析。OpenCompass 实际配置仅启用 qa1–qa10,但提示词定义已覆盖全 20 类任务。

评分逻辑(BabiLongEvaluator)

BabiLongEvaluator 的评分完全基于 compare_answers 实现,其规则如下:

  • 将标准答案与模型输出统一转为小写;
  • 只取输出的第一句话(按.切分),避免模型额外生成解释文字;
  • 过滤掉模型尝试复述<context>、<example>的内容;
  • 判定标准:标准答案作为子串出现在处理后的输出中,即视为回答正确。

最终得分 = 正确样本数 / 总样本数 × 100,保留两位小数。这种「子串匹配」策略与 prompts 中强制的严格输出格式是配套设计的,因此在使用自定义 Prompt 时需保持输出格式的约束性,否则会影响评分准确性。

结果汇总与参考评测结果

总结器(Summarizer)配置

示例脚本使用的汇总分组定义在 opencompass/configs/summarizers/groups/babilong.py 中。该文件将qa1–qa10与 12 档上下文长度(0k/1k/2k/4k/8k/16k/32k/64k/128k/256k/512k/1m)两两组合,生成如下汇总组:

{ 'name': f'babilong_{context_window_size}', 'subsets': [f'babilong_{task}_{context_window_size}' for task in default_babilong_tasks], }

这样每个上下文档位(如babilong_128k)都会自动聚合其下 10 个任务的均值结果,便于观察「上下文越长、得分衰减」的规律。

官方参考结果

OpenCompass 在 README 中给出了若干模型在 BABILong 上的评测结果(使用 LMDeploy 及默认模型配置运行),metric 为naive_average,mode 为gen:

datasetversionmetricmodeinternlm2_5-7b-chat-turbomindqwen2.5-7b-instruct-turbomindllama-3_1-8b-instruct-turbomindministral-8B-instruct-2410-turbomind
babilong_0k-naive_averagegen76.5180.2576.4476.40
babilong_4k-naive_averagegen67.5570.3567.4167.92
babilong_16k-naive_averagegen53.7865.8360.2656.58
babilong_32k-naive_averagegen50.8662.6659.5653.52
babilong_128k-naive_averagegen39.3327.7952.013.20
babilong_256k-naive_averagegen17.317.3023.359.50

从结果中可以清楚看到长上下文推理的普遍衰减趋势:上下文从 0k 延长到 256k 后,各模型分数均大幅下降,部分模型在 128k 档位即接近失效。该表可作为你本地复现实验的对照基线(注意结果随模型版本、推理配置与随机种子可能有所浮动)。

扩展你自己的 BABILong 配置

如果你想评测新的模型或新的上下文档位,可以参照以下步骤:

  1. 选择档位:按split_name合法性列表(含8k/64k/512k等仓库未内置的档位)确定目标长度;
  2. 复制配置模板:以 babilong_1m_gen.py 为模板,修改split_name与abbr前缀,并在GenInferencer中同步设置max_seq_len;
  3. 接入模型配置:在评测脚本中引入opencompass/configs/models下的目标模型配置,并将session_len、max_seq_len调整为不小于目标上下文长度;
  4. 更新汇总分组:在 summarizers/groups/babilong.py 的context_window_sizes中加入新档位,或在脚本的summarizer.dataset_abbrs中显式声明;
  5. 运行并检查输出:执行opencompass examples/eval_babilong.py的同类脚本,在work_dir中查看分任务分数与汇总均值。

引用 BABILong

若在论文或报告中引用 BABILong 基准,可使用官方提供的 BibTeX:

@misc{kuratov2024babilong, title={BABILong: Testing the Limits of LLMs with Long Context Reasoning-in-a-Haystack}, author={Yuri Kuratov and Aydar Bulatov and Petr Anokhin and Ivan Rodkin and Dmitry Sorokin and Artyom Sorokin and Mikhail Burtsev}, year={2024}, eprint={2406.10149}, archivePrefix={arXiv} }

小结

本文围绕 OpenCompass 对 BABILong 基准的原生集成,梳理了从数据下载、配置编写、运行评测到结果汇总的完整链路:README 明确了数据获取方式与默认 1M 上限,配置目录覆盖 10 个任务 × 多档上下文长度,源码层面则通过BabiLongDataset(数据装配)、prompts.py(严格格式的提示词体系)与BabiLongEvaluator(子串匹配评分)构成了可复现、可扩展的评测闭环。对于需要验证模型超长上下文推理能力的团队,直接复用 examples/eval_babilong.py 并对照上文结果表,即可快速获得一份可信的 BABILong 评测报告。

  • 模型评测
  • 人工智能
  • 大模型
  • AI 评测

【免费下载链接】opencompass

OpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100+ datasets covering knowledge, reasoning, coding, science, language, long-context, and safety.

项目地址:https://gitcode.com/gh_mirrors/op/opencompass
点击查看免费下载

相关推荐

上一篇:如何用BabelDOC把英文PDF译成中文双语对照文档
下一篇:kill-doc 免费文档下载脚本指南:3步把文库页面存成PDF

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询