十月三十号晚上,改一份给 agent 的 prompt,改到第三版,自己都改烦了。刷手机的时候看到 arXiv 上挂了篇 cs.CL 的预印本,2610.41435,《BlindToChange: AI Agents Can Find Changes When Asked But Do They Look When Needed?》。
副标题比正文更扎人。它问的不是“能不能找到”,是“该找的时候会不会想到去找”。
我把论文页面关了,回头看了眼自己那份 prompt,删了半页。
论文说的是这么个事:现在测 agent 检索,测的基本都是“给一个明确的问题,它能不能找到答案”,BrowseComp 那一类基准都是这个路子。这类基准有个结构上的毛病——它把“该查什么”直接写在题目里了。
画外音:开卷考试考 90 分,不能证明你懂这门课,只能证明你会翻书。
作者的说法更准:这类基准暴露不了一种失败模式——智能体没意识到自己的某些假设需要被验证。这句话我第一遍读没什么感觉,第二遍才反应过来,说的不就是我过去半年一直在干的事。
他们换了个题面。BlindToChange 用的是推荐类请求,题面本身平平无奇,但那个“显而易见的最优选项”,因为近期出了一件真事,不再适用了。关键在于,那件事没写在题面里。抽象一下大概长这样:
用户请求:帮我选一个 X,条件是 Y
(题面不提时效,不提“最近可能变了”)
真实情况:默认最优那个选项上个月出了事,不再成立
这个设计的关键在于:默认答案藏在模型的先验里,而先验恰恰是最容易过期的那部分东西。推荐类请求是个好载体——它天然有个“不用想也知道该选谁”的默认项,测的就是这个默认项还在不在。
有意思的是,这个基准比的是同一个事件的两种问法:一种直接把事件说出来,一种不说,只给最终的信息需求。表现差距最高到 27.5 分,而且是在高推理强度下测出来的。
27.5 这个数字我琢磨了一会儿。它说明的不是知识截止的问题——知识截止是个工程难题,谁都无解,只能等下一版。这个不是。信息就在网上,能力也在,查询工具也通着,同一个模型在“直接问它”的情形下答得挺好。仅仅是问法变了,分数就掉下来这么多。
推理强度拉满,只是让它想得更久,不是让它想到去查。这是两码事。我怀疑很多人(包括我)潜意识里一直把这两件事当成了一件。
再往下看,作者分析了检索轨迹,把超过一半的失败归结到一件事:agent 压根没去查那个相关事实有没有变。
没查,不是查了没查到。
这两个的差别比看上去大。查了没查到是工程问题,换检索器、加 query 改写、上多跳、调 top-k,慢慢磨总能磨上去。没查是另一回事——你没办法用更好的检索器去修一个根本不存在的问题。
# 查了没查到(可修)
query: “X 项目 最新 release” -> 结果为空 / 结果过时
# 压根没查(不可修,至少不是检索器能修的)
(无 query。模型直接拿先验作答)
我在这块停下来想了挺久。因为第二种情况,我在自己的活儿里见过太多次了,只是以前都归到“模型笨”这一类里,没往这个方向想过。
还有个细节:这个基准的事件是从 Wikidata 自动抽的,能定期刷新。这个设计我挺认可。静态基准的保质期比酸奶还短——两年前手工标一份“近期事件”的测试集,现在测的就是历史题,而且分数还漂亮得可疑,因为你测的是记忆不是检索。能自动刷新这条,看着是工程细节,其实是这个基准能不能活过明年这时候的关键。
回到我自己。
我的 prompt 里,其实一直在替 agent 做“意识到该查什么”这件事。举个我常写的句子:
帮我看看这个库现在还用不用得过,
顺便确认一下最近还在维护吗、有没有破坏性变更。
写完这句,它表现得很好。查 release、翻 issue、看归档公告,答得有模有样。
问题是我把这个当成了它的能力。
其实不是。是我把“该怀疑什么”提前想好了,喂给它,它做的只是执行。我那句话里“顺便确认一下”这四个字,才是整段里最贵的部分,而它是我写的,不是它想的。
这就是我一直在缴的智商税——把“我 prompt 写得细”记成“模型变强了”。然后哪次写得糙一点,就翻车,翻完还纳闷:同一个模型,怎么这次这么蠢。
后来想通了,也没那么打击人。这至少把责任划清楚了:你以为你在用工具,其实你在用“你的判断力 + 工具的执行力”。判断力那部分它替不了,至少现在替不了。
于是我加了个补丁。不是把 prompt 写得更细——那是治标,而且越写越长,最后自己都维护不动。我要求它把“我查了什么”吐出来:
回答格式:
1. 结论
2. 你为了得到这个结论,实际检索了什么(逐条列,不许合并)
3. 有哪些事实你没核实、是按常识假设的(逐条列,不许写“无”)
第 3 条是关键。我一开始只写了前两条,效果一般——因为第 2 条它可以只写“查了官方文档”,看起来像个正经人。第 3 条逼它把“事实”和“假设”分开摊在桌上,那些没去查的地方才会露出来。这招很土,但它让“没查”这件事至少变得可见了。
不过说实话,这个补丁也就那样。它要求我先知道“哪些地方可能有问题”——又绕回原点了。真正理想的,是它自己冒出那个念头,现在还得靠我。所以这篇不算解决方案,算一个我觉得能少翻几次车的土办法。
有人问我要不要把这类东西整理成一份 CLAUDE.md 模板发出去,让大家都抄。我犹豫了一下,觉得算了。抄配置不如懂原理这句话已经被说烂了,但我见过太多人把别人的 .cursorrules 搬过来当护身符,里面写满“请仔细检查边界情况”这种等于没说的话——跟论文里那个“压根没意识到要查”的毛病,是同一种毛病,只是换了个地方犯。
扯远了,回正题。
我现在自己的规矩就一条:凡是我自己都没把握时效性的问题,prompt 第一句先写“这件事里有些事实可能已经变了,先查再答,别拿记忆顶上”。
这句话很土,而且我知道这是退步——等于我又替它想了一遍。但至少它把那半页删掉之后空出来的地方,先拿这句话堵上了。
什么时候它能自己冒出这个念头,什么时候我再把这句话删掉。
估计还有得等。
