AI审AI

上一个AI做的数据,让下一个AI来审,结果抓出一堆毛病。 做工资专户数据录入。导出平台数据一看,有几个人的月薪高得离谱——普通工人月入七万?不是工人工资高,是上一个智能体把数据做坏了。应发那列明明写的是两千多,实发列被填成了七万多。数字前面凭空多了一位。几个人,几个月,几十条记录,全部污染。 壹 · 四件套上场 不是随便看一眼就改。用的是审计四件套——四道关卡一轮轮过。 ① 规则脚本:字段级硬查。日期格式对不对、金额是不是正数、进账有没有对方账户。秒级跑完,数百条逐一筛查。 ② LangGraph:多步骤结构化审计。把收支表月出账总额和支付明细月实发总额逐月对比——有的月份差了好几万,有的月份干脆是零对十几万。 ③ 代码审查:让另一个Agent看生成脚本。边界情况、类型转换陷阱——脚本的bug和业务数据的问题,两回事,都要查。 ④ CrewAI:最后一道,多Agent协作做业务逻辑终审。 贰 · 到底谁靠谱 跑完第一轮发现问题 → 修 → 再跑验证 → 全绿。 不是AI靠不靠谱,是单靠一个AI不靠谱,三个互相审才靠谱。 那个把两千写成七万的智能体,单独干活的时候没人盯着。现在有了四件套——四个方向,四个工具,同时看。 任何一个方向的检查单独拿出来都有盲区。规则脚本看不出"这个人月薪不太对",代码审查发现不了"进账比出账少"。但四个凑在一起,盲区就重叠不起来了。 叁 · 最后 不是什么高深的技术。就是把"多看一眼"这件事制度化了。四个维度,四个工具,跑完验证,不绿不交。 别信任何一个AI的第一次输出。多过几道关,才是对数据负责。格式零错误,金额全对上,四件套跑完,全绿入库。 这跟《AI说不行的时候》讨论的是同一个底层逻辑——AI的能力不是问题,问题是你有没有给它足够的检查和反馈机制。单独一个AI的盲区,只有在多角度的交叉审视中才会暴露。 核心要点 单靠一个AI不靠谱,三个互相审才靠谱。 任何一个方向的检查单独都有盲区,四个凑在一起盲区就重叠不起来。 审计不是查一次,是制度化。 把"多看一眼"变成四道关卡:规则→LangGraph→代码审查→CrewAI,不绿不交。 数据质量是底线。 一个数字多一位、一个月份对不上,就会污染几十条记录。格式零错误,金额全对上。 写于永德 · 2026.06.10

2026年6月10日 · 美好需要创造

「一份施工组织设计的重生:从报审表空壳到完整技术文档」

