你调试的时候让 AI 读过快照级别的上下文吗?
我遇到过那种特别自信的错误,到今天想起来还觉得后脑勺发凉:AI 告诉我一个队列"没配死信队列,要补一下",我信了,加了,推上去。后来发现人家早就配了——只是 AI 读的是周一拍的快照,DLQ 是周二加的。它拿着过期数据,用跟"今天天气不错"一样平常的语气,给了我会导致线上变更的建议。
注意,它不是不知道答案,它是拿到了一个错误的前提,并且对这个前提没有任何怀疑。这比"我不知道"危险一个数量级。这事儿我在心里给所有"给 AI 喂上下文"的工具记了个 P0。
后来翻了篇文章,主旨翻译过来就一句话:陈旧的基础设施上下文比没有上下文更危险。因为它产出的不是含糊的猜测,是具体且看似自信的错误答案。是的,是"看似自信"——AI 真是这门手艺的宗师。
作者做了个工具叫 Infrawise,专门从 AWS 和数据库里抽基础设施信息,把 DynamoDB 表、Lambda 配置、队列设置、数据库 schema 加代码访问模式全画成一张图,通过 MCP 让 AI 编辑器直接"看得见"真实环境。
然后有意思的部分来了。
它的缓存设计里有条规则:缓存读取函数在条目过期时返回 null,调用方把这个 null 当成"没有缓存",重新分析。不是带着警告继续用旧数据,是直接告诉你"老子不知道"。
作者说了一句话我记到现在:过期缓存比空缓存危险,因为空缓存至少会触发重新提取,而过期缓存会直接给你一个具体、自信、但是错的答案。
这跟评论里那句对齐上了——核心问题根本不是缓存策略,是"工具是否知道自己不知道什么"。大部分工具不知道。Infrawise 至少把"我不知道"变成了一个正式的状态,而不是让自己的无知穿上一件合理的旧数据外套。
而且它在返回给 AI 的响应里加了个 freshness 对象:analyzedAt、ageSeconds、stale、hint。这是拿着话筒对 AI 念:您正在使用的是 X 小时前的数据,超过 Y 小时了。
你猜怎么着?大多数 AI 调用工具的时候根本不会主动看数据新不新鲜。所以它不管这些,直接把这个对象塞进了响应里——逼着 AI 面对真相。这就好比一个同事每次交接工作时都附上一句"我这份数据是上周五的,你们最好确认下"。一句话,省了别人多少次踩坑。这种设计不是炫技,是补课——给 AI 补"什么叫自知之明"的基础课。
不过你如果以为文章只在讲"缓存过期就该返回 null",那就太天真了。
作者踩过一个更微妙的坑。他之前把元数据缓存设成 1 小时 TTL、图缓存设成 24 小时 TTL。看着像合理分工对吧?结果就是——服务会话跑过 1 小时后重建的图,元数据已经过期了,图还在,findings 静默变少。没有报错,没有警告,就是少了一批分析结果。
这种静默失效我太熟了。不是"啪"地一声崩溃,是"嘘"地一声变小。前者你能抓到,后者你可能在两周后复盘才发现损失已经发生了。
我干过同样的事,当时感觉就像在追一个永远慢半拍的电梯,你到了它门刚开,你伸手进去——门关了。
那怎么办?统一 TTL。24 小时全用同一个值——这是文章给出的解法,比细分策略简单得多,它把"这场事故的根因是 TTL 不协调"变成了历史。
还有更细的,它把缓存刷新时机设在会话启动:缓存一过期,服务任何工具调用之前先重新分析。文件保存时,监听器去抖 2 秒、只处理 TS/JS 扩展名、重新做 AST 扫描和本地 IaC 解析,不发起 AWS 调用。细节到尘埃里去了,但每一层都在回答同一个问题:怎么让 AI 手里的信息最大可能接近"此时此刻"。
真去抠实现细节,你会发现这工具把"数据年龄"做成了显式契约。通过 stdio 传输时,它把成功消息静默掉,只把警告带 infrawise 前缀输出到 stderr——避免污染 JSON-RPC。启动时缓存缺失,analyzedAt 为 null、stale 为 false——明确表示"年龄未知",而不是碰巧和新鲜值相等。这应该是全代码库里最优雅的优雅降级了,给了体面。
评论区的意见也值得划个重点。有一条一针见血:"这个设计的核心在于工具是否知道自己不知道什么。"另一条建议让 freshness 成为每次工具调用的契约组成部分——不同查询对数据年龄的容忍度本就不同。"基础设施拓扑"可以容忍几分钟,"当前队列配置"呢,你晚上改的配置,AI 早上还在用新鲜快照,这就注定会出事。
作者还提到已经把"来源水印"和"每调用年龄容忍度"存在 GitHub issue 里作为后续想法了,这种"把我的 todo 公开"的做法比那些把测试覆盖率刷到 90% 的 repo 真诚得多——至少它承认自己对"何时数据会老"这件事没有任何魔法般的判断力,只能给个通用策略。
说真的,这次我真觉得该作者想对了。在他之前"缓存过期"这碟菜,各家基本就是"换个 TTL 接着炒"。他把"过期语义"本身当成核心来设计——过期即空、统一 TTL、启动即刷新、明示数据年龄——这套组合打下来,才把"缓存"这件小事真正搬上台面,规格化了。
我上班的时候最怕的不是"不知道",最怕的是"AI 告诉我它知道,其实它拿到的是上周的快照"。现在至少有个工具把"数据新不新鲜"这个元信息糊在 AI 脸上了。
我会给所有在做 AI 基础设施工具的朋友留一句话,真心话:宁可让 AI 说"我不知道",也别让它拿着三天前的快照装懂哥。那句话怎么说的来着——过期缓存比空缓存危险,空缓存最多让你多等一会儿,过期缓存能让你多加班一宿。
(友情提示:如果哪天你发现自己的 AI 助手连"数据是几点几分抓的"都不报给你,趁早给它补一课。不然等它拿着一个月前的表结构跟你分析线上问题的时候,你流的泪就是你当初偷的懒。🫠)
