222 lines
5.9 KiB
Markdown
222 lines
5.9 KiB
Markdown
# OpenClaw 日报聚合改造说明
|
|
|
|
## 1. 为什么要改
|
|
|
|
当前项目已经跑通了:
|
|
|
|
`FreshRSS -> item -> extraction -> LLM summary -> validator -> filter -> Markdown sink`
|
|
|
|
这条链路证明了上游拉取、结构化提取、摘要校验和规则过滤都是可行的。
|
|
|
|
但如果最终目标是:
|
|
|
|
- 每日提炼总结进入知识库
|
|
- OpenClaw 向用户汇报今天的日报
|
|
|
|
那么当前“单篇过滤后直接写入本地 Markdown 知识库”的主路径就不够准确了。
|
|
|
|
原因有四点:
|
|
|
|
1. 单篇文章更像原材料,不是最终成品
|
|
2. 用户要的是“日报级总结 + 知识沉淀”,不是“每篇都直接入库”
|
|
3. 参考文章中真正的终态是 `Digest -> Daily Review -> 人工确认 -> Lumina`
|
|
4. 当前 `article_candidate` 如果同时承担内部记录和下游投递,会导致 payload 过重、token 过高、边界混乱
|
|
|
|
所以当前项目要从“单篇直接入库”切换为“单篇候选材料 -> 日报聚合 -> 人工确认 -> 知识沉淀”。
|
|
|
|
## 2. 参考文章给出的真实结构
|
|
|
|
参考文章里的关键分层是:
|
|
|
|
1. `Digest`
|
|
- 去重、抓正文、质量检查、生成摘要
|
|
- 产出可判断的候选内容
|
|
2. `Daily Review`
|
|
- 从候选内容中做栏目化精选
|
|
- 产出当天的日报
|
|
3. `Human in the loop`
|
|
- 人工判断哪些内容值得长期保留
|
|
4. `Lumina`
|
|
- 只承接真正值得长期保留的内容
|
|
|
|
这意味着:
|
|
|
|
- 日报不是知识库的替代品
|
|
- 知识库也不应该承接所有单篇文章
|
|
- 单篇内容更适合作为日报生成前的候选材料
|
|
|
|
## 3. 当前设计哪里不够
|
|
|
|
当前的不足主要在下游:
|
|
|
|
### 3.1 `sink` 语义过重
|
|
|
|
现在的 `Markdown sink` 更像“最终入库器”。
|
|
|
|
但在新的目标里,它最多只应扮演:
|
|
|
|
- debug sink
|
|
- fallback sink
|
|
- 审计/归档 sink
|
|
|
|
主路径不应再把它视为最终知识库形态。
|
|
|
|
### 3.2 缺少“日级对象”
|
|
|
|
当前项目有:
|
|
|
|
- `item`
|
|
- `article`
|
|
- `summary`
|
|
- `filter_decision`
|
|
|
|
但还没有:
|
|
|
|
- `ArticleCandidateRecord`
|
|
- `OpenClawCandidateInput`
|
|
- `DailyDigest`
|
|
|
|
如果没有这三个对象,就无法稳定表达:
|
|
|
|
- 单篇内容如何作为内部候选材料存在
|
|
- 单篇内容如何以低 token 的形式发给 OpenClaw
|
|
- 一天的内容如何被聚合为一个正式产物
|
|
|
|
### 3.3 缺少人工确认层
|
|
|
|
规则引擎的 `keep` 只能表示“值得进入下一步”,不能直接等价于“正式入知识库”。
|
|
|
|
如果没有人工确认层,系统就会退化成“规则命中即永久沉淀”,这和参考文章强调的 `Human in the loop` 不一致。
|
|
|
|
### 3.4 下游输入边界不清楚
|
|
|
|
如果把正文全文、完整规则证据链、本地文件路径都发给 OpenClaw,会出现三个直接问题:
|
|
|
|
- token 浪费
|
|
- 对象职责混乱
|
|
- OpenClaw 输入与本地实现耦合
|
|
|
|
所以必须把“内部记录对象”和“下游精简输入对象”分开。
|
|
|
|
## 4. 改造后的主路径
|
|
|
|
建议主路径调整为:
|
|
|
|
`FreshRSS/RSS -> extraction -> LLM summary -> validator -> rule engine -> ArticleCandidateRecord -> OpenClawCandidateInput -> OpenClaw -> DailyDigest -> human review -> knowledge base`
|
|
|
|
这里要注意几件事:
|
|
|
|
1. 当前项目负责生成高质量候选材料与精简输入
|
|
2. OpenClaw 负责按天聚合、生成日报、编排后续动作
|
|
3. 知识库只接收日报和人工确认后的长期内容
|
|
|
|
## 5. 新的对象分层
|
|
|
|
### 5.1 `ArticleCandidateRecord`
|
|
|
|
定位:
|
|
|
|
- 单篇内容的内部候选记录
|
|
- 用于留档、追溯、重放、审计
|
|
|
|
最少应包含:
|
|
|
|
- `item`
|
|
- `article`
|
|
- `summary`
|
|
- `filter_result`
|
|
- `metadata`
|
|
- 可选 `source_refs`
|
|
- 可选 `rendered_markdown`
|
|
|
|
### 5.2 `OpenClawCandidateInput`
|
|
|
|
定位:
|
|
|
|
- 当前项目发给 OpenClaw 的标准投递对象
|
|
- 用于日报聚合与排序
|
|
|
|
最少应包含:
|
|
|
|
- `candidate_id`
|
|
- `title`
|
|
- `url`
|
|
- `published_at`
|
|
- `author`
|
|
- `summary`
|
|
- `highlights`
|
|
- `topics`
|
|
- `category`
|
|
- `worth_keeping`
|
|
- `selection_decision`
|
|
- `selection_reason`
|
|
- `digest_section_hint`
|
|
- `digest_rank`
|
|
|
|
它不应包含:
|
|
|
|
- `article.plain_text`
|
|
- `filter_result.matches`
|
|
- `source_refs`
|
|
|
|
### 5.3 `DailyDigest`
|
|
|
|
定位:
|
|
|
|
- 一天的主产物
|
|
- 同时服务于“知识沉淀”和“日报汇报”
|
|
|
|
建议至少包含:
|
|
|
|
- `date`
|
|
- `sections`
|
|
- `top_items`
|
|
- `key_takeaways`
|
|
- `watchlist`
|
|
- `candidate_ids`
|
|
- `source_refs`
|
|
- `editor_notes`
|
|
|
|
## 6. 为什么这样更合理
|
|
|
|
这样改造有几个直接收益:
|
|
|
|
1. 知识库不会被大量单篇摘要污染
|
|
2. OpenClaw 不需要再次消费全文,token 更可控
|
|
3. OpenClaw 的输入边界更清晰,不依赖本地目录结构和规则证据链
|
|
4. 当前项目仍然保留完整候选记录,因此误判排查和重放能力不会丢
|
|
5. 未来扩展周报、专题文章和反馈回流会更自然
|
|
|
|
本质上,这是把当前系统从“单篇落库工具”调整为“日报生产链路中的候选记录生产器 + 精简投递器”。
|
|
|
|
## 7. 对当前实现的影响
|
|
|
|
不需要推翻已有能力,主要是重新定位:
|
|
|
|
- `extraction` 保留
|
|
- `LLM summary validator` 保留
|
|
- `rule engine` 保留
|
|
- `FreshRSS integration` 保留
|
|
- `Markdown sink` 保留,但降级为调试/回退能力
|
|
|
|
真正新增的是:
|
|
|
|
- `ArticleCandidateRecord` schema
|
|
- `OpenClawCandidateInput` schema
|
|
- `ArticleCandidateRecord -> OpenClawCandidateInput` 映射逻辑
|
|
- `DailyDigest` schema
|
|
- 人工确认后的状态流转
|
|
|
|
## 8. 下一步应该做什么
|
|
|
|
建议按这个顺序推进:
|
|
|
|
1. 在代码里把当前 `article_candidate` 重新定位为 `ArticleCandidateRecord`
|
|
2. 新增 `OpenClawCandidateInput` 模型
|
|
3. 增加精简 payload 的本地输出脚本或转换函数
|
|
4. 让 OpenClaw 只消费精简输入对象
|
|
5. 再设计批量聚合和 `DailyDigest` 生成
|
|
|
|
## 9. 一句话结论
|
|
|
|
如果最终目标是“每天有日报汇报,同时把日级提炼沉淀进知识库”,那么当前项目就不该继续围绕“单篇直接入库”演进,而应拆成“内部候选记录对象 + OpenClaw 精简输入对象 + 日级成品对象”三层结构。 |