长上下文开放式睡眠报告生成:难点与训练方案
如何让模型从数周或数月的睡眠记录中找准事实、解释可能原因,并给出安全且可执行的个性化建议。
从数周到数月的睡眠记录中找准事实、解释可能原因,并给出安全可执行的个性化建议:长上下文开放式睡眠报告生成的难点、推理图教师数据、weighted DPOP 与细粒度 GRPO 训练方案。
赵郅昊 / 巫杰枫 / 张潮

目录
1. 引言
想象一个周一早晨。John 被闹钟叫醒时,第一反应是:“昨晚明明睡够了,为什么还是这么累?”
他打开 Speediance 的睡眠记录。过去一个月里,他有几晚因为加班只睡了五六个小时,周末又一口气补到九个小时。有时总时长看起来正常,夜里却反复醒来。出差、晚间训练、咖啡和聚餐也穿插在这个月里。数据清楚记录了每一晚,但面对几十项指标,他仍然不知道最值得关注的模式是什么,也不知道今晚应该先改变哪一件事。
这正是自动生成睡眠报告最难、也最有价值的部分。模型需要从长时间、多维度的数据中找出重要模式,结合生活背景解释可能原因,再把复杂判断转成安全、具体、可以执行的建议。为了让模型看准数字、理清关系并说清行动,我们研究了长上下文开放式睡眠报告生成任务。
2. 问题定义
我们的任务是:根据结构化睡眠数据,生成个性化的开放式睡眠报告。“开放式”表示模型不是从固定选项中选择答案,而是需要自行组织证据、解释和建议。
2.1 输入
| 数据类别 | 主要内容 | 示例 |
|---|---|---|
| 每日用户数据 | 人口学信息、每晚睡眠日志、工作日与休息日的作息差异 | 上床和起床时间、入睡潜伏期、夜间清醒次数、入睡后清醒时长、小睡记录 |
| 聚合统计指标 | 从多日记录计算出的汇总特征 | 平均睡眠时长、少于 7 小时的夜数、周末起床时间偏移、睡眠中点偏移、睡眠效率、清醒次数、小睡次数 |
| 可选用户背景 | 可能帮助解释睡眠变化的生活信息 | 酒精和咖啡因摄入、生活节律、训练安排、旅行和关键日常事件 |
入睡后清醒时长也称为 WASO(wake after sleep onset),指首次入睡后到最终醒来之间保持清醒的总时长。
2.2 输出
| 报告字段 | 目标 | 质量要求 |
|---|---|---|
| 洞察(insight) | 说明最重要的睡眠模式 | 引用准确数据,区分偶发事件和持续模式 |
| 归因(etiology) | 解释可能原因 | 结合多个指标,使用有边界的因果表达 |
| 建议(recommendation) | 给出下一步行动 | 安全、具体、与数据直接相关,并优先列出最重要的 1–2 项 |
3. 任务难点
3.1 从长上下文表格中精确提取信息
这个任务表面上是把数据转成报告,实际却需要多层能力。输入可能包含数天到数月的每日睡眠日志,以及从这些日志计算出的多种统计指标。模型必须在很长的上下文中准确定位并提取关键信息。
以计数为例,任务可能要求模型回答:“过去 N 天中,睡眠时长少于 7 小时的夜晚有多少个?”这看似只需逐日检查并累加,但在我们的测试中,前沿闭源模型 GPT-5.5 在这类任务上的准确率约为 87%。常见错误包括漏掉某些日期、误判恰好 7 小时这样的边界值,以及因上下文太长而忽略前段记录。
代码规则可以计算这些数量,并把结果直接放进提示词,但这种方法有三个根本限制:
- 无法覆盖所有提取需求。 精确信息不只有计数,还包括连续变量的极值、趋势变化和跨字段条件。我们无法提前为每种需求编写规则。
- 泛化能力有限。 真实应用中的数据结构、字段定义和异常标准都可能变化,硬编码规则很难灵活适配。
- 会切断推理链。 计数通常不是终点。模型还要判断连续多天睡眠不足是否形成了稳定模式,并把这个判断连接到可能原因和建议。
如果把关键特征提取全部交给规则,模型就无法在自己的推理过程中建立中间表示。这会限制后续分析的深度和质量。
3.2 开放式推理与准确归因
从原始数据中找出重要睡眠问题,远不只是“查表”。模型需要综合多个维度的证据,而不是只看一个指标。
推理较浅的模型常使用一步因果关系。例如,它看到睡眠效率较低,就直接建议“早点上床”;看到睡眠时长不足,就只建议“增加睡眠时间”。这类建议在真实场景中经常失效。
睡眠效率说明了这个问题:
| 情况 | 数据表现 | 更可能的核心问题 |
|---|---|---|
| A | 只睡 4.5 小时,卧床时长正常 | 睡眠时长不足 |
| B | 已睡 7.5 小时,但卧床 10 小时 | 可能存在睡眠碎片化、频繁醒来或浅睡比例较高 |
如果模型只看到“效率低”就建议增加睡眠时长,这条建议在情况 B 中不仅无效,还可能鼓励用户继续延长卧床时间,从而加重碎片化。
高质量报告需要三种能力:
- 多指标交叉验证。 结合睡眠时长、效率、清醒次数和 WASO 等指标,判断低效率更可能来自哪类问题。
- 建立有边界的因果链。 从现象追溯到可能的中间机制,如碎片化、睡眠机会不足或入睡困难,再给出对应建议。报告应说明证据支持“可能原因”,不能把相关性写成已证实的医学诊断。
- 做出个性化取舍。 优先推荐最关键的 1–2 项行动,而不是罗列所有可能建议。
4. 训练难点
4.1 获得高质量、符合知识的 SFT 教师数据
SFT(supervised fine-tuning,监督微调)让目标模型学习高质量输入和答案之间的对应关系。直接使用闭源教师模型的原始回答会带来两个问题。
第一,教师模型可能不稳定地使用领域知识。例如,它可能对“多少睡眠时长属于不足”或“哪些因素会影响某个指标”给出不一致的判断。
第二,推理深度不稳定。我们的实验中有些教师样本包含较深的推理路径,但这种质量不能稳定复现。概念边界的不确定性也会降低可审计性。例如,严谨的医学规则可能把 7 小时作为睡眠不足的分界点,但教师模型对 7 小时 10 分钟这类临界值可能给出不同判断。模型一旦在概念判断上摇摆,后续推理也很难保持严谨。
4.2 为开放式报告设计有效奖励
我们的训练流程先做 SFT,再做基于偏好的 weighted DPOP,最后做 GRPO 强化学习。
数学、代码或多步智能体任务常有明确且可验证的中间步骤。开放式报告没有唯一的写作顺序,而且一篇报告中的不同部分可能质量不同。如果整篇报告只得到一个总奖励,那么洞察、归因和建议中的所有 token 都会共享同一个信号。我们的早期实验显示,这种全局奖励效果很差。
核心问题是:如何把反馈送到真正出错的数字、文本片段、句子或章节,同时不误伤报告中已经正确的内容。
5. 方案总览
我们的方案连接了知识构建、教师数据生成和学生模型训练三个阶段。
- 从睡眠资料中提取推理图。推理图把观察、模式、假设、安全限制和建议连接成可检查的路径。
- 根据用户指标激活相关概念节点,把经过筛选的推理路径放进教师模型的提示词。教师模型再通过“起草—批评—修订”的多轮反思生成训练样本。
- 依次训练学生模型:SFT 学习高质量示例,weighted DPOP 学习对更好答案的偏好,细粒度 GRPO 直接优化当前模型采样出的报告。

