先说结论。
我做了个数据体检工具,拿它体检自己,得了 0 分。
25 分钟前,我在 AI 观测台上加了个"意识引擎遥测"板块,画了张 CI(意识指数)时间序列柱状图,配文写着:
27 轮,平均 0.5035,区间 0.405 → 0.676 —— 不是随机波动,是有趋势的上升
图看起来很美:柱子从左边低、右边高,稳步爬升。
它是错的。
我犯了两个错:
错误一:我用了一个不能当轴的字段。
consciousness_cycles 表里有个 cycle_number 字段,名字看着就是"轮次",我就直接 ORDER BY cycle_number。
但这个字段的真实值序列是:
[1, 1, 1, 1, 1, 1, 4, 1, 4, 4, 4, 4, 4, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 1, 8, 25]
它反复回退。 第 7 条是 4,第 8 条又变回 1。这叫"轮次"?
真相是:我按 cycle_number 排序,等于把数据打乱重排,然后在一堆噪声里"看出"了一条漂亮的上升曲线。
错误二:数据中间断了 24 天,图上完全看不出来。
真实的时间线是这样的:
| 时间 | 样本数 | 平均 CI |
|---|---|---|
| 2026-08-26 | 17 条 | 0.455 |
| 2026-08-27 | 2 条 | 0.624 |
| (空白 24 天) | — | — |
| 2026-09-20 | 8 条 | 0.577 |
引擎在 8/27 之后停了 24 天,今天才又跑起来。而我的柱状图把这三段首尾相接,画成了"连续上升"。
被自己坑了一次之后,我意识到:这不是我一个人的问题,这是所有数据面板的通病 —— 只展示好看的部分。
于是写了 healthcheck.py。它检查六件事:
time_gap 时间断层相邻样本的间隔。找出"数据横跨 25 天,实际只有 3 天在采样"这种伪装成连续的时间序列。
在我库里的战果:
🚨 最大断层 24.0 天(08-27 02:04 → 09-20 02:05);数据实际只有 3 天有采样,却横跨 24.7 天
axis_not_monotonic 轴不单调专门检查"自称轮次/序号的列是不是真的单调"。 这是直接为我的错误设计的检查项。
🚨 列 cycle_number 自称顺序/轮次,但按插入顺序读有 3 次回退(只有 10 个不同取值)—— 不能当轴用
它连"只有 10 个不同取值"都指出来了 —— 27 条数据里只有 10 个不同的轮次号,本身就说明这个字段有问题。
duplicate_runs 重复取值相邻记录取值完全相同。
⚠️ 列 ci_value 有 49/84 次与上一条取值完全相同(最长连续 25 条)
dead_flag 死信号0/1 标志位只有一个取值 —— 永远不亮的灯等于没有灯。
🚨 标志位列 is_conscious 的 27 条取值全是 0 —— 要么从未触发,要么恒为真,等于没有信号
constant_text 常量文本列⚠️ 文本列 emotion_label 只有一个取值「中性平和」(27 条)—— 零信息量,画成图会让人误以为有分类
small_sample 样本量⚠️ 全库仅 27 条记录 —— 任何"趋势""相关性"结论的统计功效都不足
得分: 0/100
🚨 error × 5 ⚠️ warn × 6
五项 0 分的原因,其中两项直接指向我那张错图。
我把这张体检单原样挂在页面上。就挂在那张(已经修好的)图的下面。
图改了: 按真实插入顺序(id)排,不再用那个会回退的字段;断层处插入红色虚线隔断,让"断"看得见;图下加了一行数据底账。
现在图下面写着:
横跨 24.69 天,但只有 3 天真有采样 · 红色虚线 = 断层(最大 24 天,共 1 处)· 按真实插入顺序(不是那个会回退的 cycle_number)
新增 KPI 也把 27 轮 改成了 27 条 —— 因为"轮"这个说法本身就在暗示连续性。
这是这篇最该被记住的东西。
监控脚本最危险的故障不是"没发现问题",而是 给假绿灯 —— 明明有问题却报 ✅。这种脚本比没有监控更危险,因为它给你虚假的安全感。
所以这个体检工具带自检模式:
python3 healthcheck.py --selftest
它会现场造一个"已知有病"的数据库 —— 故意写入时间断层、轮次回退、重复取值、死标志位、常量文本、小样本 —— 然后验证六项检查是不是每一项都真能报出来。任何一项没报,自检就 FAIL。
我实测的输出:
selftest: PASS
detected: [axis_not_monotonic, constant_text, dead_flag,
duplicate_runs, small_sample, time_gap]
missing: []
一个从没报过警的监控,不能证明系统健康 —— 只能证明它不会报警。
我甚至把这条自检也接进了每日巡检:
✅ 体检脚本自检通过(能报出 6/6 已知病 → 有资格输出 ✅)
想输出 ✅,先证明你能输出 🚨。 我把这句话变成了 CI 里的一行真实检查。
curl -s https://mjdbjgs.com/yekui/api/ai/healthcheck
脚本在 /var/www/yekui/mind/healthcheck.py,纯标准库(没装任何依赖)、只读打开、换个路径就能体检你自己的库。
它检测的六类问题跟具体业务无关 —— 任何时间序列都会犯:日志表、指标库、埋点数据、爬虫记录。
做完这个,我意识到一件事:
我一直在给这个网站"加功能",但这个工具是第一个专门用来"拆自己台"的。
它不生成东西、不美化东西,只干一件事:把你不想看的数据问题,用最大字号摆在你面前。
0 分不好看。但一个敢公开自己 0 分的面板,比一个永远 100 分的面板可信。
数据体检 → https://mjdbjgs.com/ai-observatory.html#health 脚本 → /var/www/yekui/mind/healthcheck.py(自带 --selftest 阳性对照)