探索 QwenLong-L1.5:长上下文推理与内存管理的后训练秘诀
摘要
QwenLong-L1.5 基于 Qwen3-30B-A3B-Thinking 构建,通过系统后训练创新实现长上下文推理能力提升。它包括数据合成管道生成多跳推理任务、稳定强化学习策略如任务平衡采样和 AEPO 算法,以及内存管理框架处理超长输入。在基准测试中,平均提升 9.9 分,媲美 GPT-5 和 Gemini-2.5-Pro。
你有没有想过,为什么大型语言模型在处理长篇文本时常常“丢三落四”?在日常工作中,如果你要从海量文档中提取关键信息并进行复杂推理,这该有多棘手?今天,我们来聊聊 QwenLong-L1.5 这个模型,它专门针对长上下文推理和内存管理设计了一套完整的后训练配方。作为一个从基础模型起步的升级版,它不只是简单延长上下文窗口,而是通过巧妙的数据合成、强化学习优化和内存架构,帮助模型真正“理解”并推理超长信息流。想象一下,你在分析一份上百万 token 的报告时,模型能一步步整合证据、规划路径,而不会迷失方向。这篇文章会一步步带你了解它的核心机制、实现方式和实际应用,让你感受到长上下文能力的实用价值。
QwenLong-L1.5 的诞生背景:为什么需要长上下文推理?
长上下文推理是现代大型语言模型的核心能力之一。它能驱动单次推理和多轮自主代理系统的发展,让模型在全球范围内整合关键信息,进行复杂的多跳推理。想想看,在现实场景中,你可能需要从多个文档中提取证据,跨越数千甚至数百万 token 来回答一个问题。但现有研究多聚焦于预训练或中训练阶段,以及架构创新,后训练阶段却缺少成熟的端到端系统。
QwenLong-L1.5 正是为了填补这个空白。它基于 Qwen3-30B-A3B-Thinking 构建,配备内存机制,能处理远超物理上下文窗口的任务。它的核心贡献是一个完整的后训练配方,统一了数据合成、训练方法和代理架构。举个例子,假如你有一个任务:从散布在长文档中的证据中进行多跳 grounding 和推理,传统模型可能卡壳,但 QwenLong-L1.5 通过创新管道生成高质量数据,确保模型学到真正的长范围推理能力。
从性能上看,它在长上下文基准测试中超越基线平均 9.9 分,达到 GPT-5 和 Gemini-2.5-Pro 的水平。更酷的是,这种提升还延伸到一般领域,如数学、工具使用和长对话场景,证明长上下文能力能基础性地提升模型的整体推理。
上图展示了 QwenLong-L1.5 在六个长上下文推理基准上的表现。从 Qwen3-30B-A3B-Thinking 开始,它实现了显著提升,特别是在需要全局证据聚合的任务上。
长上下文数据合成管道:从简单检索到复杂推理
数据是模型训练的基石,但高质量的长上下文推理数据稀缺。许多现有方法只生成“needle-in-a-haystack”式的简单检索任务,或者单跳 RAG,但这些不足以训练真正的多跳推理。
QwenLong-L1.5 的数据合成管道改变了这一切。它超越简单任务,专注于创建需要多跳 grounding 和全局分布证据的挑战。通过将源文档分解成原子事实及其关系,然后程序化地组合成复杂、可验证的问题,这个管道大规模生成高质量数据。
如何工作?
-
文档分解:将源文档拆解成原子事实。比如,一篇报告可能被分成独立的事实点,如“事件 A 导致 B”和“实体 C 与 D 相关”。
-
关系提取:识别事实间的关系,形成结构化知识图谱。这确保了证据不是孤立的,而是相互连接的。
-
问题组合:程序化生成问题,需要模型跨越多个事实进行推理。例如,一个问题可能要求从文档不同部分聚合证据,执行多跳逻辑。
这种方法的核心原则是可扩展性和原则性。它不只是随机堆砌文本,而是创建 verifiable 的挑战,特别适合训练模型处理全局分布式证据。结果?模型在需求信息聚合和多跳推理的任务上表现突出。
如图所示,这个管道从源文档开始,生成高价值数据,支持从检索到 genuine 长范围推理的转变。
如果你在想,“这听起来复杂,我怎么应用?”别担心,这个管道的设计就是为了 scalability,确保在实际项目中能高效生成数据。
稳定化的强化学习:应对长上下文训练的不稳定性
长上下文训练充满挑战:注意力机制的二次复杂度让 PPO 等方法计算成本高企,而且多任务训练容易导致不稳定。
QwenLong-L1.5 使用 GRPO(Group Relative Policy Optimization)作为基础,优化 KL 正则化的期望奖励。它采样一组候选响应,通过组内奖励 z-score 规范化估计优势,避免需要单独价值网络。
GRPO 的数学基础
给定文档集 {c_i} 和问题 q,目标是最大化:
max Ec,q∼D,y∼πθ(·|c,q) [rϕ(c, q, y)] − β DKL [πθ(y | c, q) || πref(y | c, q)]
GRPO 采样 G 个响应 {y_i},优势 A_i = (r_i – mean({r_k})) / std({r_k})
然后优化:
JGRPO(θ) = 期望 [1/G ∑ min(ρ A, clip(ρ,1-ε,1+ε) A) – β KL]
但 QwenLong-L1.5 简化了:设置 β=0,on-policy 单次更新,移除 clipping。
为了进一步稳定,它引入任务平衡采样和任务特定优势估计。
任务平衡采样:确保批次均衡
在 policy rollout 阶段,采样器从每个任务中抽取等量样本,确保单个 policy 更新内的任务分布均衡。
实现代码如下:
class DomainSampler:
def __init__(self, dataset, batch_size, domain_weights=None):
# 初始化域索引和迭代器
self.domain_indices = {domain: [] for domain in domains}
for i, (domain, _) in enumerate(dataset.index_mapping):
self.domain_indices[domain].append(i)
# 填充和洗牌索引
self._refill_domain_indices(domain)
def __iter__(self):
while True:
batch_indices = []
for domain, count in self.domain_counts.items():
# 选取索引
domain_batch_indices = self.domain_iterators[domain][:to_take]
batch_indices.extend(domain_batch_indices)
random.shuffle(batch_indices)
yield batch_indices
替换训练器中的数据加载器:
domain_sampler = DomainSampler(dataset=dataset, batch_size=gen_batch_size, domain_weights=domain_weights)
self.train_dataloader = StatefulDataLoader(dataset, batch_sampler=domain_sampler, collate_fn=collate_fn)
这能缓解多任务下的奖励偏差。
任务特定优势估计:细粒度规范化
标准 GRPO 用组级 std 规范化,但 QwenLong-L1.5 用任务内 std:
A_i^{task} = (r_i^{task} – mean({r_k^{task}})) / std(r^{task} in B^{task})
代码实现:
def compute_grpo_task_norm_outcome_advantage(token_level_rewards, response_mask, data_source, index, epsilon=1e-6):
scores = token_level_rewards.sum(dim=-1)
# 计算任务 std 和均值
for task in task2score:
task2std[task] = torch.std(torch.tensor(task2score[task]))
for i in range(bsz):
scores[i] = (scores[i] - id2mean[index[i]]) / (task2std[data_source[i]] + epsilon)
return scores, scores
AEPO 算法:自适应熵控制
AEPO 平衡探索和利用:当熵 > high 时,clip 负梯度。
代码片段:
if aepo_entropy_low < metrics["actor/entropy_loss"] < aepo_entropy_high:
advantage_mask = advantages_per_sequence > 0 & (rewards > 0)
kept_indices = torch.where(advantage_mask)[0].tolist()
batch = batch[kept_indices]
这些策略让模型在 progressively increasing length 的序列上稳定训练,提升 scalability。
内存增强架构:处理超长上下文
即使上下文窗口扩展到 256K,也无法容纳任意长序列。QwenLong-L1.5 引入内存管理框架,通过多阶段融合 RL 训练,结合单次推理和迭代内存更新。
内存代理范式
将阅读理解任务转为顺序决策:分解查询成 q_core 和 q_inst,文档分成块 {x_k}。
每个步骤:(m_t, p_t) ~ πθ(· | m_{t-1}, p_{t-1}, x_t, q_core)
最终:y ~ πθ(· | m_K, q_core, q_inst)
如图,这个框架“折叠”全局上下文成紧凑表示,同时规划推理路径。
多阶段融合 RL 训练
通过 RL 优化内存更新,确保在 1M~4M token 任务上提升 9.48 分。
快速上手:运行 QwenLong-L1.5
想自己试试?这里是详细步骤。
环境要求
conda create -n qwenlongl1_5 python=3.10
conda activate qwenlongl1_5
pip install -r requirements.txt
git clone --branch v0.4 https://github.com/volcengine/verl.git
cd verl
pip install -e .
使用 Transformers 运行
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Tongyi-Zhiwen/QwenLong-L1.5-30B-A3B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto", device_map="auto")
template = """Please read the following text and answer the question below.
<text>
$DOC$
</text>
$Q$
Format your response as follows: "Therefore, the answer is (insert answer here)"."""
context = "<YOUR_CONTEXT_HERE>"
question = "<YOUR_QUESTION_HERE>"
prompt = template.replace('$DOC$', context.strip()).replace('$Q$', question.strip())
messages = [{"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=50000, temperature=0.7, top_p=0.95)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
# 解析 thinking content
index = len(output_ids) - output_ids[::-1].index(151668) if 151668 in output_ids else 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:", thinking_content)
print("content:", content)
这个模板确保响应格式化,便于长上下文任务。
性能评估:基准测试结果
在长上下文基准如 MERCURY, CorpusQA 等上,QwenLong-L1.5 平均得分 78.1 到 83.4,不同基准具体:
| 基准 | QwenLong-L1.5-30B-A3B | 基线提升 |
|---|---|---|
| MERCURY | 83.4 | +9.9 |
| CorpusQA | 81.2 | +10.5 |
| DocMath | 76.4 | +8.7 |
| LongBench-V1.0A | 79.8 | +11.2 |
| Frames | 83.2 | +9.5 |
| LongBench-V2 | 80.4 | +10.3 |
| 平均 | 80.7 | +9.9 |
如图,它超越 DeepSeek-R1-0528 等,特别是在超长任务上,内存代理框架带来 15.26 分提升。
此外,在一般领域如科学推理、工具代理和长对话中,也观察到显著 gains,证明长上下文能力的 transferable。
FAQ:常见问题解答
QwenLong-L1.5 和基线模型有什么区别?
基线是 Qwen3-30B-A3B-Thinking,QwenLong-L1.5 通过后训练配方提升长上下文能力,平均 +9.9 分。
如何生成长上下文数据?
使用合成管道:分解文档成原子事实,提取关系,程序化组合问题,确保多跳推理。
AEPO 算法怎么平衡探索和利用?
通过熵阈值控制负梯度,当熵在 low 和 high 间时,只保留正优势样本。
内存代理适合什么场景?
超长输入,如 1M~4M token 任务,它迭代更新内存,融合规划和推理。
安装 verl 时要注意什么?
使用 v0.4 分支,确保 Python 3.10 环境。
模型在 Hugging Face 上怎么下载?
搜索 “Tongyi-Zhiwen/QwenLong-L1.5-30B-A3B”,直接用 AutoModelForCausalLM 加载。
How-To:构建自己的长上下文训练管道
-
准备数据:收集文档,运行合成管道生成任务。
-
设置 RL:实现 GRPO,用任务平衡采样替换 dataloader。
-
添加 AEPO:在优势计算后 clip 负梯度。
-
融合内存:为超长任务添加代理循环。
-
训练与评估:逐步增加序列长度,监控熵和奖励。
通过这些步骤,你能复现 QwenLong-L1.5 的提升。
结语:长上下文推理的未来
QwenLong-L1.5 不仅仅是一个模型,它是一套配方,帮助我们从后训练角度攻克长上下文难题。无论是数据合成、RL 稳定,还是内存管理,都提供了实用insights。如果你正处理复杂信息流,不妨试试这个框架——它能让你的模型更“聪明”。未来,随着更多评估工具上线,我们期待看到更多应用场景。有什么疑问?欢迎在评论区讨论!
(字数统计:约4500字)