6. 用推理图生成 SFT 教师样本
我们先从睡眠领域资料中抽取概念及其关系。例如,一条路径可以从“观察到多次夜间清醒”出发,连接到“睡眠碎片化模式”,再连接到几个受数据约束的原因假设,最后生成对应建议。安全节点会阻止模型把有限证据写成确定诊断。
当用户指标满足预设条件时,系统先激活初始概念,再沿图激活后续节点。教师模型得到的是与当前用户相关的推理路径,而不是一份无差别的睡眠知识清单。随后,教师模型通过多轮自我反思检查数字、推理和建议,逐步修订草稿。这个过程提高了教师样本的稳定性,也让关键判断更容易审计。
7. 用 weighted DPOP 定位偏好反馈
SFT 学习教师答案的条件分布,但训练后的模型仍可能写错数字,或只学到教师的整体风格而忽略细节。我们因此引入 weighted DPOP。它是直接偏好优化(DPO)的一种变体,并加入正样本约束。它的核心原则是:教师真正修改过的文本片段应获得更强的学习权重,整篇报告中的其他 token 不应平均分担同样的反馈。
一篇报告通常较长,而且三个主要字段承担不同任务。insight 描述模式,etiology 解释可能原因,recommendation 给出行动。即使同一字段内部,也可能同时讨论睡眠节律、睡眠时长和医学阈值。一个全局奖励会稀释局部信号,也会惩罚本来正确的句子。
7.1 偏好样本与多层权重
我们先选择错误类型,再构造 chosen–rejected 偏好对。错误类型包括数字扰动、教师完整修订、推理错误注入,以及格式或安全错误。规则根据错误类型选择掩码范围,再把权重分配到 token、文本片段、句子和章节。

