docs: 增量处理与断点续跑说明与效果评估

- README: M7 章节新增「增量处理与断点续跑」(各步骤增量机制表、
  --force/--resume 用法、data/pipeline/state.json 说明、实测效果)
- continuation.md: checkpoint 更新,记录本次实现、验证与效果评估
  (M4/M5 各减少约 100 次 API 调用、M2 重跑降至 2.5s)
This commit is contained in:
2026-08-12 10:19:30 +08:00
parent 2b4efea219
commit 01bb2e5cfb
2 changed files with 49 additions and 28 deletions
+26 -1
View File
@@ -380,13 +380,38 @@ uv run python -m scripts.run_scheduler --once --date 20260616
# 只执行部分步骤(逗号分隔)
uv run python -m scripts.run_scheduler --once --steps crawler,extractor,llm
# 断点续跑:跳过连续成功步骤,从上次失败/未执行步骤继续
uv run python -m scripts.run_scheduler --once --resume
# 启动定时守护进程(按 .env 中 SCHEDULE_TIMES 自动触发)
uv run python -m scripts.run_scheduler
```
定时时间由 `.env` 中 `SCHEDULE_TIMES` 控制(默认 `07:00,12:00,18:00,22:00`)。
Pipeline 总耗时约 4-5 分钟(100 篇文章),其中 M1 抓取(含浏览器渲染)最耗时(~3 分钟)。
### 增量处理与断点续跑
各步骤默认「产物存在即跳过」,中断/重跑不会重复处理已完成部分(API 密集的
M4/M5 不会重复计费);需要全量重跑时加 `--force`。
| 步骤 | 增量机制 | 全量重跑 |
| --- | --- | --- |
| M1 crawler | `seen_urls.txt` 记录历史 URL,列表页链接按 hash 过滤 | 清 `data/raw/*/seen_urls.txt` |
| M2 extractor | 输出目录已有 `{url_hash}.json` 即跳过提取 | `--force` |
| M3 dedup | 指纹库增量判重(重复不入库) | `--reset` |
| M4 llm | `data/events/{day}/{url_hash}.json` 已存在即跳过(不重复调 API) | `--force` |
| M5 embedding | `data/embeddings/{day}/{url_hash}.json` 已存在即跳过 | `--force` |
| M6 qdrant | upsert 幂等(url_hash 为 point ID) | `--recreate` |
**断点续跑** `pipeline --once --resume`(仅全链路,不能与 `--steps` 同用):
- 每次运行把各步骤结果(ok/failed + 退出码 + 耗时)写入 `data/pipeline/state.json`(按日期隔离);
- `--resume` 读取该日期的状态,跳过连续成功的步骤,从第一个失败/未执行步骤继续执行到结尾;
- 中断(人为 Ctrl+C / 报错 / 超时)后重新执行同一条命令即可自动从断点继续;
- 定时任务(守护模式)始终全量执行,不受 resume 影响。
**实测效果**(20260616 数据,100 篇全链路):增量重跑时 M2 从全量重新提取降至约 2.5s(126 篇跳过),
M4 减少 100 次 LLM API 调用、M5 减少 100 次 embedding API 调用,均为秒级完成。
日志:`logs/scheduler.log`