上周三晚上给新项目写 CLAUDE.md,写到第三段手停住了。这段话我上半年在另外两个项目里写过,一字不差,连“不要动 migrations”后面跟感叹号的位置都一样。
## 不要碰的东西
- migrations/ 下的任何文件!要改另开迁移,别就地改
- .env 以及任何带密钥的文件
- 测试里的 fixture 数据,要加可以,别改现有的
第一行是去年一次事故换来的。让实习生(Cursor,别问)顺手把字段类型统一一下,它把三个历史迁移文件就地改了,本地全绿,预发直接对不上。
事故是真的,教训是真的。但这三行我抄了七遍,每一遍靠我脑子里那根弦临时想起来。攒了一年的 prompt 经验,居然没有复利。
然后 11 月 2 号那篇论文撞进来。Taiming Lu 他们四个人的《Strategist: Evolving Reasoning with Agents》,挂 arXiv,NeurIPS 2026 收了。我本来只扫一眼摘要,被一句话钉住:现在的推理策略全是人手工写的,为某个策略攒下来的构建经验,没法复用到下一个策略上。
画外音:这话要让我自己写,大概会写成“我他妈写了七遍一样的东西”。人家发 NeurIPS 的,得端着。
论文把 agent 拆成两块:模型,和推理策略。策略就是“把模型调用变成最终回答”那套流程。读到这儿我第一反应是——这不就是我 CLAUDE.md 里那些东西吗,只不过我写在 markdown 里,他们非得写成代码。
重点就在“非得写成代码”这五个字上。
我一开始是抱着怀疑读的
“元智能体”这词我天然反感。这半年见过太多把“自动优化 prompt”换个名字叫元智能体的东西——拿个模型反复改提示词,跑个打分器,挑分高的,发论文。
Strategist 有一点不一样,我得承认。自动 prompt 优化是在一个任务上搜一段文本,搜完就结束,换个任务从头再来。它是在任务之间攒资产。前者调参,后者攒家底。这俩不是一个东西。
差别落在 blueprint 上。每个策略不是一段自然语言,是可执行代码,所有 blueprint 一起构成一个库。新任务来了,先从库里检索相关的,写候选,在真实样本上跑,按结果改,改完的候选再入库。下一轮任务能捡到上一轮的发现。
为什么“可执行”是全文最实的
我这两年攒的 prompt 全是 markdown,全都没法自动验证。它们唯一的质量保证是我写完读一遍,觉得“嗯,写得挺清楚”。
这就导致一个死循环:我改了一版,感觉变好了;过两周再改一版,感觉又变好了。两版到底哪个好,我不知道,因为没有任何东西能告诉我。所以我的经验不积累,只沉淀成一堆自我感觉。
代码不一样。代码能跑,能返回真或假,能被 diff,能被组合,能被放进 CI 里当门禁。一旦策略是代码,“测试—依据结果修改”这个循环才有落脚点。否则 Strategist 就是个批量生成 md 文件的机器,一点意义都没有。
# 这不是论文里的代码,是我自己写的对照
def check_migrations(diff_files):
for f in diff_files:
if f.startswith("migrations/") and f_status(f) != "A":
return False # 就地改了历史迁移,直接拦
return True
上面这段跟我在 CLAUDE.md 里写的那行“不要碰 migrations”是同一个意思。区别是:一个会真的拦住我,另一个指望实习生(和人)读完之后还记得。
库这个设计,我第一反应是“谁来做垃圾回收”
论文流程里有一句:每个候选策略都会被加进库,让后续任务能用上此前任务的发现。
只进不出。
三十个基准跑下来,库里会是什么样?我猜是一堆高度相似、只在某个特定基准的某个特定边界情况上有效的 blueprint。检索捞五条出来,其中三条是上一个任务的包袱。我没在论文里看到淘汰机制——也可能是我漏读了,如果它其实有,那我这段就是白操心,欢迎打脸。
但没有淘汰的库活不长,这是我踩过的坑,不是推测。
去年我试过把常用的 prompt 片段做成一个 git repo,带版本号,二十来个文件,每个都写了用途。用了不到两个月就荒了。荒掉的原因不是文件质量差,是没有触发点——没人强制你在开工前先翻一遍。你只会凭记忆现写,因为现写更快。
所以库能不能活,关键不在库本身设计得多好,在于有没有一个流程,把“先检索”变成开工的必经步骤。Strategist 里检索是第一步,这就是触发点。我自己那个 repo 缺的从来不是文件,是这一步。
这里我纠结了很久要不要把库夸一顿。夸它是对的,它确实解决了我上面说的“经验不复利”。但我更想说另一半:任何只进不出的知识库,三个月之后都会变成考古现场。
那两个数字,得拆开看
30 个基准里赢 24 个,平均准确率 74.7 对 74.0,推理成本低 39%。
大部分人只会记住 24/30。我觉得那两个数的重量差得远。
74.7 对 74.0 是 0.7 个点,摊在 30 个任务上,我不觉得这构成“更强”的硬证据。这种量级的差,换个随机种子、换个 judge 都可能翻过来。我甚至怀疑 24 胜里有几场是 0.1 个点的险胜。
真正硬的是那句“以低 39% 的推理成本达到相当的准确率”。39% 是成本,成本不撒谎——token 数、调用次数,这些是能数的。
所以这论文的正确读法不是“又一个更强的 agent”,是“把一个固定预算下的准确率顶上去一点,同时把地板价砍掉四成”。前者是学术圈的 KPI,后者是我这种自己掏订阅费的人真正关心的东西。
跨模型迁移那条,我最不信也最想信
论文还有一句我盯了很久:策略不用额外搜索就能迁到没见过的任务和其他模型上。
这句要真成立,比 24/30 值钱得多。
我的经验是反的。同一段 prompt 在 Claude 上和换个模型跑,表现能差出一个档。但注意——那是 prompt,是自然语言的软约束,模型的语气偏好一换就全乱。
如果策略真是可执行代码,比如“先抽实体、按类型分组、逐组校验、任一组失败就回退全量重跑”,这个骨架本身跟模型没关系,换模型只是每一步的执行质量变好变差,逻辑不动。
所以这条如果成立,恰恰是因为把策略从语言挪到了代码——跟前面 blueprint 的选择是同一件事的两面。这条论证链我是信的。
但我还是想抬一句杠。跨模型迁移说的是“不需要额外搜索”,不是“不需要重新验证”。骨架能迁,阈值不能。某个 blueprint 里写着“置信度低于 0.7 就走人工复核”,这个 0.7 换个模型就得重调。这类数字埋在代码的某个角落,检索的时候会不会被一起当资产捞走,论文没说。
我打算干的事
我不会明天就上 Strategist。它是一整套系统,我手头那两三个项目喂不饱它。但它给了我一件立刻能做的事。
把我那七份 CLAUDE.md 里重复的条目过一遍,分类:哪些是能判断真假的,哪些是软约束。
能判断真假的,改写成脚本,扔 CI 里。
# 只允许新增迁移文件,改动已存在的直接 fail
git diff --name-status origin/main...HEAD -- migrations/ \
| awk '$1 != "A" { print "改动已存在的迁移: " $2; exit 1 }'
这种东西的好处是它不读 md,也不管谁记不记得,要么过要么不过。
剩下那些没法判断真假的——“代码风格克制”“优先复用现有工具函数”“改之前先读上下文”——我暂时不删,但我知道它们是软的。软的东西不该拿来兜底,它只是提个醒。
还有一条我自己的规矩,从这次开始:新建项目的第一份 CLAUDE.md,不许复制粘贴,必须从空文件开始写。因为复制粘贴的那一下,正是我把“这条为什么存在”忘掉的那一下 😅。
本期缴税:七份内容雷同的 CLAUDE.md,和一年没复利的手工 prompt。下次见。
