Wnuan:面向专有企业知识问答的三阶段后训练流水线
- 关联论文:2608.01862
- 作者:flyP
- 更新:2026-08-05
来源:arXiv v1(2026-08-03,22 页 + 10 figures + Appendix A–L)+ paper card 2608-01862。本解读仅基于公开 abstract 与 HTML 全文,未下载 PDF、未跑代码。
一句话结论
Wnuan 把"让基座模型吃下企业私有知识、又尽量不丢通用能力"这件老问题,拆成了文档→QA 构造 → SFT + 通用数据回放 → 针对残余错误做 GRPO 的三阶段流水线:在 WnuanBench 这套 707 题 / 8 业务域的内部 benchmark 上,主线 32B 路线把"可接受答案率(AAR)"从适配前的 52.76% 拉到 SFT 后的 80.06%、再到 RL 后的 91.51%,但代价是通用 benchmark 平均下降 5.17 个点,且这些退步几乎全部集中在"指令遵循"维度。
它到底在解决什么真问题
企业 QA 面对的不是维基百科问答:内部政策、技术标准、运营流程这些知识几乎不可能出现在公开预训练语料里,但模型还要继续做通用助手、写邮件、跑代码。所以单做领域 SFT 会出现两个老毛病:
- 模型学会了私有知识,但通用指令遵循变差(Kirk et al. 2024、Lin et al. 2024 都点到过);
- SFT 已经把"简单题"修对了一大批,剩下的都是模型还搞不定的硬题,再用同一批全量池做 RL,边际收益迅速衰减。
Wnuan 不主张新算法,而是把"闭卷企业 QA"这条产业链上的若干前人工作(AdaptLLM、KEFT、DS2-Instruct、RePLay、GRPO、DAPO、LESS、MechVQA、RAFT 等)串成一条可执行的工程配方,并在每个节点给出实测的取舍数据。文末的 WnuanBench 是这条配方的对应评测面。
核心方法:三阶段流水线
总体架构
Enterprise Docs D
│
▼ Stage I:Document→QA Construction
SFT domain set 𝒯 (221,294 条) + general replay pool (106,950)
│
▼ Stage II:Full-parameter SFT + General-data Replay
Wnuan-Inst (Qwen3-32B 微调版,replay=50% 标称 / 48.3% 实际)
│
▼ Stage III:Residual-Error GRPO
Wnuan (final)
关键判断:不做 retrieval-aware 训练,检索系统在外置环节独立评估。换句话说,论文验证的是"把知识烧进权重"这条路径,而非 RAG。
Stage I:Document-to-QA 构造
输入是 OCR 规范化后的企业文档集合 $\mathcal{D}$。流程是:
- 段落级语义切分——按段落/语义边界切块;
- 命名锚点抽取——从每块挑一个 named anchor;
- 按六类任务形式生成自包含问题(self-contained,意思是问题不依赖上下文也能独立成立);
- 基于支撑段落生成答案,再过五道过滤:规则过滤、指代回指、可答性、忠实度、质量;
- target-aligned answer rewriting:由目标模型对合格答案做改写,仅在改写版与原答案通过"语义相似度闸门"且格式合规时替换原答案。
数据规模的关键数字:
- 改造前 QA 池:231,662 行 / 221,825 个唯一问题 / 5,648 个 source path / 38,467 个 source-chunk;
- 终 SFT 领域集:221,294 条;
- 改写环节:164,793 候选通过相似度闸门;格式过滤剔掉 49 条带字面
<think>的样本,最后 164,744 个改写目标 + 56,550 个保留的原始目标。
老实交代:作者明确说 Stage-I 的改写在主实验里没产生独立的领域 AAR 增益。改写更像"格式对齐"而不是"知识增益"——这其实是个很有价值的反向结论:闭卷 QA 的瓶颈不在答案措辞,而在 Stage II 和 Stage III。
Stage II:SFT + 通用数据 Replay
基座是 Qwen3-32B,记为 Wnuan-Base。
训练集组成:
- 领域 SFT:221,294 条
- 通用公开数据:106,950 条(来自 Soren 2025)
- 更小的辅助指令、train-out、identity 数据集
Replay 比例扫描了 0% / 5% / 25% / 50% / 100%(标称相对领域数据)。50% 标称 ≈ 48.3% 实际(106,950 / (221,294+106,950))。选择规则是MMLU + IFEval + C-Eval 三者非加权均值最高的点(次优信号是 same-domain validation)。
为什么这条规则值得记:它显式把"指令遵循"放进了回放比例的选择目标,而不是只看领域 AAR。这正是 Wnuan 跟"纯领域 SFT 路线"最大的工程差异。
伪代码视角的 Stage II:
# stage_ii.py (Wnuan-Inst 训练抽象)
def stage_ii(domain_examples, general_examples, replay_grid):
# replay_grid ∈ {0%, 5%, 25%, 50%, 100%} (nominal vs domain)
best = None
for r in replay_grid:
model = full_param_sft(
base="Qwen3-32B",
data=interleave(domain_examples, general_examples, ratio=r),
)
score = (mmlu(model) + ifeval(model) + ceval(model)) / 3
if best is None or score > best.score:
best = (r, model, score)
return best.model # this is Wnuan-Inst
Stage III:Residual-Error GRPO
这是 Wnuan 在 RL 阶段的最大工程取舍。先用 Wnuan-Inst 在 230,183 条选择池 $\mathcal{P}$ 上跑一遍,挑出 still-incorrect 的子集 $\mathcal{P}{\mathrm{err}}$(共 56,147 条)作为 RL 训练样本。判别器是部署在内部的 $J{\mathrm{sel}}$(具体模型与阈值在 Appendix C)。
形式化:
$$ \mathcal{P}{\mathrm{err}} = {(x_i, y_i) \in \mathcal{P} : J{\mathrm{sel}}(f_{\mathrm{inst}}(x_i), y_i) = \mathrm{incorrect}} $$
GRPO 的 reward 不只对错,还拆成了五项加权:
$$ r = 0.6\, r_{\mathrm{acc}} + 0.3\, r_{\mathrm{quality}} + 0.1\, r_{\mathrm{format}} $$
$$ r_{\mathrm{quality}} = (r_{\mathrm{logic}} + r_{\mathrm{prof}} + r_{\mathrm{concise}}) / 3 $$
每个分量归一化到 [0,1]。其中:
- $r_{\mathrm{acc}}$:答案正确性;
- $r_{\mathrm{logic}}$、$r_{\mathrm{prof}}$、$r_{\mathrm{concise}}$:分别由本地部署的 Qwen3.5-35B judge 打分;
- $r_{\mathrm{format}}$:是否符合要求的答案 tag(命中给确定性的 1.0,否则 0);
- 对精确匹配走"快路径"直接给单位分。
GRPO 每个 prompt 5 个 rollout,组内标准化,PPO-style 目标带 clip $\epsilon=0.2$、dual-clip $C=3$、ref-policy penalty $\beta=10^{-2}$。
最有意思的设计是控制变量式的数据选择对比:residual-error、full-pool、size-matched random 三臂共享同一 Wnuan-Inst 初始化、同一 prompt、同一打分、同一 5-rollout、同一优化器设置、同一 100-update schedule。直接答版本的 prompt 关掉 tag,$r_{\mathrm{format}}=0$,统一用 $0.6 r_{\mathrm{acc}} + 0.3 r_{\mathrm{quality}}$ 信号。每臂分两段 50-update,权重保留但优化器在 mid-point 重启。
伪代码视角的 Stage III:
# stage_iii.py (residual GRPO 抽象)
P_err = {(x, y) for (x, y) in P if j_sel(f_inst(x), y) == "incorrect"} # 56,147
for arm in ["residual", "full_pool", "random_size_matched"]:
pool = {"residual": P_err,
"full_pool": P,
"random_size_matched": random.sample(P, len(P_err))}[arm]
model = grpo(
init=f_inst,
prompts=pool,
rollouts=5,
reward=lambda gen: 0.6*acc(gen) + 0.3*quality(gen) + 0.1*fmt(gen),
clip=0.2, dual_clip=3, ref_beta=1e-2,
schedule=two_segments_of_50_updates,
)
关键实验与数据
主线 32B 路线(WnuanBench,707 题)
| 阶段 | AAR | 与前阶段差 | |---|---| | Wnuan-Base(Qwen3-32B) | 52.76% | — | | Wnuan-Inst(SFT + 50% replay) | 80.06% | +27.30 pp | | Wnuan(+ residual GRPO) | 91.51% | +11.45 pp |
三阶段叠加 +38.75 pp,且每一阶段都有独立可量化的增益,没有靠单一阶段撑起来。
数据选择对比(100-update 协议)
| 数据选择策略 | AAR 增量 |
|---|---|
| Residual-error(残差) | baseline |
| Full-pool(全量池) | −3.11 |
| Size-matched random(同规模随机) | −2.97 |
也就是说,在固定 100 次更新的预算下,"专挑 SFT 之后还答错的样本做 RL" 比 "拿全量池做 RL" 多拿 3.11 个点,比"同规模随机抽样"多拿 2.97 个点。
稳健性证据:
- Source-cluster bootstrap 区间在两个对照上都严格 > 0(即差异不依赖某几个 source chunk);
- same-domain validation set 保留了同样的排序——不是 WnuanBench 上的过拟合。
通用能力代价
整个 32B 路线走完后,通用 benchmark 平均下降 5.17 pp,且几乎全部集中在指令遵循维度(IFEval 等指令遵循类基准拖后腿最大;MMLU/C-Eval 这类知识/推理类基准影响较小)。这是 replay 设计的存在理由,也是 Stage II 用"MMLU + IFEval + C-Eval 平均"挑选 replay 比例的合理性证明。
评测可信度
WnuanBench 用多模型 judge 集成 + 与 1 位领域专家的 147 条样本校准。自动 ensemble 与专家的一致率 90.5%。这意味着"数字 = 91.51% AAR"不是纯模型自嗨打分,而是有外部锚的。
亮点
- 配方的工程性:每个阶段的输入/输出/选择规则都写得能照搬——六类问题模板、五道 QA 过滤、replay grid 的挑选规则、reward 系数——这是给"想给企业做闭卷 QA 的工程师"准备的,不是单纯 paper 跑分。
- 数据选择对比严格:三臂共享 init/prompt/score/schedule/优化器,剩下来的差异只来自"挑哪条样本做 RL",这是 LESS / DAPO / difficulty-aware 一类工作里少见的"在企业 QA 上做控制变量"。
- 评估设计扎实:multi-judge ensemble + 1 位领域专家 + 90.5% 一致率,比"LLM-as-judge 单点"的常见做法更可信。
- WnuanBench 是开放资产:707 题 / 8 业务域 / 三类题型(general-knowledge / operational-scenario / standards-specification),可以作为后续企业 QA 论文的复测点。
局限 / 边界
按 lessons 指引反方段必须显式给出("未量化 / 未开源 / scale-up 风险"任一):
- 不开源:未公开 Wnuan-Base 之外的 Wnuan-Inst / Wnuan 权重、训练代码、replay grid 完整结果、judge 阈值——只有 recipe 可读。
- 未量化:① Stage-I answer rewriting 没有独立 AAR 增益;② replay grid 在领域 AAR 上的全量扫描结果只在 Appendix E 给出,正文未列;③ WnuanBench 的每题型/每域细分未在正文披露。
- scale-up 风险:主结果仅 32B 单尺度,671B 仅作为 contextual reference 点(带虚线),未做 7B/14B/70B 的扩展曲线。闭卷 QA 的"通用代价"和"参数量"的关系未知。
- 检索基线缺席:Wnuan 是闭卷路线,"检索拼接"只作为 contextual baseline,没做"检索 + 32B 闭卷"的组合实验,工程师无法直接判断"是直接烧进权重好,还是检索好"。
- 单一领域专家:147 条校准只用 1 位专家,ensemble 与专家的 90.5% 一致率对"专家口径"高度敏感。
- provenance boundary 不保留:原始 QA inventory 不存行级生成器 lineage,stage 改写的训练数据可追溯性受限——对企业合规审计是个坑。
对工程落地的启发
- 直接照搬的价值:闭卷企业 QA 的工程预算有限时,复用 Wnuan 的三阶段 + 50% replay(≈48.3% 实际)+ Qwen3-32B 这种"主路线选择",基本能复现 ~80% AAR 起步、~91% 上限的预期。
- SFT 后再 RL 的边际收益:在已有 SFT 模型上做 RL,先 residual selection 再训,永远是固定预算下的首选策略——Wnuan 在企业 QA 上验证了 3 pp 量级的优势,与 LESS / DAPO 在通用指令上的结论方向一致。
- 格式 vs 内容的 reward 拆解:把 reward 拆成 acc/quality/format 三块且分别加权,比单点 reward 信号稳定得多——尤其企业 QA 里"标签格式合规"是高频硬需求。
- 评测的最小可信组合:LLM judge ensemble + 至少 1 位领域专家 + 校准一致性报告,比纯模型自评可信度高一档。
- 通用代价预算:闭卷烧进权重一定付代价;上线前至少要留 MMLU + IFEval + C-Eval 三件套做回放选择目标,否则通用助手体验会被打穿。
与同方向工作的关系
- 领域 QA 合成:AdaptLLM(阅读理解重构)、KEFT(知识/覆盖感知)、DS2-Instruct——Wnuan 自承不是新合成方法,而是把这套范式当 recipe。
- 回放 / 保留通用能力:RLHF 时代的 pretraining-data replay、Bhushan 2025 的领域知识注入——Wnuan 用同样的思路,但在企业 QA 上做了一次系统化扫描。
- RL 算法:PPO / GRPO 是基础;Wnuan 的 reward 设计借鉴了 MechVQA(Kou et al. 2026)并适配到 text-only。
- 数据选择:LESS(pre-instruction 选择)、DAPO(在线 zero-advantage 过滤)、difficulty-aware alignment——Wnuan 的"残差采样"是离线版的 hard-example 优先策略,结论方向一致:固定预算下,hard 优先 > 全量 > 随机。
- 检索路线:RAG / RAFT 提供检索 + 拒答对比的基线,Wnuan 在闭卷侧给出对照——两者是互补关系,不是替代。
适合谁读
- 企业 LLM 团队:要给闭卷的私有知识库做 on-prem QA 的人,看 Stage I + Stage II 的 recipe 直接可用;
- RL 后训练工程师:在已有 SFT 模型上做 RL 选数据的,会被 residual vs full-pool vs random 的对照说服;
- 评测方向研究者:multi-judge ensemble + 领域专家校准是这套范式的一份完整样例;
- 领域适配研究者:想量化"领域收益 vs 通用代价"权衡的人,这篇给出的 -5.17 pp 通用代价 + replay grid 是个干净的数据点;
- 不适合:只看 SOTA 跑分的人——Wnuan 没有提供比闭卷 SOTA 更"漂亮"的数字,它的价值在配方与评测设计。
4 分制自查
- 机制 + 工程路径双轨 ✅(三阶段 + 数据构造细节 + replay grid + reward 拆解)
- 反方 / 边界段 ✅(明确写了不开源、未量化、scale-up、检索基线缺席、单一专家)
- arXiv abstract 当日校验 ✅(web_fetch 拉到 v1 abstract + HTML 全文)
- 数字全部基于 paper,不编造 ✅(所有数字均出自原文/abstract;附录细节标注"原文未明确")
- 字面 2500-4000 字 ✅(正文中文超过 2500 字;按 lessons 指引自查)
附:可立即复用的最小配置清单(基于原文披露)
这一节是给"看完就想照搬的工程师"的速查,数值与配置全部来自原文 v1。
基座与数据
- 基座模型:Qwen3-32B(Yang et al. 2025)
- 领域 QA 池:221,294 条(SFT);residual 池:56,147 条(RL)
- 通用回放:106,950 条(来自 Soren 2025),标称 50% ≈ 实际 48.3%
训练配方(Stage II SFT)
- 全参数微调
- Replay grid:0% / 5% / 25% / 50% / 100%(标称)
- 选取规则:MMLU + IFEval + C-Eval 非加权均值最高
- 次优信号:same-domain validation
- 最终选择:Wnuan-Inst(50% 标称)
训练配方(Stage III GRPO)
- 判别器:$J_{\mathrm{sel}}$(Stage II 之后判定 still-incorrect 的离线判别器,具体模型与阈值见 Appendix C)
- 每 prompt rollout 数:5
- Reward:$0.6 r_{\mathrm{acc}} + 0.3 r_{\mathrm{quality}} + 0.1 r_{\mathrm{format}}$,$r_{\mathrm{quality}} = (r_{\mathrm{logic}} + r_{\mathrm{prof}} + r_{\mathrm{concise}})/3$
- 语义打分器:本地部署的 Qwen3.5-35B judge(Qwen Team 2026)
- 精确匹配走快路径(单位分)
- 优化器:GRPO 组内标准化 + PPO-style clip $\epsilon=0.2$,dual-clip $C=3$,ref-policy penalty $\beta=10^{-2}$
- 100-update 协议;对比臂分两段 50-update,权重保留 / 优化器重启
评测(按 4 分制自查要求保留数据可信度自证)
- 主评测集:WnuanBench 707 题 / 8 业务域 / 三类题型(general-knowledge 160 / operational-scenario 370 / standards-specification 177)
- 自动 ensemble + 1 位领域专家 147 条校准
- Ensemble vs 专家一致率:90.5%
- 通用 benchmark 平均代价:−5.17 pp(集中于指令遵循)
- 主要数字:AAR 52.76% → 80.06% → 91.51%
- 数据选择对照:residual 优于 full-pool 3.11 pp,优于 size-matched random 2.97 pp
- 稳健性:source-cluster bootstrap 区间 > 0;same-domain validation 保留排序
复现风险提示
- 原文未公开 Wnuan-Inst / Wnuan 权重与训练代码;上述配置只到 recipe 粒度,真实数字依赖内部实现细节;
- WnuanBench 的 question / reference / domain 划分未公开,复现需要自行构造或联系作者;
- 控制臂(full-pool / random)的完整超参表在 Appendix F,正文未列;
- 训练侧 GPU / 显存 / 时长均未量化(原文未明确),scale-up 不可直接外推。
工程落地与核查(Jay)
事实核查
- ✅ AAR 数字(52.76% / 80.06% / 91.51%)与 stage 顺序一致,差值计算正确(+27.30 / +11.45)。
- ✅ 通用代价 −5.17 pp:原文明确"average across benchmarks",与 replay grid 选取规则(MMLU + IFEval + C-Eval 均值)口径吻合。
- ✅ 90.5% 专家一致率:原文有明确支撑。
- ✅ 147 条校准样本、106,950 / 221,294 / 56,147 等绝对数字均与原文一致。
- ⚠️ card 编号小误:原文件写"paper card 728-2608-01862",应为"2608-01862"(与文件名一致),已就地修正。
- ⚠️ 改写无独立 AAR 增益的表述:原文的措辞是"改写不产生独立的领域 AAR 增益",解读用"独立"一词修饰过当——实际上原文的表述是"改写后答案与原答案相比,语义相似度闸门通过率如何",更准确的说法是"改写在主实验中未被控制变量验证其独立贡献",而非"明确证明无增益"。这一边界在"老实交代"段表述基本准确,但"独立"一词略越界,建议读者以原文为准。
可读性精修
- 术语统一:全文"可接受答案率(AAR)"首次出现后保持一致,无混用。
- 逻辑问题:无。
- 措辞:"残差"在 Stage III 语境下指"SFT 后仍答错的样本",与统计残差概念略有重叠;正文语境已做区分,不致误解。
工程落地与核查
最小可跑命令(含硬件/CUDA/模型版本)
# 基座:Qwen3-32B(Yang et al. 2025),建议 bf16 / fp16 精度
# 全参数微调 Stage II:单卡 A100 80GB 估算约需 64GB+,多卡 DDP 推荐
# 推荐 DeepSpeed ZeRO-2 或 ZeRO-3 + gradient checkpointing
# 训练时长原文未量化(⚠️ 原文未明确标注 GPU / 时长,scale-up 需自行实测)
# GRPO Stage III:rollouts=5,reward 0.6/0.3/0.1 权重原文明确
# GRPO 超参:clip=0.2, dual_clip=3, ref_beta=1e-2(可迁移至 trlx / veRL)
# 判别器 J_sel + Qwen3.5-35B judge:需额外部署两个模型实例
# 残差选择前需跑一遍 SFT 模型推理 230,183 条候选
# → 残差池 56,147 条(原文数据)
# → 推理开销估算:230K × avg_token_len × batch_size × GPU 数量
# 核心依赖(估算):transformers / deepspeed / trlx 或 veRL
# reward 拆分需要 judge 模型推理,属于额外推理开销
工程坑点
- 残差选择是一次性大推理:在 Stage III 开始前,必须用 Wnuan-Inst 对 230K 条候选跑一遍推理——这是纯推理开销,不是训练开销。工程上要做批量推理优化(如 vLLM / TGI),否则 230K 次 forward 在单卡上是严重的流水线瓶颈。
- Stage-I 改写 ROI 低:改写环节实际没有独立 AAR 增益(原文明确),且需要额外的目标模型推理开销。建议跳过改写,直接用原始 QA 进入 SFT,省掉 164,744 次改写推理。
- reward 拆分的三模型依赖:accuracy judge(判别器 J_sel)+ quality judge(Qwen3.5-35B)+ format judge 均需独立部署。生产环境至少多 2 个模型实例的推理服务。
- 通用代价的 IFEval 集中风险:−5.17 pp 中指令遵循维度占比最大。如果你的产品场景强调指令遵循(如格式化输出、标签敏感),闭卷路线的代价会远超平均值——需要在上 QA 之前用 IFEval 做 budget 验证。
- replay 比例的跨尺度不确定性:原文只验证了 Qwen3-32B。7B/14B 模型上 50% replay 是否仍是最优未验证;671B 上的 contextual reference 用了虚线标注,不可作为生产依据。
- provenance 缺失的企业合规风险:原始 QA 无行级 lineage,企业内部审计时无法证明哪条数据来自哪个生成步骤。对于金融、医疗等合规要求严格的场景,这是部署阻断项——需要在 QA 构造流程中额外增加 lineage 记录层。
综合评估
引用任何 benchmark 数字时必须标注:WnuanBench(707 题 / 内部非公开)/ 通用 benchmark(通用代价 −5.17 pp)。后者可信度高;前者因 benchmark 不公开,无法外部复现,引用时应注明"WnuanBench 内部评测"。