这篇文章记录了一次完整的工程资料审计与重建过程。不只是"我们修了哪些bug"的工作日志,更是对工程资料领域几个底层问题的追问:合同数据和设计数据谁说了算?为什么隐藏行是最危险的陷阱?为什么生成器模式比手动改文档靠谱一千倍?——希望能帮到所有和工程资料打交道的人。 一、故事开始于一次"再看一眼" 甲方要交一份施工组织设计。项目是云南临沧一个低效林改造工程——5750亩林地,四个乡镇,312万的合同。我们之前做过一版,交了。 然后说"再审计一下"。 这一审,审出问题了。 不是小问题。是整个文档的根基有问题。 二、合同10000亩,设计5750亩——数据的双重人格 这是整个项目最大的底层矛盾。 合同签的是10000亩。中标的投标文件写的也是10000亩。按合同,四个乡镇的面积是:爱华镇5570亩、幸福镇3730亩、晓街乡600亩、忙怀乡100亩。 但当我们用 formatting_info=True 打开XLS设计附表,逐行检查隐藏行之后,真相浮出来了: 设计批准的改造面积只有5750亩。 四个乡镇的实际数据是:爱华镇2303亩、幸福镇2802亩、晓街乡603亩、忙怀乡42亩。差距4250亩。 差的这4250亩去哪了?在Excel的隐藏行里。爱华镇有69行隐藏数据(涉及忙回村、新寨村、田心村等6个行政村),合计4250亩——这部分被调出了六标段范围,归了其他标段。 但合同没改。 合同上写的还是当初投标时的估算面积。 这就是工程资料领域最经典也最危险的场景:商业文件和技术文件说的不是同一件事。 合同是商务承诺,作业设计是工程真理。两者不一致时听谁的?合同里其实写了答案——“具体以甲方经批准的作业设计为准”。这句话,就是整个数据选择逻辑的法理依据。 底层原则1:工程资料的权威来源是经批准的作业设计,不是商业合同。合同的数字只有在和设计一致时才能用。 三、隐藏行——Excel里最危险的幽灵 上面这个错误不是偶然的。我们来推演一下它是怎么发生的: 有人打开XLS设计表,筛选出"云县"的行,用SUM求和。Excel的SUM函数不区分可见行和隐藏行——它全加了。于是他得到了一个接近10000的数字,觉得和合同对得上,就用了。 但实际上这里面混入了大量不属于六标段的数据。 隐藏行不是"不重要的行"。它们是"不应该在这里的行"。 但Excel不会告诉你这个。你看到的是一张表,你求和的是所有数据,你以为你做对了——直到有人用 xlrd 的 formatting_info=True + rowinfo_map[rid].hidden 把每一行拆开来看。 这个教训远远超出了XLS文件格式的范畴: 底层原则2:任何聚合数据都要追问"你的分母是什么"。求和之前先问:哪些行应该参与计算?哪些行不应该?如果数据源本身有隐藏/过滤/排除逻辑,你的工具必须能感知到它。 从信息论的角度看,隐藏行本质上是一种带外信息(out-of-band information)——数据的含义不仅取决于单元格的值,还取决于你看不到的格式属性。忽略带外信息,就是在用一个不完整的信号做决策。 四、生成器模式——数据与呈现的解耦 上一版施工组织设计还有一个更隐蔽的问题:面积数据分散在多个docx文件里,有些是手动填的,有些是从不同来源抄的。当发现面积数据需要修正时,要一个一个文件打开改。 这次我们建了一个 common_data.py——项目所有关键数据(面积、预算、工期、公司信息、各乡镇明细)的唯一真相源(Single Source of Truth)。然后写了8个生成脚本(gen_*.py),每个脚本只做一件事:从 common_data 读数据,填充到文档模板里,输出 docx。 修复的效果立竿见影:改 common_data.py 一行 → 重新运行所有 gen 脚本 → 所有产出文件自动更新。不需要手动打开任何一个 docx。 这不是什么新技术。程序员管它叫 DRY(Don’t Repeat Yourself),数据库管它叫规范化(Normalization),工程管理管它叫"统一数据源"。名字不重要,重要的是: 底层原则3:如果一个数据出现在两个以上的地方,它就不应该以手动方式维护。建立唯一真相源,让所有产出文件从它派生。这不是偷懒,是防错。 手动复制粘贴是工程资料质量的第一杀手。不是因为人不行,是因为人脑不适合做"在多处保持同一数据完全一致"这种事。这种事应该交给代码。 五、审计四件套——为什么要用四种不同的视角看同一件事 这次审计我们动用了四个工具,按固定顺序跑: 顺序 工具 擅长 盲区 ① 规则脚本 数量/格式一致性(快,秒级) 看不懂上下文 ② LangGraph 多步骤交叉验证(灵活) 需要写好prompt ③ 代码审查 代码级逻辑bug 不看数据文件 ④ CrewAI 业务逻辑/语义合理性 慢,依赖LLM质量 四个工具各自发现了不同的问题: ...

2026年6月9日 · Tianbing Zhao

当一个工程师决定用 AI 打造「个人内容工厂」:关于效率、规则与技术降维的真实实验

