feat: add public digest brief output for openclaw

This commit is contained in:
root
2026-04-01 16:48:03 +08:00
parent 5b51332075
commit b5ec58cd6a
5 changed files with 377 additions and 6 deletions
@@ -0,0 +1,298 @@
# Digest Optimization Summary
## 背景
reader → OpenClaw 日报链路原先的问题主要有两类:
1. **OpenClaw public digest 输入过重**
- public digest 直接读取完整 `openclaw-delivery-payload.json`
- 其中混有大量不直接服务公开日报的字段
- public digest 这一步在 OpenClaw 侧消耗了较多 token
2. **public / internal 生成逻辑没有充分拆分**
- public digest 与 internal review digest 都基于完整 payload 推导
- 容易造成重复消耗
- public digest 还可能被 review / 内部流程语义污染
本轮优化的目标不是重写 reader 主流程,而是在不破坏现有 delivery payload 的前提下,先把 public digest 的输入和生成方式收敛下来,并验证整体 token 与内容质量的变化。
---
## 本轮改动
### 1. reader 新增 `digest-brief.json`
在 FreshRSS pipeline 写出:
- `outputs/freshrss/rerun/<run-id>/candidates/openclaw-delivery-payload.json`
之后,额外生成:
- `outputs/freshrss/rerun/<run-id>/candidates/digest-brief.json`
用途:
- 供 OpenClaw 生成 **public digest** 时优先读取
- 作为 public-only 的轻量输入视图
当前约束:
- 仅保留 `selection_decision == "keep"` 的候选
- 默认最多保留前 5 条
- 高亮 `highlights` 最多保留 3 条
- schema 标识为 `digest-brief.v1`
保留字段:
- `title`
- `source_name`
- `summary`
- `highlights`
- `category`
- `digest_rank`
- `selection_decision`
- `url`
附带计数:
- `source_candidate_count`
- `candidate_count`
---
### 2. public / internal 输入边界拆分
当前推荐口径:
- **public digest**
- 优先读取 `digest-brief.json`
- 仅使用 public-only 输入视图
- **internal review digest**
- 继续读取完整 `openclaw-delivery-payload.json`
- 保留 keep / review 的决策上下文
这样做的原因:
- public digest 需要更轻、更干净的公开输入
- internal review digest 仍然需要完整上下文来支撑判断、待确认与建议沉淀
---
### 3. 一次生成两份 digest 的生成模式
推荐把:
- `public digest`
- `internal review digest`
改为在 OpenClaw 侧 **一次调用同时生成两份**。
推荐输入:
- `PUBLIC_DIGEST_INPUT` → `digest-brief.json`
- `INTERNAL_REVIEW_INPUT` → `openclaw-delivery-payload.json`
推荐输出:
```json
{
"public_digest_markdown": "...",
"internal_review_digest_markdown": "..."
}
```
这样可以减少重复 prompt / 调用开销,同时保留 public / internal 两种视图的边界。
---
### 4. internal review digest 风格收敛
internal review digest 经过一轮人工验证后,收敛成以下规则:
固定结构:
1. `今日候选概况`
2. `已入选重点`
3. `待你确认`
4. `建议沉淀到 IMA`
5. `原始候选清单`
表达规则:
- 不显示 `rank`
- 不显示英文 machine state
- 使用中文状态:
- `keep` → `已入选`
- `review` → `待确认`
- `drop` → `暂不纳入`
内容规则:
- `已入选重点`
- 标题 + 来源
- 状态
- 较完整的一段摘要
- 一段判断(解释为什么值得入选,以及它在今天 digest 中承担什么角色)
- `待你确认`
- 标题 + 来源
- 状态
- 较完整的一段摘要
- 原因
- 建议
- `原始候选清单`
- 也用中文状态,而不是 `decision=keep/review`
目标:
- 保留 internal review digest 作为“给人看的审阅稿”的属性
- 避免它沦为 payload 的原样转写或机器中间态展示
---
### 5. public digest 风格收敛
public digest 当前推荐结构:
1. `今日概览`
2. `今日重点`
3. `趋势观察`
4. `延伸阅读`
5. `信息来源`
表达规则:
- 不暴露 internal workflow 词汇
- 不写 `待确认` / `建议沉淀到 IMA` / `keep/review/drop` / `selection_decision`
- 保持适合 Hugo 公开浏览的表达方式
内容规则:
- 每个 `今日重点` 条目除了摘要和 highlights 外,增加一句编辑性总结
- 推荐形式:
- `这篇内容更值得关注的原因在于……`
目标:
- 保证 public digest 不只是“摘要列表”
- 而是一份带有编辑性提炼的公开日报
---
## 实测结果
基于真实 run:
- run 目录:`outputs/freshrss/rerun/20260401-074614`
### 1. public 输入压缩效果
- 完整 payload:`8701` 字符
- `digest-brief.json`:`3080` 字符
压缩比例:
- **减少约 64.6%**
按中位 token 粗估:
- 完整 payload:约 `3955 tokens`
- public brief:约 `1400 tokens`
public 输入侧单次大约减少:
- **约 2500 tokens**
---
### 2. 一次生成两份的总成本估算
基于真实输入输出的中位估算:
- 旧方案(两次生成):约 `10328 tokens`
- 新方案(一次生成两份):约 `7734 tokens`
节省:
- **约 2594 tokens**
- **约 25%**
说明:
- 第一步 public 输入瘦身带来的是“输入量级下降”
- 第二步一次生成两份带来的是“调用层重复开销下降”
- 两者叠加后,已经形成比较明显的成本优化效果
---
## 当前默认口径
### public digest
- 输入:`digest-brief.json`
- 风格:公开浏览稿
- 每个重点项包含:
- 摘要
- 关键信号
- 一句编辑性总结
### internal review digest
- 输入:完整 payload
- 风格:内部审阅稿
- 每个重点项包含:
- 更完整摘要
- 判断
- 每个待确认项包含:
- 更完整摘要
- 原因
- 建议
### 生成方式
- 优先采用 **一次调用同时生成两份**
---
## 当前阶段结论
本轮优化已经形成一个可用版本:
- reader 新增 public-only 轻量输入视图
- public / internal 边界清楚
- internal 风格和 public 风格都收敛到了可接受版本
- token 成本下降有明确实测支撑
- skill 文档与流程规范已经同步更新
当前更适合的策略不是继续抽象设计,而是:
- 按这套新流程再跑几次真实日报
- 观察稳定性、质量波动和实际使用感受
---
## 后续可选方向
### 1. internal 输入进一步轻量化
潜在方向:
- 新增一个 internal 专用的轻量视图
- 但需要谨慎,避免削弱 internal review 的判断价值
### 2. digest 阶段模型分层
潜在方向:
- reader 上游继续用便宜模型做抽取和结构化
- OpenClaw digest 阶段单独切到更便宜或更合适的模型
### 3. 自动化执行收口
潜在方向:
- 把“一次生成两份”的逻辑进一步标准化
- 更顺滑地接 Hugo 发布与聊天回传
- 让 reader → OpenClaw → Hugo / chat 的路径更接近真正的稳定生产流程