模型简介
模型特点
模型能力
使用案例
license: apache-2.0 datasets:
- 通义智文/DocQA-RL-1.6K base_model:
- deepseek-ai/DeepSeek-R1-蒸馏-千问-32B tags:
- 长上下文
- 大推理模型 pipeline_tag: 文本生成 library_name: transformers
QwenLong-L1:基于强化学习的长上下文大推理模型
最新动态
-
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,这是一个包含1.6K文档问答(DocQA)问题的专用强化学习训练数据集,涵盖数学、逻辑和多跳推理领域。
简介
在这项工作中,我们提出了QwenLong-L1,这是一个新颖的强化学习(RL)框架,旨在促进LRM从短上下文熟练度向稳健的长上下文泛化过渡。在我们的初步实验中,我们展示了短上下文和长上下文推理RL训练动态的差异。
我们的框架通过在RL训练期间逐步扩展上下文来增强短上下文LRM。该框架包含三个核心组件:一个用于初始化稳健策略的预热监督微调(SFT)阶段,一个促进从短到长上下文稳定适应的课程引导RL阶段,以及一个难度感知的回顾采样机制,该机制调整各阶段的训练复杂性以激励策略探索。利用包括GRPO和DAPO在内的最新RL算法,我们的框架集成了结合基于规则和基于模型的二元结果奖励的混合奖励函数,以平衡精确率和召回率。通过在策略优化期间策略性地利用组相对优势,它引导LRM学习有效的推理模式,这对于稳健的长上下文基础和卓越的推理能力至关重要。
模型发布
我们发布了QwenLong-L1-32B,这是首个通过强化学习训练的长上下文大推理模型。在七个长上下文文档问答基准测试中,QwenLong-L1-32B超越了OpenAI-o3-mini和Qwen3-235B-A22B等旗舰LRM,性能与Claude-3.7-Sonnet-Thinking相当,展示了当前最先进LRM中的领先性能。
以下是评估结果。
环境要求
# 创建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
快速开始
以下是使用Transformers运行模型的方法:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Tongyi-Zhiwen/QwenLong-L1-32B"
# 加载tokenizer和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
# 准备模型输入
template = """请阅读以下文本并回答下面的问题。
<text>
$DOC$
</text>
$Q$
请按照以下格式回答:"因此,答案是(在此处插入答案)"。"""
context = "<你的上下文内容>"
question = "<你的问题>"
prompt = template.replace('$DOC$', context.strip()).replace('$Q$', question.strip())
messages = [
# {"role": "system", "content": "你是由阿里巴巴通义实验室创建的QwenLong-L1。你是一个乐于助人的助手。"}, # 需要时使用系统提示定义身份。
{"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)
处理长文档
对于总长度(包括输入和输出)显著超过32,768个token的输入,我们建议使用RoPE缩放技术来有效处理长文本。我们已使用YaRN方法验证了模型在高达131,072个token的上下文长度上的性能。
YaRN目前由多个推理框架支持,例如本地使用的transformers
和llama.cpp
,以及部署用的vllm
和sglang
。通常,有两种方法可以为支持的框架启用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
[!重要] 如果遇到以下警告
在'rope_type'='yarn'的`rope_scaling`中未识别的键:{'original_max_position_embeddings'}
请升级
transformers>=4.51.0
。
[!注意] 所有知名的开源框架都实现了静态YaRN,这意味着缩放因子与输入长度无关,可能会影响短文本的性能。 我们建议仅在需要处理长上下文时添加
rope_scaling
配置。 还建议根据需要修改factor
。例如,如果你的应用典型上下文长度为65,536个token,最好将factor
设置为2.0。
[!注意] 如果平均上下文长度不超过32,768个token,我们不建议在这种情况下启用YaRN,因为它可能会降低模型性能。
数据集
为了构建一个具有挑战性的RL数据集用于可验证的长上下文推理,我们开发了DocQA-RL-1.6K,该数据集包含1.6K个DocQA问题,涵盖三个推理领域:
(1) 数学推理:我们使用DocMath数据集中的600个问题,需要在长且专业的文档(如财务报告)中进行数值推理。对于DocMath,我们从其验证集中为训练和评估分别采样75%和25%的项目;
(2) 逻辑推理:我们使用DeepSeek-R1合成了600个多项选择题,需要对来自我们精选集合的法律、金融、保险和生产领域的真实世界文档进行逻辑分析;
(3) 多跳推理:我们从MultiHopRAG和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="<你的项目目录>"
export MASTER_IP="<你的主节点IP>" # ray主节点ip
export NNODES=4 # 总GPU节点数
export NODE_RANK=${RANK} # 当前节点的排名
export PORT=6382
export WANDB_API_KEY="<你的WANDB_API_KEY>"
export WANDB_PROJECT="QwenLong-L1"
export LLM_JUDGE=Y # 'Y': LLM JUDGE, 'N': 基于规则
export VLLM_ATTENTION_BACKEND=FLASH_ATTN
# 验证器
export VERIFIER_PATH="Qwen/Qwen2.5-1.5B-Instruct"
export VERIFIER_HOST="<你的验证器主机>"
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 "启动HEAD节点..."
ray start --head --port=${PORT}
check_ray_status
echo "Ray head节点成功启动"
else
echo "启动WORKER节点..."
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="<你的服务主机>" # 例如,127.0.0.1
export SERVE_PORT="23547"
PROJ_DIR="<你的项目目录>"
DATA="<你的数据>" # 例如,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="<你的API密钥>"
export VERIFIER_URL="https://api.deepseek.com/v1"
PROJ_DIR="<你的项目目录>"
DATA="<你的数据>" # 例如,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
引用
如果你发现这项工作与你的研究或应用相关,请随时引用我们的工作!
@article{wan2025qwenlongl1,
title={QwenLong-L1:基于强化学习的长上下文大推理模型},
author={万凡奇、沈伟洲、廖胜意、石迎成、李晨亮、杨子艺、张霁、黄非、周靖人、严明},
journal={arXiv preprint arXiv:2505.17667},
year={2025}
}