一、引子:深夜的 WSL 命令行 凌晨一点,光标在 WSL 终端里闪烁。屏幕上是第 14 次 curl 调用返回的 JSON: {"errcode":40001,"errmsg":"invalid credential"} 不是域名备案的死循环,就是 API 令牌的隐藏规则;不是签名算法文档的暧昧,就是 OAuth 流程中某个神秘的 redirect_uri 校验。每一家平台都像一座围城,用厚厚的 API 文档砌起高墙,对闯入者说:要么遵守我的规则,要么滚。 而他想要的,只不过是一个简单到近乎原始的需求——把自己写的长文,从 WSL 的终端,推向手机锁屏上的一条通知。 这听起来像是一个技术宅的自找麻烦。但如果你仔细看,会发现这其实是这个时代每个个体创作者都在面临的困境:我们赖以生存的数字工具,正在被大公司的“标准化”逻辑层层加码。一个简单的念头,包裹在 API 鉴权、域名备案、SSL 证书、Webhook IP 白名单的层层叠叠之中——等它穿透这些门槛时,最初那点灵光早已灰飞烟灭。 这不是一个技术问题。这是一个系统性问题。 二、深潜:被“标准化”驯服的创作者 从“内在文明”框架来看,这场个人内容工厂的搭建实验,本质上是 个体与环境之间的一场博弈。 工具共生论:谁在驾驭谁? 工具不是中立的。设计者的价值观早已被编码进每一行代码。 企业微信的 API 文档,是为“企业开发者”写的。它的鉴权流程假设你有法务团队审核隐私条款,有运维管理 SSL 证书,有产品经理梳理 API 调用的业务场景。当你作为一个“个体”去使用它时,你会发现自己被一个错位的身份期望绑架了——平台默认你是组织的一部分,而你不是。 这就是 工具共生论 所警示的:当工具与使用者的天然规模不匹配时,工具就开始反向塑造使用者。你不是在驾驭工具,而是在为工具的规则做牛做马。调试了三个小时 API 的开发者,和被困在算法推荐里无法自拔的短视频用户,面对的其实是同一个问题——工具本是外骨骼,但你正在变成它的容器。 环境回路论:谁塑造了谁的认知? 更深一层,这个困境揭示了 环境回路 的隐秘力量。 你的物理环境(WSL 终端)、社会环境(没有企业服务团队)、数字环境(微信生态的封闭性)构成了一条完整的回路。在这条回路中,每一次 API 调用的失败不仅仅是代码层面的错误,更是一次“环境记忆”的写入:你开始相信“这事一个人搞不定”,你开始怀疑自己的技术能力,你开始觉得“大公司的东西就该这么复杂”。 这就是环境回路最阴险的地方——它不声张,只是不断让你碰壁,直到你把壁当作常态。 真正的突破发生在你跳出这条回路,从更高维度审视它的时候。当意识到“我不是技术不行,而是用错了工具范式”的那一刻,环境回路的锁链就断开了。 三、破局:技术降维的微小实验 1️⃣ 放弃重型 API,拥抱 Webhook 转折点异常简单:不再去管什么 access_token,不再理会 OAuth 流程。从“与企业系统对接”的思维框架中跳出来,转而问一个更本质的问题: 我只是想把一段文字从点 A 送到点 B,最短路径是什么? ...

2026年5月18日 · Tianbing Zhao

别再轮询了。你的人生应该 Event-Driven。

人类正在经历一场前所未有的姿势悲剧。 我们像一群被钉在椅子上的稻草人,每隔几分钟就下意识地掏出手机——刷新一下邮件、刷一下数据面板、刷一下抢票页面。明明是个有高级认知能力的物种,行为模式却退化成了实验室里踩踏板的鸽子:不断地按键,只为了确定下一颗食丸有没有掉下来。 这就是系统的耻辱。 你写代码的时候都知道不要用 while True: time.sleep(5) 做轮询——他在消耗 CPU、空转 IO、让风扇狂转却什么都没等到。但在生活里,你把自己活成了一个轮询进程:打开页面、F5、没变化;再 F5、还是没变化。一直刷到凌晨两点,直到那个绿色的"有票"按钮终于出现,而你因为手抖错过了最后的 0.3 秒。 别骗自己了。你缺的根本不是手速,你缺的是一个事件驱动的架构。 问题:你还在用人肉轮询? 把现代人的信息焦虑拆开,你会发现一个可悲的共性: 我们在用最原始的方式,对抗一个早已成熟的异步世界。 服务器宕机了——你没有第一时间收到告警,因为邮件进了垃圾箱,短信延迟了 20 分钟。你在监控面板前盯了三个小时"绿色正常",然后错过了一条真正要命的消息,原因是你的大脑已经对满屏绿色产生了视觉疲劳。 抢票/抢课/抢茅台——你在第三方的 APP 里充了会员,那个 APP 在后台疯狂刷新接口,把手机的电量烧到发烫,把流量吃到月底欠费。最后告诉你结果的方式是给你手机弹一个系统通知——而你当时正好在看短视频,手指一划,错过了。 爬虫跑完了,脚本执行完了,收益计算完成了——但你在外面。你在等回家,等打开电脑,等终端里的那行 print。那几个小时里的决策窗口,就这么白白流走了。 这个时代最大的信息差,从来不是别人知道你不知道——而是消息到你面前的时候,别人已经走完了下一轮。 而且,那些号称"通知推送"的商业方案呢? 臃肿、耗电、要注册、要下载 APP、要开后台权限、要忍受广告。你只是想在自己的微信上收到一条简单的消息,那些平台却恨不得在你的手机里安一个全家桶。 你缺的从来不是工具。你缺的是一个真正属于你的、干净的、一秒直达的通道。 解决方案:用 WxPusher 让你的人生变得 Event-Driven 我花了不少时间寻找答案。试过 Server酱(停服了)、试过 Pushover(要钱、要装 APP)、试过 Telegram Bot(优雅但国内收不到推送,每天得挂着代理)。 直到我遇到 WxPusher。 一句说透——WxPusher 是依托微信服务号的消息推送接口。你发一个 HTTP 请求,你的微信就收到一条消息。 没有 APP 需要安装。没有后台需要保活。没有复杂的公众号注册流程。不需要服务器,不需要证书,不需要心跳包。就是一行 cURL。 从"我要亲自盯着"到"事件来了它会找我",这个转变只需要两步。 它不是又一个通知工具。它是把你从轮询地狱里捞出来的杠杆。 你的每一个脚本,每一个定时任务,每一句 if + trigger,突然都有了直接通向你手机的权限。 这才是你应该拥有的控制力。 那些让人觉得"相见恨晚"的场景 我把它装进了我每一天的缝隙里,然后发现——以前我为什么没早点用。 你的服务器,终于有了一个 24 小时不睡觉的合伙人 CPU 超过 85%?数据库连接池撑不住了?磁盘只剩下 5% 了?你的 Prometheus 上面挂了 Grafana,Grafana 报警邮件发给了你的 QQ 邮箱,QQ 邮箱手机端推送到你的通知栏,被你玩游戏的时候一个左滑清掉了。 ...

