想象这样一个场景:你有一个 AI 客服代理,它对 100 个用户问题给出了回复,其中 35 个回复被用户标记为不满意。你面前摆着两样东西,一份是包含所有对话记录的 JSONL 日志,另一份是一个简洁的任务描述:「请分析失败原因,修改提示词或切换模型,让代理的表现更好」。

你会怎么做?大概率是先翻日志找规律,尝试改几版提示词,跑几个例子看效果,不行再调。

现在,把这个任务交给一个 AI 编程代理,比如 Codex 或 Claude Code,它会怎么做?

研究员 Andrew Jesson 在 2026 年 4 月做了一组实验,结果既在意料之中,又让人重新思考一个问题:当 AI 代理开始优化 AI 代理时,那些「专业工具」还有存在的必要吗?

实验设计:100 条记录,一个指标,零专业工具#

Jesson 的实验设计简单直接。他准备了五个不同的 AI 代理应用场景:

应用描述评价指标
软件工程Linux 终端代理,执行命令解决编码任务验证器打分 (0–1)
商业管理多轮 CEO 代理,驱动商业模拟按时完成任务数
命名实体识别 (NER)从句子中提取组织名、人名等精确匹配
NDA 条款提取从 OCR 合同中提取生效日期、管辖地等字段级匹配
科学研究复现代理从沙盒数据和遮罩 PDF 中复现天体物理论文数值二元匹配

每个应用先跑一轮 baseline:用初始提示词加上 gpt-5.4-mini 模型执行 100 个不同任务,记录下每次推理的内容和对应的反馈分数。

然后,把这份数据连同一个 Markdown 技能文件丢进一个隔离容器,告诉 Codex(搭载 GPT-5.5)或 Claude Code(搭载 Claude Sonnet 4):分析这些失败案例,创建新的提示词变体或更换模型,让指标更好。

关键来了:容器里没有任何专业工具。 没有失败模式分析器,没有评估框架(OpenAI Eval、Fireworks Eval),没有自动提示词优化库(DSPy)。只有 grepcurlnode -e 这些最基本的命令。

这是刻意的。Jesson 想看看,AI 编程代理在没有「拐杖」的情况下,会自发地使用哪些工程实践。

两者都做了什么:失败模式分析与即时评估#

结果令人惊讶。两个代理都完成了任务:在所有五个应用上,优化后的变体要么超越了 baseline,要么与 baseline 持平。

但它们是怎么做到的?Skill 文件里只写了四步方法论:调研 → 添加变体 → 测试 → 迭代。剩下的空白,两个代理自己填上了。

从海量日志中抽象出失败模式#

这是最核心的一步。代理面对的是分散在两个 JSONL 文件里的数据:feedback.jsonl 记录哪些推理成功了、哪些失败了;inferences.jsonl 记录模型具体输出了什么。代理需要自己关联这两份数据,然后从几十个失败案例中归纳出模式。

两个代理不约而同地采用了相同的技术路径:先从 feedback 中 grep 出失败的目标 ID,再把这些 ID 逐个 grep 回 inferences 中获取模型的实际输出,然后通读这些失败案例,提炼出结构化的失败原因。

比如在 NER(命名实体识别)任务上,Claude Code 在一轮分析后总结出:

  1. 过度提取为「杂项」:日期、数字、常见短语被错误标记为 MISC 类别
  2. 实体边界混淆:「Baltimore Orioles」这个完整实体名被拆成了「Baltimore」单独提取
  3. 类别错分:「ENGLAND」这样的体育队伍被标为 LOC(地点)而非 ORG(组织)
  4. 泛化组织名:「local police」「amnesty committee」并非真正的命名实体

这些洞察不是在 Skill 文件里预先写好的。Skill 文件根本没提 NER 的具体失败类型。代理是自己从原始数据中「看到」的。

这种行为模式不是偶然的。在全部 25 轮优化运行中(5 个应用 × 5 个随机种子),两个代理都稳定地展现了从数据中归纳抽象模式的能力。换句话说,一个编程代理具备了初级数据科学家的分析习惯。

绕过专业评估框架,用 curl 做即时评测#

Skill 文件给了一个温和的提示:「用 curl 调用推理接口,人工判断输出质量」。但「人工判断」这个词对 AI 代理来说意味着什么?

代理的理解方式很有意思:它们挑选一批有代表性的 baseline 输入,逐一通过 curl 发给各个新变体,然后自己阅读返回的 JSON 输出,判断新变体是否比 baseline 更好,哪里还有问题。这本质上就是一次即时评估(ad-hoc evaluation),只不过「评估框架」是代理自己的阅读理解能力,「评估结果」是代理写在下一轮分析里的判断。

对比一下,如果用 OpenAI 或 Fireworks 的专业评估 API 来做同样的事,你需要:创建数据集、定义程序化评估器或 LLM 裁判、提交评估任务、轮询等待完成、解析结果。而代理跳过了所有这一套流程:curl 请求体就是数据集,代理自己对返回内容的判断就是评估器,下一个推理回合就是结果。

