阅读中文版本.
📖 LongBench: 一个为长文上下文理解的双语、多任务基准
LongBench 是第一个用于双语、多任务和全面评估大型语言模型长文上下文理解能力的基准。LongBench 包含不同语言(中文和英文),为大型语言模型在长文上下文上的多语言能力提供更全面的评估。此外,LongBench 由六大类和二十一项不同任务组成,涵盖了诸如单文档问答、多文档问答、摘要、少样本学习、合成任务和代码补全等长文本应用场景的关键任务。
我们充分意识到模型评估过程中可能涉及的高成本,特别是在长文场景下(如人工标注成本或API调用成本)。因此,我们采用了完全自动化的评估方法,旨在以最低成本测量和评估模型理解长文上下文的能力。
LongBench 包含 14 项英文任务、5 项中文任务和 2 项代码任务,大部分任务的平均长度范围在 5k 到 15k 之间,总共有 4,750 条测试数据。有关 LongBench 任务的详细统计和构建方法,请参考这里。此外,我们提供了 LongBench-E,这是一组通过均匀采样构建的更统一长度分布的测试集,在 0-4k、4k-8k 和 8k+ 长度区间提供了数据量可比较的数据,以分析模型在不同输入长度下的性能变化。
任务类型 | #英文任务 | #中文任务 | #代码任务 |
---|---|---|---|
多文档问答 | 3 | 1 | - |
单文档问答 | 3 | 1 | - |
摘要 | 3 | 1 | - |
少样本学习 | 3 | 1 | - |
合成任务 | 2 | 1 | - |
代码补全 | - | - | 2 |
🔥 更新
[2024/02/01] 查看我们在长文上下文 LLMs 方面的新工作:LongAlign。我们探索了长文上下文对齐的最佳方案。我们还提出了 LongBench-Chat,这是第一个现实世界的长文上下文评估基准(输入长度 10k-100k)。同时,我们在 HF Dataset 发布了一个指令遵循数据集,并提供了一系列使用 LongAlign 训练的具有竞争力的长文上下文 LLMs!
[2023/10/30] 新的 ChatGLM3-6B-32k 聊天模型发布,长文上下文建模能力更强,尤其擅长基于长文档的问答、推理和摘要。查看它在 LongBench 上的表现。
[2023/08/29] LongBench 论文发布,和 LongBench 的几个重要更新一起发布:
- 更全面的数据集:为多文档摘要任务添加了 MultiNews 数据集,为少样本学习任务添加了摘要任务 SAMSum,替换了之前的 QA 任务 NQ。重新抽样 TriviaQA 和 RepoBench-P 确保数据长度更为适当;
- 更均匀的长度分布:LongBench-E 通过按长度均匀抽样获得,有着在 0-4k、4-8k 和 8k+ 长度间隔内相当量的测试数据,更适合评估模型在不同输入长度变化下的能力;
- 所有评估代码公开:所有模型的评估代码已公开,并提供了基于检索和摘要的长文上下文压缩策略的代码。
🔍 目录
🖥️ Leaderboard
以下是在零样本场景下,主要任务类别(中英文)的平均得分(%)。关于各任务的评估指标请参见这个链接。
注意:对于超过模型处理长度能力的文本,我们从文本中间截断,保留文本开头和结尾的信息,根据 Lost in the Middle 中的观察,实验表明这种截断方法对模型性能的影响最小。
英文
Avg | 单文档问答 | 多文档问答 | 摘要 | 少样本学习 | 代码补全 | 合成任务 | |
---|---|---|---|---|---|---|---|
GPT-3.5-Turbo-16k | 44.0 | 39.8 | 38.7 | 26.5 | 67.1 | 54.1 | 37.8 |
Llama2-7B-chat-4k | 31.0 | 24.9 | 22.6 | 24.7 | 60.0 | 48.1 | 5.9 |
LongChat-v1.5-7B-32k | 34.3 | 28.7 | 20.6 | 26.7 | 60.0 | 54.1 | 15.8 |
XGen-7B-8k | 28.3 | 24.6 | 20.4 | 24.7 | 56.2 | 38.6 | 5.3 |
InternLM-7B-8k | 24.2 | 17.4 | 20.2 | 16.1 | 50.3 | 36.4 | 4.5 |
ChatGLM2-6B-32k | 40.9 | 32.9 | 33.7 | 27.6 | 59.1 | 52.7 | 39.2 |
Vicuna-v1.5-7B-16k | 31.9 | 28.0 | 18.6 | 26.0 | 66.2 | 47.3 | 5.5 |
ChatGLM3-6B-32k | 48.5 | 40.3 | 46.6 | 29.5 | 68.1 | 56.2 | 50.5 |
中文
Avg | 单文档问答 | 多文档问答 | 摘要 | 少样本学习 | 代码补全 | 合成任务 | |
---|---|---|---|---|---|---|---|
GPT-3.5-Turbo-16k | 44.5 | 61.2 | 28.7 | 16.0 | 29.2 | 54.1 | 77.5 |
Llama2-7B-chat-4k | 14.3 | 11.9 | 5.2 | 0.2 | 19.8 | 48.1 | 0.5 |
LongChat-v1.5-7B-32k | 23.9 | 29.1 | 19.5 | 9.9 | 23.2 | 54.1 | 7.6 |
XGen-7B-8k | 15.1 | 14.8 | 11.0 | 2.2 | 20.5 | 38.6 | 3.5 |
InternLM-7B-8k | 18.3 | 33.6 | 11.1 | 12.4 | 15.2 | 36.4 | 0.9 |
ChatGLM2-6B-32k | 41.7 | 51.6 | 37.6 | 16.2 | 27.7 | 52.7 | 64.5 |
Vicuna-v1.5-7B-16k | 26.4 | 43.0 | 19.3 | 15.1 | 28.8 | 47.3 | 5.0 |
ChatGLM3-6B-32k | 52.8 | 62.3 | 44.8 | 17.8 | 42.0 | 56.2 | 94.0 |
长文上下文能力的雷达图
不同上下文长度下的能力变化
为了具体分析模型在不同上下文长度下的表现,以下图表展示了在 LongBench-E 中,模型在不同上下文长度区间的所有任务类别的总分平均值。
⚙️ 如何在 LongBench 上进行评估
加载数据
您可以通过 Hugging Face 数据集下载并加载 LongBench 数据(🤗 HF Repo):
from datasets import load_dataset
datasets = ["narrativeqa", "qasper", "multifieldqa_en", "multifieldqa_zh", "hotpotqa", "2wikimqa", "musique", \
"dureader", "gov_report", "qmsum", "multi_news", "vcsum", "trec", "triviaqa", "samsum", "lsht", \
"passage_count", "passage_retrieval_en", "passage_retrieval_zh", "lcc", "repobench-p"]
for dataset in datasets:
data = load_dataset('THUDM/LongBench', dataset, split='test')
同样,您可以加载 LongBench-E 数据:
from datasets import load_dataset
datasets = ["qasper", "multifieldqa_en", "hotpotqa", "2wikimqa", "gov_report", "multi_news", "trec", \
"triviaqa", "samsum", "passage_count", "passage_retrieval_en", "lcc", "repobench-p"]
for dataset in datasets:
data = load_dataset('THUDM/LongBench', f"{dataset}_e", split='test')
或者,您可以从这个链接下载文件夹以加载数据。
数据格式
LongBench(LongBench-E)中的所有数据均标准化为以下格式:
{
"input": "任务的输入/命令,通常较短,如QA中的问题,少样本任务中的查询等",
"context": "任务所需的长文上下文,例如文档、跨文件代码、少样本任务中的少样本示例",
"answers": "所有正确答案的列表",
"length": "前三项的总长度(中文按字符计算,英文按单词计算)",
"dataset": "此数据所属的数据集名称",
"language": "该数据条目的语言",
"all_classes": "分类任务中的所有类别,非分类任务则为空",
"_id": "每条数据的随机id"
}
评估
使用 pip 安装相关需求:pip install -r requirements.txt
。对于基于 Llama-2 的模型,我们建议使用 Flash Attention 进行优化和节省 GPU 内存。相关依赖可以按照 Flash Attention 的代码库进行安装。
首先,运行 pred.py 并通过 --model
选择您要评估的模型。以 ChatGLM3-6B-32k 为例(HuggingFace 模型权重将根据 model2path.json 中的路径自动下载,您也可以修改此文件中的路径以从本地加载模型权重):
CUDA_VISIBLE_DEVICES=0 python pred.py --model chatglm3-6b-32k
您还可以在多个 GPU 上并行运行推理(一个模型对应一个 GPU):
CUDA_VISIBLE_DEVICES=0,1,2,3 python pred.py --model chatglm3-6b-32k
您可以在 pred/
文件夹中获得该模型在所有 LongBench 数据集上的输出。同样,使用 --e
命令:
CUDA_VISIBLE_DEVICES=0 python pred.py --model chatglm3-6b-32k --e
您可以在 pred_e/
文件夹中获得 LongBench-E 的输出。之后,运行 eval.py 中的评估代码:
python eval.py --model chatglm3-6b-32k
您可以在 result.json
中获得该模型在所有数据集上的评估结果。通过 --e
命令可以获得 LongBench-E 中所有数据集在不同长度区间的平均得分。
请注意,在 config/
中我们提供了适合每个数据集的输入格式和最大输出长度。您可以根据您的模型调整这些设置。在评估 pred.py 时,数据将根据新格式自动组织以获得相应的模型输出。
另外,我们还提供了基于检索和摘要的长文上下文压缩评估代码(详见 LongBench 论文中的 4.2 节)在 retrieval/
和 summ/
文件夹中。
📊 各数据集上的评估结果
以下表格显示了所有数据集的零样本评估结果(%),其中中文数据集以“zh”表示(请参见这个链接了解各任务使用的评估指标)。
单文档问答
NarrativeQA | Qasper | MultiFieldQA-en | MultiFieldQA-zh | |
---|---|---|---|---|
GPT-3.5-Turbo-16k | 23.6 | 43.3 | 52.3 | 61.2 |
Llama2-7B-chat-4k | 18.7 | 19.2 | 36.8 | 11.9 |
LongChat-v1.5-7B-32k | 16.9 | 27.7 | 41.4 | 29.1 |
XGen-7B-8k | 18.0 | 18.1 | 37.7 | 14.8 |
InternLM-7B-8k | 12.1 | 16.7 | 23.4 | 33.6 |
ChatGLM2-6B-32k | 21.1 | 31.5 | 46.2 | 51.6 |
Vicuna-v1.5-7B-16k | 19.4 | 26.1 | 38.5 | 43.0 |
ChatGLM3-6B-32k | 26.0 | 43.3 | 51.7 | 62.3 |
多文档问答
HotpotQA | 2WikiMQA | Musique | DuReader (zh) | |
---|---|---|---|---|
GPT-3.5-Turbo-16k | 51.6 | 37.7 | 26.9 | 28.7 |
Llama2-7B-chat-4k | 25.4 | 32.8 | 9.4 | 5.2 |
LongChat-v1.5-7B-32k | 31.5 | 20.6 | 9.7 | 19.5 |
XGen-7B-8k | 29.7 | 21.1 | 10.3 | 11.0 |
InternLM-7B-8k | 28.7 | 22.8 | 9.0 | 11.1 |
ChatGLM2-6B-32k | 45.1 | 34.0 | 21.9 | 37.6 |
Vicuna-v1.5-7B-16k | 25.3 | 20.8 | 9.8 | 19.3 |
ChatGLM3-6B-32k | 54.4 | 44.9 | 40.4 |
总结
GovReport | QMSum | MultiNews | VCSUM (zh) | |
---|---|---|---|---|
GPT-3.5-Turbo-16k | 29.5 | 23.4 | 26.7 | 16.0 |
Llama2-7B-chat-4k | 27.3 | 20.8 | 25.8 | 0.2 |
LongChat-v1.5-7B-32k | 30.8 | 22.7 | 26.4 | 9.9 |
XGen-7B-8k | 27.3 | 20.5 | 26.2 | 2.2 |
InternLM-7B-8k | 9.7 | 15.9 | 22.8 | 12.4 |
ChatGLM2-6B-32k | 32.4 | 24.0 | 26.5 | 16.2 |
Vicuna-v1.5-7B-16k | 27.9 | 22.8 | 27.2 | 15.1 |
ChatGLM3-6B-32k | 36.8 | 23.9 | 27.9 | 17.8 |
少样本学习
TREC | TriviaQA | SAMSum | LSHT (zh) | |
---|---|---|---|---|
GPT-3.5-Turbo-16k | 68.0 | 91.4 | 41.7 | 29.2 |
Llama2-7B-chat-4k | 61.5 | 77.8 | 40.7 | 19.8 |
LongChat-v1.5-7B-32k | 63.5 | 82.3 | 34.2 | 23.2 |
XGen-7B-8k | 65.5 | 77.8 | 25.3 | 20.5 |
InternLM-7B-8k | 52.0 | 77.8 | 21.2 | 15.2 |
ChatGLM2-6B-32k | 62.5 | 78.7 | 36.3 | 27.7 |
Vicuna-v1.5-7B-16k | 71.5 | 86.2 | 40.8 | 28.8 |
ChatGLM3-6B-32k | 79.0 | 87.1 | 38.2 | 42.0 |
合成任务
Passage Count | PassageRetrieval-en | PassageRetrieval-zh | |
---|---|---|---|
GPT-3.5-Turbo-16k | 4.5 | 71.0 | 77.5 |
Llama2-7B-chat-4k | 2.1 | 9.8 | 0.5 |
LongChat-v1.5-7B-32k | 1.0 | 30.5 | 7.6 |
XGen-7B-8k | 2.1 | 8.5 | 3.5 |
InternLM-7B-8k | 3.0 | 6.0 | 0.9 |
ChatGLM2-6B-32k | 1.5 | 77.0 | 64.5 |
Vicuna-v1.5-7B-16k | 6.5 | 4.5 | 5.0 |
ChatGLM3-6B-32k | 2.0 | 99.0 | 94.0 |
代码补全
LCC | RepoBench-P | |
---|---|---|
GPT-3.5-Turbo-16k | 54.7 | 53.6 |
Llama2-7B-chat-4k | 52.4 | 43.8 |
LongChat-v1.5-7B-32k | 53.0 | 55.3 |
XGen-7B-8k | 38.6 | 38.6 |
InternLM-7B-8k | 44.1 | 28.8 |
ChatGLM2-6B-32k | 55.6 | 49.9 |
Vicuna-v1.5-7B-16k | 51.0 | 43.5 |
ChatGLM3-6B-32k | 57.66 | 54.76 |
📄 致谢
- LongBench 的某些任务基于之前研究人员提出的数据集,包括 HotpotQA、2WikiMultihopQA、MuSiQue、DuReader、NarrativeQA、Qasper、GovReport、QMSum、MultiNews、VCSUM、TriviaQA、TREC、SAMSum、LSHT、LCC 和 RepoBench-P。
📝 引用
@article{bai2023longbench,
title={LongBench: A Bilingual, Multitask Benchmark for Long Context Understanding},
author={Bai, Yushi and Lv, Xin and Zhang, Jiajie and Lyu, Hongchang and Tang, Jiankai and Huang, Zhidian and Du, Zhengxiao and Liu, Xiao and Zeng, Aohan and Hou, Lei and Dong, Yuxiao and Tang, Jie and Li, Juanzi},
journal={arXiv preprint arXiv:2308.14508},
year={2023}
}
在引用我们的工作时,请考虑引用原始数据集论文。相关的引用信息列在这里。