2026年5月2日 · Tianbing Zhao

自动化生存指南:如何用 Python 构建你的专属「内容缓冲池」?

你每天打开多少次信息应用? Gmail 的红点、Telegram 群聊的未读、RSS 阅读器的计数、Slack 的频道。每一枚红点都是一次认知打断。每一次滑动刷新都是一次注意力税。 我统计过自己的数字行为:平均每天在不同信息源之间切换 87 次。87 次上下文重建。87 次「我刚刚在想什么」。 这不是信息过载。这是信息碎尸——你的注意力被拆成 87 块,扔进了 87 个不同的桶里。每块都不够深,无法形成认知。 所以我在想:能不能反过来?不主动去「消费」信息,而是让信息自己汇聚到一个地方。等我有认知带宽的时候,一次性深潜处理。 于是有了 内容缓冲池(Content Buffer Pool)。 ...

2026年5月1日 · Tianbing Zhao

别再做效率难民:为什么一行粗糙的代码,胜过一万篇完美的干货?

凌晨两点,我盯着 n8n 的 workflow 编辑器,屏幕上蜿蜒着二十几个拖拽节点。 这个号称"低代码自动化神器"的工具,为了把一个 Markdown 文件从 A 点搬到 B 点,消耗了我三个晚上的耐心。安装依赖冲突、Docker 镜像拉不下来、某个 node 莫名其妙 timeout。每一次点击"测试 workflow",都在用我的认知带宽去喂养一个本不该存在的抽象层。 我把 n8n 的容器停了。然后写了一行 Python。 shutil.copy(src, dst) 三行代码。零依赖。零配置。零心理负担。 这不是一个关于技术选型的故事。这是一个关于认知能量的故事。 ...

2026年5月1日 · Tianbing Zhao

我整理了 16 条程序员真实踩坑,每条四步拆解:症状→根因→修复→避免 踩过坑、修好坑、记住坑——同一个坑不踩第二次。 写了几年代码,发现自己踩过的坑有一个共同特点:修的时候花了好几个小时,但根因往往就一行代码的事。更气人的是,过几个月又踩一遍。 于是我做了一件事:把踩过的坑按统一格式整理出来——每条固定四个段落: 🩺 症状:你看到什么? 🔬 根因:到底为什么出问题? 🔧 修复:怎么做? 🛡️ 怎么避免:下次怎么不踩? 攒了 16 条,放在 GitHub 开源仓库里,也搭了个简单的展示站。 举三条最有共鸣的 1. Git push SSL 握手失败 症状:git push 到 GitHub 每次报 SSL/TLS handshake 失败 根因:Git 没走系统代理,直连被墙 修复:一行命令 —— git config --global http.proxy http://127.0.0.1:7897 教训:新机器第一件事就是设全局 Git 代理,不要只给单个仓库设 2. Python 缩进导致 140 行代码静默跳过 症状:AstrBot 微信公众号被动回复永远不执行,日志无任何报错 根因:140 行被动回复代码缩进在了 if active_send_mode: 块内部(12 空格对齐),当 active_send_mode=False 时整个 if 块被跳过 修复:代码提到 if 外面,和 if 同级缩进 教训:Python 缩进错误在特定条件下才暴露——代码在,逻辑在,就是进不去。排查时先怀疑控制流缩进 ...

Tianbing Zhao