记一次领域知识固化的实践
前两天用 AI 帮我做数据分析,有一些数据要算 RMSE 和相关系数。数据很多,都丢给 AI 去弄了,结果在没意料的地方出了错——它偷懒了,我没发现,hhh。
事情是这样的:两个方向量做比较的时候,误差是不应该大于 180° 的。这个道理我是知道的,但当时没交代清楚。比如 355° 和 5°,它们相差不是 abs (355-5)=350°,而是:如果差值大于 180,就用 360 减去差值,也就是 360-350=10°。差值是 10°,这样最后算出来的 RMSE 才是对的。
我和 AI 说了之后,它批量去弄了。出来的图片看起来好像是那么回事,RMSE 显示 60 多度。我心想行吧,就这样了。结果后来客户说:"你这个和我之前算的不一样啊,你再检查检查?" 再去一查,hhh,尴尬了——AI 画图的时候用了正确的方法,但计算 RMSE 还是原来那套逻辑。
怎么说了?可以说我一开始没说清楚,或者是模型能力问题,它偷懒了——但这种事用 skill 其实是可以解决的:把一些常用的方法和套路固定下来,让 AI 有参考,或者直接调用。
附记:一些 Skill 设计思路
东西做完了之后回头再看,最后的东西其实不只是一个能用的脚本,也是一套可以复用的 "坑 → 规则 → 加固" 模式。写下来也算是个记录,或许对正在做类似事情的人有些参考。
三个经验
1. AI 画对了不代表算对了。 这是有坑的一点。AI 在出图时用了正确的方向差值方法(因为图的形状看起来合理),但在表格里计算 RMSE 时用的还是普通减法。明明调用了同一份数据,两个地方的结果不一致——这种"半对半错"比全错更隐蔽。后来把所有指标计算统一到一个核心模块 metrics.py 里,图和报告都调用同一个函数,也就应该解决了这个问题。
2. 让它"不敢犯错"比告诉它"别犯错"靠谱。 一开始在 skill 里写了很多"注意:方向数据要用循环差值"之类的提示。但实验发现,AI 看到提示后仍然有可能忽略。后来改了策略:不用自然语言提醒,把规则直接写进代码里—— direction_rmse 函数内部强制调用 circular_diff,外部想绕绕不过去。
3. 加上人工检查点。 Skill 做得再好,也不能 100% 覆盖所有场景。所以在每个阶段(提取 → 对齐 → 计算 → 画图)都设置了一个人工检查点,输出显式的日志(对齐了多少点、剔除了多少 NaN、误差过滤了多少个),可以看到有没有异常。这不是对 AI 不信任,主要是检查下放心点可能。
Skill 里的那些反例
这个 skill 的过程中,把常见的 AI 失误整理成了一个"反例章节",每个反例都按三段式来写:
❌ 错误写法 → 展示 AI 会怎么犯错 ✅ 正确做法 → 给出应该怎么做 代码加固 → 说明代码层面如何防止
比如:
- Excel 列名乱码时盲映射:openpyxl 读出的列名是乱码,按表头顺序映射导致流速和流向对比。改成加一步数值范围交叉验证(值在 0-360 的是流向,0.1-100 的是流速)
- 精确时间对齐忽略实际时差:雷达和浮标的时间戳有几秒偏差,精确 merge 丢掉了大量数据。改成
merge_asof模糊对齐,允许几分钟的窗口 - 图例不写清楚物理量:图上只写"参考数据""目标数据",用户不知道比的是流速还是流向。改成自动生成 "参考流速"/"目标流速" 或让用户传参
一个框架:三层防御
感觉 skill 能稳定交付的本质原因不是某个脚本写得多好,还是要有一些约束:
| 层级 | 做什么 | 例子 |
|---|---|---|
| 文档层 | 告诉 AI "这里有坑" | 反例章节 + 各阶段的规范指南 |
| 代码层 | 让 AI 想踩坑也踩不了 | circular_diff 强制调用、列名类型推断、NaN 显式报告 |
| 流程层 | 让结果多一道肉眼把关 | 人工检查点、自检清单、详细的日志输出 |
这三层还是比较重要。没有文档层,AI 不知道方向数据要特殊处理;没有代码层,它知道了也可能忘;没有流程层,错了也没人发现。
最后
以后遇到类似的重复性工作,可以想一下:能不能做成一个 skill?不一定每次都能,但思路摆在这里。这是 skill 链接: https://github.com/yangsir60/data-skill