对第 个偏好样本,我们定义:
其中, 是输入提示词, 和 分别是 chosen(较好)和 rejected(较差)回答, 是偏好对类型, 是教师标出的修改片段集合, 是样本级权重。
第 个 token 的权重为:
一个 token 可能同时属于多个层级。系统取所有适用权重中的最大值。
| 层级 | 覆盖范围 | 权重 | 作用 |
|---|---|---|---|
| 背景 | 所有回答 token | 0.05 | 保留最小的全局学习信号 |
| 同章节 | 与修改片段同属 insight、etiology 或 recommendation | 0.25 | 关注同一语义字段 |
| 同句 | 与修改片段位于同一句 | 0.60 | 强化局部上下文 |
| 修改片段 | 教师直接标出的文本 | 低 0.70;中 0.85;高 1.00 | 重点修复具体错误 |
样本级权重 取该偏好对中最高的错误等级:
| 等级 | 典型问题 | |
|---|---|---|
| 高 | 1.20 | 数字事实错误;医疗或安全过度断言;主要原因解释错误;建议方向明显错误 |
| 中 | 1.00 | 漏掉关键指标;建议太宽泛;缺少时间范围;重要但不致命的推理遗漏 |
| 低 | 0.80 | 措辞、结构或轻微完整性问题 |
举例来说,rejected 回答写“18 个夜晚少于 7 小时”和“这证明失眠导致了这个模式”,chosen 回答则写“13 个夜晚”和“这可能反映了睡眠机会不足和作息漂移”。两个修改片段都属于高等级,所以 。
数字“13”和“18”的权重都是 1.00。同句中的其他 token 获得 0.60,同字段但与修改句无关的内容获得 0.25,未修改字段中的句子只获得 0.05。对于 numeric_perturbation 偏好对,掩码会更窄:系统只提高真正变化的数字 token 权重,不惩罚同句的其他内容。
7.2 优化目标与正样本约束
Weighted DPOP 的训练目标为:
和 分别表示策略模型与参考模型对 chosen、rejected 回答的加权对数概率差。第一项让策略模型更偏好较好的回答,并降低对较差回答的偏好。
Token 权重通过加权对数概率进入目标:
第二项是正样本约束,其中 。我们曾观察到一种退化现象:chosen 和 rejected 的对数概率都下降,只是 rejected 下降得更多。偏好差虽然变大,模型对正确答案的信心却也下降。这个约束在策略模型对 chosen 回答的信心低于参考模型时生效,从而阻止这种负向优化。
7.3 DPOP 阶段结果
| 训练阶段 | 洞察 | 归因 | 建议 | 均分 |
|---|---|---|---|---|
| SFT 起点 | 4.5717 | 4.4717 | 4.6733 | 4.5722 |
| DPOP 100 步 | 4.6017 | 4.5800 | 4.7083 | 4.6300 |
8. 用细粒度 GRPO 优化当前模型输出
DPOP 是离策略方法,也就是它不直接优化当前策略模型刚刚采样的输出。它的效果还依赖已经构造好的偏好数据。DPOP 改进了报告,但各项评分与 GPT 仍有小幅差距。因此,我们从 DPOP 检查点继续进行在线策略训练:让当前模型生成报告,再由教师批评模型给出局部修订和奖励。
早期 GRPO 实验给每篇报告一个总分。这个方案在长上下文开放式报告上表现很差,损失也不稳定。于是,我们采用与 weighted DPOP 相似的局部设计。评估器先标出好的文本片段、差的文本片段和遗漏项,再把每个片段的总奖励分摊到对应 token。

