第 6 章:测试和调试
非科班怎么测 AI 系统
这个项目的测试和常规 CRUD 应用不一样 — AI 评分没有"标准答案",你不能写 assert score == 8.5。
但不代表不需要测。测的方式不同而已。
我的测试策略
1. 链路冒烟测试
每次改完代码,手动跑一轮完整聚合,确认 5 个关键环节:
- 每个爬虫能拿到数据(不是空列表)
- AI 分析不报错(不是全部 0 分)
- 去重后数量合理(不是 0 条也不是没减少)
- 日报能正常生成
- RSS 能在阅读器里打开
这不是正式的自动化测试,但对个人项目来说是最有效的验证 — 3 分钟跑完,覆盖了整条链路。
2. AI 评分人工抽查
每天看一遍日报输出,关注三个问题:
- 误放: 7 分以上有没有明显不相关的内容?
- 误杀: 有没有值得看的新闻评分偏低被过滤掉了?
- 分类错误: 工具类的有没有跑到论文类里?
发现问题不是改代码,而是调 prompt。AI 分析的质量 80% 取决于 prompt 写得好不好。
3. 日志驱动调试
聚合器每次执行都输出完整流水日志:
[aggregation_xxx] 开始抓取,时间窗口: 24小时
→ 抓取 HackerNews...
✓ HackerNews: 12 条
→ 抓取 RSS...
✓ RSS: 28 条
→ 抓取 arXiv...
✓ arXiv: 8 条
URL去重: 48 → 40 条
→ AI 分析 40 条...
AI 分析完成: 40 条
Token 使用: 45,000 tokens
评分过滤 (全局>=7.0, arXiv>=6.5): 18 条
主题去重: 18 → 15 条
保存完成: 15 条1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
这些就是源码中 aggregator.py 实际输出的格式。哪一步数据量不对,一眼能看出来。
比如某天突然 HackerNews 0 条 — 要么 API 挂了,要么 min_score 阈值设得太高。不用猜,日志直接告诉你。
常见问题和排查方向
| 现象 | 可能原因 | 排查方式 |
|---|---|---|
| 某个源 0 条数据 | API 变了/被限流/超时 | 单独跑那个爬虫,看具体报错 |
| AI 全部 0 分 | API Key 过期/余额不足 | 查智谱控制台 |
| 去重后只剩 1-2 条 | 主题去重的相似度阈值太低 | 看 debug 日志里的相似度计算 |
| RSS 打开空白 | 日报还没生成 | 检查 daily_brief 表有没有数据 |
| Token 消耗突然增大 | 内容变长/去重失效/重复分析 | 检查 URL 去重是否正常 |
为什么没写 pytest
原因很直接:
- 核心逻辑是 AI 调用 — 结果非确定性,没法断言
- 外部依赖多 — 5 个信息源 API + GLM,全 mock 成本太高
- 个人项目 — 出问题我第一个知道
但这不代表所有模块都没测试。到了 SaaS 版,支付回调、套餐升降级、频率限制这些模块是有测试的 — 因为这些是"出错了要赔钱"的逻辑。
经验:测试形式要匹配项目阶段。 个人 MVP 阶段,手动冒烟 + 日志监控 > 写一堆永远不跑的用例。
上线后怎么发现问题
- 健康检查 API(
/api/health)— 监控平台定时 ping - Webhook 通知 — 每次聚合完成/失败都推送到企业微信,包含条目数和 Token 消耗
- 日报内容人工过目 — 每天早上花 2 分钟扫一眼今天的输出质量
前两个是自动的,最后一个是"吃自己的狗粮" — 自己就是用户,质量下降第一时间能感知到。