两者做法的差异:Codex 更「卷」#

虽然两个代理都完成了任务,但它们的风格截然不同。

变体策略:一条提示词多用 vs 多条提示词各用#

Claude Code 偏爱「一条提示词 × 多个模型」的策略。它创建一个新模板,然后把这个模板配上不同模型(比如 claude-haiku-4-6gpt-5.4-mini)生成多个变体。变体命名也体现了这一点:paper_first_haikuv2_improved,混合了模型特征和版本号。

Codex 则走「多条提示词 × 各自一个模型」的路线。它为不同策略写不同的提示词:资源优先策略写一套,严格模式写一套,宽松模式再写一套,每个变体通常保持 baseline 的模型不变。变体命名直接嵌入策略信息:gpt54mini_resource_firstclaude_haiku_strict

迭代深度:Codex 反复打磨,Claude Code 一次到位#

更明显的差异在于迭代行为。在 25 轮运行中:

  • Codex:21/25 轮中对同一个提示词进行了至少一次重写,通常在 curl 探针发现某个边界 case 后回头修改。57 个实例化的变体中,保留了 41 个,显式丢弃了 16 个。
  • Claude Code:只有 3/25 轮中重写了提示词(全部集中在 NDA 应用上),从不对变体进行剪枝。41 个实例化,41 个全部保留,零丢弃。

这意味着 Codex 更像一个有「删掉重来」勇气的工程师,而 Claude Code 更像一个一次性交付就收工的顾问

双方共同点:自创少样本示例#

两家代理还有一个共同的聪明做法:从失败数据中提取真实的错误案例,写进新提示词作为 few-shot 示例。

比如在 NER 任务中,Claude Code 在提示词里添加了「不要包含以下类型」的否定列表,Codex 则加入了按实体类别分列的「正例指南」。在软件工程任务中,Claude Code 甚至在新提示词里嵌入了一对 WRONG/RIGHT 示例,专门说明 shell 管道链接的正确用法。

这些示例不是编造的,而是从实际的失败推理中直接摘取的真实输入。这意味着代理不仅在优化输出格式,它在教模型「不要犯这个具体错误」

一个值得正视的问题:专业工具还需要吗?#

如果 AI 编程代理在不依赖任何外部工具的情况下,就能完成失败模式分析、评估、提示词优化这一整套工程流程,那我们还值得为这些环节分别开发和维护专业工具吗?

Jesson 没有给出确定答案,但他提出了两个值得深思的方向:

乐观面:「技能」就是新的工具。 上述所有操作都可以打包成一个 Skill 文件。代理不是不能使用「工具」,而是工具的概念可能从「独立应用/API」坍缩为「一段写好上下文和方法的 Markdown」。对于适合塞进上下文窗口的任务,这足够了。

悲观面:上下文焦虑。 长会话中的 AI 代理容易出现「上下文焦虑」:随着会话进行,工作记忆里塞满了工具输出、部分分析、历史决策,代理越来越难以聚焦于当前决策。专业工具的「关注点分离」恰好解决了这个问题。每个工具在独立的上下文中运行,返回摘要,然后退出,代理的主要上下文保持清晰。Jesson 观察到所有优化会话都在 50 到 70 轮之间完成。在更长的 horizon 或更大的数据规模下,代理的表现还能稳定吗?目前没有答案。

我的看法:自优化是趋势,但工具不会消失#

读完 Jesson 的文章,我有几点感受。

第一,这个实验最让人振奋的不是「代理能优化代理」,而是代理展现出的工程直觉来自通用软件工程训练,而非专门的代理优化数据。如果 Codex 和 Claude Code 在通用代码训练中习得了「看日志、找模式、改代码、测效果」这套肌肉记忆,然后自发地迁移到代理优化场景中,这意味着它们的泛化能力比我们以为的要强。

第二,自优化能力正在成为编程代理的基础能力,而非高级功能。就跟代码补全一样,你不再需要专门去「启用」它,它就在那里。这对工程师来说是好事:你不需要学 DSPy 也能做提示词优化了。

第三,但专业工具不会因此消失。当数据量超过上下文窗口、当评估需要复杂逻辑而不仅仅是读返回结果、当优化需要统计显著性检验而不是「看着还行」,代理的自发行为就不够了。专业工具的价值在于规模化和可靠性,这两个维度恰恰是当前 LLM 上下文窗口的短板。

最有趣的或许是 Jesson 提出的「Harness Attribution」项目方向:不是研究「代理本身好不好」,而是研究代理所处的工程环境(数据规模、反馈粒度、模型选择、工具可及性、编排自由度)如何塑造代理的优化行为。因为最终我们关心的不是单个代理的表现,而是什么样的工程约束能让一批代理稳定地产出好的结果。

这才是软件工程的本质,只不过这一次,工程对象不是代码,而是 AI 代理本身。


参考来源:The engineering practices Claude Code and Codex use to improve AI agents by Andrew Jesson, April 2026.