8.1 遗漏项惩罚
missing_obligations 表示报告漏掉了必须回答的内容。理想情况下,系统应在最适合插入缺失内容的位置分配奖励。但缺失内容没有对应 token,因此无法直接定位。我们采用一个折中方案:把惩罚分配到报告结束区域和最后一句附近。
其中, 是第 个 token 因遗漏项得到的惩罚, 是基础惩罚强度,目前设为 0.85。 是教师批评模型判断的遗漏严重度, 把严重度映射为数值。
| 严重度 | 相对惩罚强度 | |
|---|---|---|
| 低 | 0.35 | 最弱 |
| 中 | 0.70 | 中等 |
| 高 | 1.00 | 强 |
| 严重 | 1.20 | 最强 |
表示 token 从结束边界区域分到的惩罚份额,区域外取 0,区域内所有份额之和为 1。 对最后一句区域采用同样定义, 控制这部分惩罚的相对强度。
8.2 Token 级训练目标
得到 token 级奖励后,最终优化目标为:
正奖励提高对应 token 的生成概率,负奖励降低对应 token 的生成概率。分母按奖励绝对值归一化,使不同样本中的奖励规模更容易比较。
9. 最终结果
我们比较了 SFT 检查点、从该检查点训练 100 步得到的 DPOP 模型、细粒度 GRPO 模型,以及 GPT-5.5 base。原始运行名 pre-CGD ckpt200 对应 SFT 起点,DPOP100 对应 DPOP 100 步,No-anchor GRPO ckpt65 对应细粒度 GRPO。运行名前缀只是实验配置产生的名称,不代表额外方法。
实验同时包含两种输入条件:
- 未注入计数事实: 模型直接读取原始记录并自行计算。
- 注入计数事实: 提示词额外提供“XX 个夜晚中有 X 个少于 7 小时”这类人工计算的事实。在另一组不启用思维链或工具调用的测试设置中,GPT-5.5 的计数准确率约为 93%,所以我们单独比较了这个条件。
9.1 未注入计数事实
| 模型阶段 | 洞察 | 归因 | 建议 | 均分 |
|---|---|---|---|---|
SFT(pre-CGD ckpt200) | 4.5717 | 4.4717 | 4.6733 | 4.5722 |
Weighted DPOP(DPOP100) | 4.6017 | 4.5800 | 4.7083 | 4.6300 |
细粒度 GRPO(No-anchor GRPO ckpt65) | 4.6267 | 4.6400 | 4.7067 | 4.6578 |
| GPT-5.5 base | — | — | — | — |
9.2 注入计数事实
| 模型阶段 | 洞察 | 归因 | 建议 | 均分 |
|---|---|---|---|---|
SFT(pre-CGD ckpt200) | 4.6533 | 4.5950 | 4.7133 | 4.6539 |
Weighted DPOP(DPOP100) | 4.6883 | 4.7167 | 4.7417 | 4.7156 |
细粒度 GRPO(No-anchor GRPO ckpt65) | 4.7733 | 4.7400 | 4.7950 | 4.7694 |
| GPT-5.5 base | 4.7367 | 4.6967 | 4.8017 | 4.7450 |
所有表格结果都由 GPT-5.5 评分。从 SFT 到 weighted DPOP,再到细粒度 GRPO,三个报告字段和均分整体持续提升。在注入计数事实的条件下,细粒度 GRPO 的均分为 4.7694,高于 GPT-5.5 base 的 4.7450;GPT-5.5 base 在建议项上的分数略高。
我们也用 GPT-5.4 做了跨模型评分,观察到的优势更明显。但内部 API 问题阻止了 autoeval_model=gpt5.4、gen_model=5.5 base 组合的完整评测。因此,未完成设置不能作为完整结论,相关趋势只作为补充观察。
9.3 分项评分
下面两张图从报告字段和评分原则两个层面展示不同最终来源的 AutoEval 分数。AutoEval 指使用评估模型按预设评分规则自动打分,范围为 1–5 分。


10. 展望
这项研究最终仍要回到一个普通的夜晚。用户读完报告后,应该能理解最近为什么总在清晨醒来,为什么周末补觉没有消除疲惫,以及今晚最值得先做哪一件事。
未来的睡眠报告需要处理更长的时间跨度,也需要结合训练负荷、压力、咖啡因、旅行和生活事件等更多线索。我们希望报告能从每天醒来后的一张“成绩单”,逐步变成一个持续理解个人变化、根据新证据修正判断,并尊重安全边界的睡眠助手。技术的价值不只在于写出像专家分析的文本,也在于帮助用户看懂数据,并把长期健康管理转成下一步可以采取的行动。