Add markdown sink for filtered knowledge notes

This commit is contained in:
zhuyongxin
2026-03-25 10:25:26 +08:00
parent ff3d15b8c4
commit cecf4d3ae7
10 changed files with 656 additions and 21 deletions
+7 -3
View File
@@ -8,11 +8,13 @@
- 当前 MCP 服务的职责、接口和边界
3. `filter-rule-engine-design.md`
- 过滤层的输入输出、规则结构与当前实现
4. `source-schema-design.md`
4. `markdown-sink-design.md`
- 第一版 Markdown sink 的输入输出、目录结构与落地方式
5. `source-schema-design.md`
- `source -> item -> document` 的对象设计
5. `reading-pipeline-design-notes.md`
6. `reading-pipeline-design-notes.md`
- 更上层的阅读流方案与阶段划分
6. `summary-loop-explained.md`
7. `summary-loop-explained.md`
- 当前 LLM 摘要校验闭环的解释
## 当前文档分层
@@ -40,6 +42,8 @@
- 提取 JSON -> LLM 摘要 JSON -> 校验 的闭环说明
- `docs/filter-rule-engine-design.md`
- 第一版规则过滤引擎设计与落地位置
- `docs/markdown-sink-design.md`
- 第一版 Markdown sink 设计与落地位置
### 3. 上下游方案设计
+15 -12
View File
@@ -24,6 +24,8 @@
- 已跑通 `FreshRSS -> item -> content extraction` 单条链路
- 已定义过滤层输入输出 schema
- 已完成第一版规则引擎、本地脚本和 MCP tool
- 已定义 sink 输入输出 schema
- 已完成第一版 Markdown sink 与本地写入脚本
## 当前关键文件
@@ -39,6 +41,10 @@
- `src/summary_mcp/models/filtering.py`
- 过滤引擎:
- `src/summary_mcp/filters/engine.py`
- sink 模型:
- `src/summary_mcp/models/sink.py`
- Markdown sink:
- `src/summary_mcp/sinks/markdown.py`
- 默认过滤规则:
- `configs/filter_rules.json`
- 校验 CLI:
@@ -51,20 +57,16 @@
- `scripts/run_freshrss_extract.py`
- 过滤脚本:
- `scripts/run_filter_rules.py`
- Markdown sink 脚本:
- `scripts/run_markdown_sink.py`
- Markdown sink 文档:
- `docs/markdown-sink-design.md`
- 当前提示词:
- `outputs/llm-summary-prompt.txt`
- FreshRSS 原始响应样例:
- `outputs/freshrss.raw.json`
- FreshRSS item 样例:
- `outputs/freshrss.items.json`
- FreshRSS 提取结果:
- `outputs/freshrss.extracted.json`
- 过滤结果样例:
- `outputs/filter-decision.json`
- 文档索引:
- `docs/README.md`
- MVP 归档:
- `docs/content-extract-mcp-mvp-archive.md`
- 当前 TODO:
- `TODO.md`
@@ -79,21 +81,22 @@
- 标准化 `item` 可继续进入内容提取流程
- 规则引擎可对结构化摘要结果输出 `keep / drop / review` 决策
- MCP tool 可承接“由上层 LLM/Agent 调用过滤”的模式
- Markdown sink 可将过滤后的结果写入本地知识库目录
## 当前未开始的下一阶段
- 设计知识库入库格式
- 设计 webhook / 推送格式
- 把 FreshRSS 拉取与提取流程进一步批量化/调度化
- 迭代更细的过滤规则与个性化上下文
- 决定是否扩展 Notion / Webhook / 其他 sink
## 收束后建议从这里继续
优先从这两个问题继续:
1. 先设计知识库 sink 的输入输出格式
2. 再决定先接 webhook / 推送还是继续细化过滤规则
1. 先设计 webhook / 推送格式
2. 再决定是否扩展其他 sink,而不是继续深化 Markdown sink 本身
## 一句话结论
当前 MVP 已完成,FreshRSS 上游和第一版规则过滤层都已接通,下一阶段应转向下游 sink 与推送设计。
当前 MVP 已完成,FreshRSS 上游、第一版规则过滤层和第一版 Markdown sink 都已接通,下一阶段应转向推送层与更完整的下游集成。
+105
View File
@@ -0,0 +1,105 @@
# Markdown Sink 设计
## 1. 目标
第一版 sink 不直接绑定外部平台,而是先落一个稳定的 `Markdown sink`。
原因:
- 可审计
- 可版本化
- 易迁移
- 可直接兼容 Obsidian / 通用 Markdown 知识库
## 2. 统一输入
Markdown sink 读取统一的 `SinkInput`:
- `item`
- `article`
- `summary`
- `filter_decision`
- `metadata`
这样未来扩展 Notion sink、Webhook sink 时,可以继续复用同一套上游输入结构。
## 3. 目录结构
当前建议目录结构:
```text
knowledge-base/
inbox/
review/
archive/
```
具体落盘规则:
- `keep` -> `knowledge-base/inbox/YYYY/YYYY-MM/`
- `review` -> `knowledge-base/review/YYYY/YYYY-MM/`
- `drop` -> `knowledge-base/archive/YYYY/YYYY-MM/`
## 4. 文件命名
文件名格式:
```text
YYYY-MM-DD-title-slug.md
```
例如:
```text
2026-03-21-kimi-cursor.md
```
## 5. Markdown 内容结构
输出采用:
- YAML frontmatter
- 摘要区
- 要点区
- 过滤决策区
- 原文信息区
- 正文摘录区
frontmatter 中保留:
- `title`
- `url`
- `source_id`
- `item_id`
- `extract_id`
- `category`
- `worth_keeping`
- `decision`
- `priority`
- `topics`
- `keywords`
- `labels`
- `published_at`
- `saved_at`
- `quality_flags`
## 6. 当前落地位置
- sink 模型:
- `src/summary_mcp/models/sink.py`
- Markdown sink:
- `src/summary_mcp/sinks/markdown.py`
- 本地运行脚本:
- `scripts/run_markdown_sink.py`
## 7. 当前阶段结论
第一版知识库不先绑定 Notion、Lumina 或数据库,而是先让过滤后的内容稳定进入 Markdown 知识库。
只要这层格式稳定,后续可以继续扩展:
- Obsidian Vault
- Logseq
- Notion
- Webhook
- 自定义数据库 sink