Read this in other languages: English, 中文.
- 2023.12.30更新:“大海捞针”测试结果
- 2023.12.28更新:发布Qwen-7b-chat-yarn-32k,但注意,可能由于模型规模偏小,基座模型能力弱,导致7b版本显著弱于Qwen-14b-chat-yarn-32k
- 2023.12.23更新:发布LongBench的passage_retrieval_en的评测结果
- 2023.12.16更新:发布论文(中文版)、论文(英文版)
- 2023.12.14更新:发布经过微调的Qwen-14b-chat-yarn-32k,微调后的模型能适应32k长度(约4万汉字)的中英问答,相较于之前的通过位置插值得到的32k模型,几乎完全解决了多文档问答任务下召回率低(即 lost in middle 现象)的问题。
支持32k上下文的的Qwen-14b-chat模型
模型的主要特性:
- 基于Qwen-14b-chat,使用“原文复述”任务进行指令微调
- 使用Yarn插值方法,使模型能适应32k甚至更长的文本
- 推理时,无需特定prompt,即可给出高准确率的回答。
LongBench测试结果
LongBench的passage_retrieval的评测结果
| 模型 | 准确率 (中文) | 准确率 (英文) |
|---|---|---|
| Qwen-14b-chat-yarn-32k | 0.94 | 0.945 |
| Qwen-7b-chat-yarn-32k | 0.325 | 0.47 |
| gpt-3.5-turbo-16k | 0.81 | 0.88 |
| chatglm3-32k | 0.725 | 0.815 |
| Qwen-14b-chat | 0.525 | 0.24 |
| Qwen-14b-chat-32k-lora | 0.34 | \ |
| Qwen-7b-chat | 0.26 | 0.235 |
| LongAlpaca-7b-32k-chinese-v2 | 0.12 | \ |
| CausalLM-14b | 0.086 | \ |
Qwen-14b-chat-yarn-32k经过微调后,在多文档问答(或检索)任务上提升非常显著,大幅领先其他同规模的模型。
"大海捞针"测试结果

- 可以发现即使在50k长度下(即使训练样本不大于32k),检索信息的准确率依然极高,证明此模型确实拥有强大的长上下文能力,极大缓解“lost in the middle”问题,并且拥有极大的扩展潜力。
- 而且此模型在推理时,不需要进行"原文复述",只需要给出问题,并让模型直接回答问题,模型就能给出正确的答案。(相对的,claude2.1-200k 需要特定的 prompt才能正确回答)这也证明了此模型的强大能力。
Usage
- 使用此模型时会自动设置
config.use_logn_attn=False、config.use_dynamic_ntk=True,会产生warning,不影响模型使用。 - 长文本类型的任务,尽量将长参考文本放在前面,用户的问题放在后面。同时,在问题前面最好加上 “问题:” 或 “Question: ” 等提示(可参考下面的多文档问答示例),以便模型更好的区分参考文本和用户问题。
- 请务必安装
flash-attention2,否则长文本下推理速度极慢,而且可能会报错。
from transformers import AutoModelForCausalLM, AutoTokenizer,AutoConfig
model_path="yuyijiong/Qwen-14b-chat-yarn-32k"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True,use_fast=False)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto", trust_remote_code=True,load_in_8bit=True).eval()
input_text="你好。"
response, history = model.chat(tokenizer, input_text, history=None)
print(response)
训练过程
1.模型结构修改
- 将Qwen模型的NTK插值方法替换为Yarn,同时适当缩小位置插值的缩放因子s,实现了模型在更长文本长度(大于16k)下的正常对话能力。原版Qwen在16k文本长度下无法正常输出。
- 在训练时强制设置use_dynamic_ntk=True
2.预训练
- 使用yuyijiong/LongData-Corpus数据,Qlora方法,数据切分为32k文本长度,对Qwen模型进行增量预训练。
3.指令微调
-
使用yuyijiong/Long-Instruction-Chinese数据,Qlora方法,对Qwen模型进行微调。
-
更多细节在论文中介绍。
历史版本
| 发布时间 | 模型 | 基座模型 | 位置插值 | 训练方式 | 训练数据 |
|---|---|---|---|---|---|
| 2023.10.20 | LongAlpaca-7b-16k-chinese | atom-7b | 4k->16k PI | 指令微调 | 长度16k以内的多文档问答、论文总结、论文问答数据 |
| 2023.10.25 | LongAlpaca-7b-32k-chinese | atom-7b | 4k->32k PI | 指令微调 | 长度32k以内的多文档问答、论文总结、论文问答、sharegpt数据 |
| 2023.11.20 | LongAlpaca-7b-32k-chinese-v2 | CausalLM-7b | 8k->32k Yarn | 增量预训练+指令微调 | 长度32k的中文预训练数据 + 长度32k以内的多文档多轮问答、论文多任务多轮问答、sharegpt、中英翻译数据 |
| 2023.11.28 | Qwen-14b-chat-32k-lora | Qwen-14b-chat | 动态 NTK | 指令微调 | 长度32k以内的多文档多轮问答、论文多任务多轮问答、sharegpt、中英翻译数据 |
| 2023.12.14 | Qwen-14b-chat-yarn-32k | Qwen-14b-chat | 动态 Yarn | 增量预训练+指令微调 | 长度32k的中英文预训练数据 + 长度32k以内的改进版多文档多轮问答、论文多任务多轮问答、sharegpt、中英翻译数据 |
局限性
- 原文复述可能导致模型的回答过于冗长、不够简洁,后续可能会尝试改进数据。
- 指令微调训练数据的类型依然不够多样,虽然已经涵盖了多个长文本场景,但可能难以适应一些长文本的新场景,例如agent能力、两个长文档的对比等。后续可能会增加数据多样性。
- 由于时间和计算资源有限,模型的评估数据集不够多,目前还缺乏一个全方面的能力评估。
- 模型在C-Eval上的平均得分从69.1下降到60.8,通用能力有所下降,但仍然优于Qwen-7b。
问答例子
- 模型支持中文和英文,支持长文本总结、多文档问答、长文本问答、多轮对话等任务。
多文档QA示例问题(24941字)
模型回答