模型简介
模型特点
模型能力
使用案例
🚀 QwenLong-L1:借助强化学习迈向长上下文大型推理模型
QwenLong-L1 是一种新颖的强化学习框架,旨在助力大型推理模型(LRMs)从短上下文能力过渡到强大的长上下文泛化能力。该模型在长上下文文档问答基准测试中表现出色,超越了诸多同类旗舰模型。
项目信息
属性 | 详情 |
---|---|
模型类型 | 长上下文大型推理模型(LRM) |
训练数据 | Tongyi-Zhiwen/DocQA-RL-1.6K |
基础模型 | deepseek-ai/DeepSeek-R1-Distill-Qwen-32B |
团队信息
作者:Fanqi Wan、Weizhou Shen、Shengyi Liao、Yingcheng Shi、Chenliang Li、Ziyi Yang、Ji Zhang、Fei Huang、Jingren Zhou、Ming Yan
所属机构:阿里巴巴集团通义实验室
🚀 快速开始
使用 Transformers 运行模型
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Tongyi-Zhiwen/QwenLong-L1-32B"
# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
# 准备模型输入
template = """请阅读以下文本并回答下面的问题。
<text>
$DOC$
</text>
$Q$
请按以下格式回复:“因此,答案是(在此处插入答案)”。"""
context = "<YOUR_CONTEXT_HERE>"
question = "<YOUR_QUESTION_HERE>"
prompt = template.replace('$DOC$', context.strip()).replace('$Q$', question.strip())
messages = [
# {"role": "system", "content": "You are QwenLong-L1, created by Alibaba Tongyi Lab. You are a helpful assistant."}, # 需要时使用系统提示定义身份。
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# 进行文本生成
generated_ids = model.generate(
**model_inputs,
max_new_tokens=10000,
temperature=0.7,
top_p=0.95
)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
# 解析思考内容
try:
# 反向查找 151649 (</think>)
index = len(output_ids) - output_ids[::-1].index(151649)
except ValueError:
index = 0
thinking_content = tokenizer.decode(output_ids[:index], skip_special_tokens=True).strip("\n")
content = tokenizer.decode(output_ids[index:], skip_special_tokens=True).strip("\n")
print("思考内容:", thinking_content)
print("回答内容:", content)
✨ 主要特性
- 新颖的强化学习框架:通过渐进式上下文扩展,帮助 LRMs 从短上下文推理过渡到长上下文推理。
- 多组件协同工作:包括预热监督微调(SFT)阶段、课程引导的 RL 阶段和难度感知的回顾性采样机制。
- 混合奖励函数:结合基于规则和基于模型的二元结果奖励,平衡精度和召回率。
- 领先的性能表现:在七个长上下文文档问答基准测试中,超越了 OpenAI-o3-mini 和 Qwen3-235B-A22B 等旗舰模型,与 Claude-3.7-Sonnet-Thinking 表现相当。
📦 安装指南
# 创建 conda 环境
conda create -n qwenlongl1 python==3.10
conda activate qwenlongl1
# 安装依赖
pip3 install -r requirements.txt
# 安装 verl
cd verl
pip3 install -e .
# 安装 vLLM
pip3 install vllm==0.7.3
# 安装 flash-attn
pip3 install flash-attn --no-build-isolation
📚 详细文档
最新消息
- 2025 年 5 月 28 日:我们发布了 QwenLong-L1-32B-AWQ,该模型使用 ms-swift 框架进行了 AWQ int4 量化。
- 2025 年 5 月 26 日:我们发布了 QwenLong-L1-32B,这是首个使用强化学习进行长上下文推理训练的长上下文 LRM。在七个长上下文文档问答基准测试中的实验表明,QwenLong-L1-32B 优于 OpenAI-o3-mini 和 Qwen3-235B-A22B 等旗舰 LRM,性能与 Claude-3.7-Sonnet-Thinking 相当,在最先进的 LRM 中表现领先。
- 2025 年 5 月 26 日:我们发布了 DocQA-RL-1.6K,这是一个专门的 RL 训练数据集,包含 1600 个文档问答(DocQA)问题,涵盖数学、逻辑和多跳推理领域。
模型发布
我们发布了 QwenLong-L1-32B,这是首个使用强化学习进行长上下文推理训练的长上下文 LRM。以下是评估结果:
处理长文档
对于总长度(包括输入和输出)显著超过 32768 个标记的输入,我们建议使用 RoPE 缩放技术来有效处理长文本。我们使用 YaRN 方法验证了模型在长达 131072 个标记的上下文长度上的性能。
YaRN 的启用方法
- 修改模型文件:在
config.json
文件中添加rope_scaling
字段:
{
...,
"rope_scaling": {
"rope_type": "yarn",
"factor": 4.0,
"original_max_position_embeddings": 32768
}
}
对于 llama.cpp
,修改后需要重新生成 GGUF 文件。
- 传递命令行参数:
- 对于
vllm
,可以使用:
- 对于
vllm serve ... --rope-scaling '{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}' --max-model-len 131072
- 对于
sglang
,可以使用:
python -m sglang.launch_server ... --json-model-override-args '{"rope_scaling":{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}}'
- 对于
llama.cpp
中的llama-server
,可以使用:
llama-server ... --rope-scaling yarn --rope-scale 4 --yarn-orig-ctx 32768
⚠️ 重要提示
如果遇到以下警告:
Unrecognized keys in `rope_scaling` for 'rope_type'='yarn': {'original_max_position_embeddings'}
请将 transformers
升级到 >=4.51.0
。
💡 使用建议
所有知名的开源框架都实现了静态 YaRN,这意味着缩放因子无论输入长度如何都保持不变,可能会影响较短文本的性能。我们建议仅在处理长上下文时添加
rope_scaling
配置。此外,建议根据需要修改factor
。例如,如果应用程序的典型上下文长度为 65536 个标记,最好将factor
设置为 2.0。如果平均上下文长度不超过 32768 个标记,我们不建议在此情况下启用 YaRN,因为这可能会降低模型性能。
数据集
为了构建一个具有挑战性的 RL 数据集,用于可验证的长上下文推理,我们开发了 DocQA-RL-1.6K,该数据集包含 1600 个文档问答问题,涵盖三个推理领域:
- 数学推理:使用 DocMath 数据集中的 600 个问题,需要对金融报告等长而专业的文档进行数值推理。对于 DocMath,我们从其验证分割的每个子集中采样 75% 的项目用于训练,25% 用于评估。
- 逻辑推理:使用 DeepSeek-R1 合成 600 个多项选择题,需要对来自我们精选集合的法律、金融、保险和生产领域的真实文档进行逻辑分析。
- 多跳推理:从 MultiHopRAG 中采样 200 个示例,从 Musique 中采样 200 个示例,强调跨文档推理。
请下载以下数据集并将其放在 ./datasets/
中,用于训练和评估:
- RL 训练数据:DocQA-RL-1.6K。
- 评估数据:docmath、frames、longbench。
训练
我们提供了使用 DAPO 进行单阶段 RL 训练的基本演示代码。
启动本地验证器
export CUDA_VISIBLE_DEVICES=0
vllm serve "Qwen/Qwen2.5-1.5B-Instruct" \
--host 0.0.0.0 \
--port 23547
启动 4 节点 RL 训练
export PROJ_DIR="<YOUR_PROJ_DIR_HERE>"
export MASTER_IP="<YOUR_MASTER_IP_HERE>" # ray 主节点 IP
export NNODES=4 # 总 GPU 节点数
export NODE_RANK=${RANK} # 当前节点的排名
export PORT=6382
export WANDB_API_KEY="<YOUR_WANDB_API_KEY_HERE>"
export WANDB_PROJECT="QwenLong-L1"
export LLM_JUDGE=Y # 'Y': LLM 判断,'N': 基于规则
export VLLM_ATTENTION_BACKEND=FLASH_ATTN
# 验证器
export VERIFIER_PATH="Qwen/Qwen2.5-1.5B-Instruct"
export VERIFIER_HOST="<YOUR_VERIFIER_HOST_HERE>"
export VERIFIER_PORT="23547"
ray_start_retry() {
while true; do
ray start --address="${MASTER_IP}:${PORT}"
if [ $? -eq 0 ]; then
break
fi
echo "连接主节点失败,5 秒后重试..."
sleep 5
done
}
check_ray_status() {
until ray status >/dev/null 2>&1; do
echo "等待 Ray 集群准备就绪..."
sleep 5
done
}
if [ "$RANK" == "0" ]; then
echo "启动主节点..."
ray start --head --port=${PORT}
check_ray_status
echo "Ray 主节点启动成功"
else
echo "启动工作节点..."
ray_start_retry
check_ray_status
echo "成功加入 Ray 集群"
fi
if [ "$RANK" == "0" ]; then
bash ${PROJ_DIR}/scripts/rl_4nodes_dapo.sh 2>&1 | tee ${PROJ_DIR}/logs/rl_log_$(date +%Y%m%d_%H%M%S).txt &
else
sleep 30d
fi
wait
评估
我们在七个长上下文文档问答基准测试中进行了评估,包括多跳推理基准测试(如 2WikiMultihopQA、HotpotQA、Musique、NarrativeQA、Qasper 和 Frames)以及数学推理基准测试(如 DocMath)。我们报告精确匹配和 LLM 判断准确率的最大值作为最终得分,与我们的 RL 训练过程中的奖励函数保持一致。我们使用 DeepSeek-V3 作为判断模型,温度设置为 0.0,以提供可靠的评估。
# 步骤 1. 启动模型进行评估
export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7"
MODEL_NAME="QwenLong-L1-32B"
MODEL_PATH="Tongyi-Zhiwen/QwenLong-L1-32B"
vllm serve ${MODEL_PATH} \
--port 23547 \
--api-key "token-abc123" \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.95 \
--max_model_len 131072 \
--trust-remote-code
# 步骤 2. 为每个数据集生成模型响应
export SERVE_HOST="<YOUR_SERVE_HOST_HERE>" # 例如,127.0.0.1
export SERVE_PORT="23547"
PROJ_DIR="<YOUR_PROJ_DIR_HERE>"
DATA="<YOUR_DATA_HERE>" # 例如,docmath, frames, 2wikimqa, hotpotqa, musique, narrativeqa, pasper
python ${PROJ_DIR}/eval/${DATA}.py \
--save_dir "${PROJ_DIR}/eval/results/${DATA}" \
--save_file "${MODEL_NAME}" \
--model "${MODEL_PATH}" \
--tokenizer "${MODEL_PATH}" \
--n_proc 16 \
--api "openai"
# 步骤 3. 验证每个数据集的模型响应
export VERIFIER_API="<YOUR_API_KEY_HERE>"
export VERIFIER_URL="https://api.deepseek.com/v1"
PROJ_DIR="<YOUR_PROJ_DIR_HERE>"
DATA="<YOUR_DATA_HERE>" # 例如,docmath, frames, 2wikimqa, hotpotqa, musique, narrativeqa, pasper
python ${PROJ_DIR}/eval/${DATA}_verify.py \
--save_dir "${PROJ_DIR}/results/${DATA}" \
--save_file "${MODEL_NAME}" \
--judge_model "deepseek-chat" \
--batch_size 20
🔧 技术细节
该框架通过渐进式上下文扩展,在 RL 训练期间增强短上下文 LRMs。它由三个核心组件组成:
- 预热监督微调(SFT)阶段:初始化一个强大的策略。
- 课程引导的 RL 阶段:促进从短上下文到长上下文的稳定适应。
- 难度感知的回顾性采样机制:在不同阶段调整训练复杂度,激励策略探索。
通过在策略优化过程中战略性地利用组相对优势,引导 LRMs 学习有效的推理模式,这对于强大的长上下文基础和卓越的推理能力至关重要。
📄 许可证
本项目采用 Apache-2.0 许可证。
📚 引用
如果您发现本工作与您的研究或应用相关,请随时引用我们的工作:
@article{wan2025qwenlongl1,
title={QwenLong-L1: : Towards Long-Context Large Reasoning Models with Reinforcement Learning},
author={Fanqi Wan, Weizhou Shen, Shengyi Liao, Yingcheng Shi, Chenliang Li, Ziyi Yang, Ji Zhang, Fei Huang, Jingren Zhou, Ming Yan},
journal={arXiv preprint arXiv:2505.17667},
year={2025}
}



