如何为任意AI模型打造强大外壳
本文由Phosphen撰写,详细介绍了如何构建一个AI模型的“外壳”(harness),即围绕模型搭建的框架,包括上下文、循环、工具、检查和记忆等组件,以实现模型无关的稳定输出。

我运行的全套工具链、构建自己系统所需的具体步骤和安装模块,以及一个中档模型达到前沿水平输出的凭证。
收藏本文,我们开始吧。
过去每发布一个新模型,我都要花一个周末重建整个环境。
现在我对发布几乎毫无感觉。我能从几乎任何我指向的模型中获得前沿水平的输出,因为过去一年我一直在构建工具链,而不是追逐模型。
事实证明,模型是你替换的部分。工具链是你保留的部分。
大多数人仍在做相反的事。
他们升级模型,却对周围的设置置之不理,然后纳闷为什么新模型用起来就像换了标志的老模型。
杠杆作用几个月前就不再是模型了。它转移到了框架上,而几乎没有人注意到。
这是我希望一年前就拥有的指南。它来源于三件事:
- Anthropic 自己的工程文档。
- 我一年来自己的构建经验。
- 六月发生的一起非常公开的事故:当时最强大的模型被下架了十八天,而我的工作从未放缓。
十四个步骤。三大部分。一把梯子上的五级横档。别再追逐模型了。开始构建它们插入的主体。

梯子:提示词 -> 上下文 -> 循环 -> 工具链 -> 环境
第一部分 · 转变
01. 模型从来不是变量。
两年来,游戏的关键是模型。
更好的模型一发布,你就把整个工作流迁移上去,获得更好的输出,然后等待下一个版本。模型是你掌握的东西,也是决定你结果的东西。
那已经结束了,而大多数人还没有注意到。
以下是令人不安的版本。
排名第一的模型和排名第十的模型之间的差距,小于好的工具链和差的工具链之间的差距。
在排行榜上最好的模型周围放一个薄弱的环境,你得到的演示会在接触时崩溃。在中等模型周围放一个强大的环境,你得到的是能交付的工作。
模型的排名不再是决定性因素。围绕它的系统质量接管了杠杆作用。
杠杆转移了。它从模型转移到了框架上:
- 你喂给它的上下文。
- 它运行的循环。
- 它能触及的工具。
- 能抓住它的检查。
- 在运行之间存活的记忆。
那个框架就是工具链。它是几乎没有人正在构建的部分,现在是整个游戏的关键。
Boris Cherny,Claude Code 的构建者,一直在公开场合反复提及这个观点,而这也是贯穿本指南的无声论点。
工作并没有变得更容易。杠杆作用点只是向上移动了一层,从模型转移到了驱动它的系统。
你可以大致衡量这种转变。
Anthropic 曾表示,他们自己的工程师现在每天合并的代码量大约是 2024 年的八倍,Anthropic 自己也称这几乎肯定是夸大其词了。
你可以随意争论这个倍数。但机制是无可争议的。获得超额输出的人并不是在输入更好的提示词。他们构建了为自己生成提示词的循环。
02. 测试:相同的工具链,两个模型。
你不必相信我说的一切。今天自己运行测试。
从你本周的工作中选一个真实任务。运行两次:
- 运行1:你的设置在廉价的中档模型上。
- 运行2:完全相同的设置在你所能访问的最昂贵的前沿模型上。
然后观察差距:
如果你的设置只是一个提示,差距会非常大,你会正确得出结论:你需要最好的模型。
如果你的设置是一个真正的工具链,两个输出会足够接近,以至于你会停止关心底层是哪个模型。
这与运气无关。这是一个实验中的完整论点:结果从来不是来自模型。
它们来自你围绕模型构建的系统,而那个系统在模型变化时不会改变。
用通俗的话说,一个工具链是五个叠加在一起的部分:
- 上下文。正确的文件、规则和记忆在正确的时间到达模型。一句更聪明的提示做不到这一点。
- 循环。模型获得一个目标并朝着它工作,而不是等待你的下一条消息。
- 工具。它可以读取、运行和编辑真实的东西,而不仅仅是描述它们。
- 检查。某些东西可以在你不在场的情况下使工作不合格。
- 记忆。今天学到的东西能存活到明天,而不是重置。
这些都不存在于模型内部。所有这些都是你可以构建的。
本指南的其余部分就是我如何一步一步地构建它,附上具体的命令。
03. 诚实之门:你现在真的需要它吗?
在你构建任何东西之前,请诚实自问,那个大多数指南略过以让你继续读下去的问题。
你可能还不需要完整的工具链。
强求它正是人们最终维护一个无人使用的系统的方式。
一个精准的提示在三种情况下仍然胜出:
- 真正的单次任务。任务只发生一次。
- 探索性工作。你还不知道“完成”是什么样子。
- 需要判断的任务。“完成”只有你能决定。
在这三种情况下,工具链比直接询问更慢、更昂贵、更脆弱。
工具链在更狭窄的一组条件下才能体现其价值。缺一个条件,它的成本就超过它带来的回报:
- 工作是重复的。工具链在多次运行中摊销其设置成本。为只做一次的事情构建,你只是做了额外的工作,没有节省任何东西。
- 检查是自动的。必须有东西能在你不逐行阅读的情况下使工作不合格:测试、类型检查、构建、代码检查器。没有自动门,你就得回到椅子上,做工具链本该消除的精确工作。
- 预算能承受浪费。循环会重新读取、重试和探索。这会消耗代币,无论是否有东西交付。这项技术对于拥有免费代币的人来说显而易见,对于按计划付费的人来说则显得鲁莽,两者对自己情况的判断都是正确的。
- Agent 拥有真正的工具。日志、运行它编写的代码的方式、一个能看到什么出问题的环境。没有这些,循环就会盲目迭代。
如果你不符合其中一条,请收藏本文,暂时继续手动输入提示。
你没有落后。你只是在诚实地面对你的工作量。
如果你符合条件,请继续阅读。攀登是值得的。
第二部分 · 构建工具链
04. 第一级横档:提示词及其天花板。
每个人都从这里开始,这没什么不对。我的第一个真正设置正是这样:一个我花费数周调优的出色提示词,每次坐下来时从笔记中复制。
然后任务变大了,提示词崩溃了。
不是因为模型变差了。而是因为一次性提示词本身就有一个天花板。天花板以三种方式显现:
- 一旦上下文窗口填满,它会忘记一切。
- 它无法在十个步骤中保持计划而不丢失线索。
- 它无法检查自己的工作,所以你需要检查所有工作。
提示词没有辜负你。是提示词周围缺乏任何东西辜负了你。
适用于:快速回答、一次性编辑、一次性脚本、探索你还不知道答案形状的问题。
在以下情况触顶:任务重复、跨越多个步骤、依赖于上次发生的事、或者必须在交付前检查。
解决方法从来不是更聪明的提示词。
超过某个点,调整提示词就像在一个太小的房间里重新布置家具。
解决方法是构建下一级横档。从这里开始的每一级横档都添加了裸提示词无法拥有的东西。
05. 第二级横档:上下文,喂给模型,而不是试图比它更聪明。
模型很聪明,但它是盲目的。它只知道你放在它面前的东西。
大多数人对弱回答的反应是重新措辞问题。
获得前沿结果的人的反应是修复模型能看到的东西。
这是今年整个领域转向的纪律,它有一个名字。
- 提示工程 优化问题。
- 上下文工程 优化问题所在的一切:
- 固定规则。
- 实际代码。
- 相关记忆。
- 可用的工具。
这是一个你设计的系统,而不是你打磨的一句话。
具体的做法是给你的 Agent 一个家和一个比聊天更持久的记忆。我使用 Claude Code,因为它是我找到的最好的工具链主体,并且它免费读取所有这些内容。
现在就做。安装 Claude Code:
## Windows (PowerShell)
irm https://claude.ai/install.ps1 | iex
## macOS / Linux
curl -fsSL https://claude.ai/install.sh | bash
## 或者,如果你已经在使用 Node
npm install -g @anthropic-ai/claude-code
然后在你的项目根目录下放一个 CLAUDE.md。这是你整个设置中杠杆率最高的单个文件。Claude 在每次会话开始时都会读取它,永远如此,无需你要求:
## CLAUDE.md
### 这是做什么的
[一行:项目做什么]
### 运行方式
install: [你的安装命令]
test: [你的测试命令]
### 规则
- [你的约定]
- 从不碰 [x]
- 总是 [y]
保持它不超过两百行。它是一组指令,不是小说,臃肿的文件会被忽略。

上下文:喂给模型的内容

真实的 Claude Code 文档 - CLAUDE.md
这一个文件就是两个 Agent 之间的区别:
- 没有它:一个每次会话都从零开始重建整个项目的 Agent,像金鱼一样。
- 有它:一个出现时就已经知道自己在哪、规则是什么的 Agent。
这一级横档中的其他所有内容都是同样的道理。修复模型能看到的东西,大多数答案就会自行修复。
06. 上下文,更深入:什么该在窗口内,什么不该。
在这一级横档上,错误是认为更多的上下文就是更好的上下文。并非如此。
窗口是一个预算。你花在噪音上的每样东西都要付出两次代价:一次是代币,一次是模型的注意力。
一个有用的思考方式:上下文窗口是一张桌子,而不是一个图书馆。
你不会把整个图书馆堆在桌子上。你放上这项任务需要的三样东西,然后清理掉其余部分。
好的上下文工程,关于你留下什么和放进去什么同等重要。
什么值得放在桌子上:
- 固定规则。你的 CLAUDE.md。每次运行都读取。你最便宜、回报最高的上下文。
- 相关代码。这项任务实际触及的文件,而不是整个仓库。将 Agent 指向模块,让它需要时再拉取其余部分。
- 任务自身的记忆。上次运行同一任务时发生了什么:尝试了什么,失败了什么,决定是什么。写下来,而不是留在你已关闭的聊天记录里。
- 工具。这项任务允许它调用的工具集合,仅此而已。
什么不应该放在桌子上:
- 过时的文件。
- 全部的 git 历史。
- 三个月前的对话。
- 任何你因为感觉“彻底”而包含的东西。
彻底性是一种上下文税。
获得干净相关窗口的 Agent 次次胜过被所有东西淹没的 Agent。
上下文是大多数人直接跳过,去追求听起来更令人印象深刻的东西的那级横档。不要这样做。
糟糕上下文之上的伟大循环,是快速大规模自信犯错的方式。
07. 第三级横档:循环,停止手动提示,开始循环。
这是让我豁然开朗的一级横档,也是第一次尝试时感觉最奇怪的一级。
两年来,我每一步都手动输入提示。打字、等待、阅读差异、再次输入。我就是那个循环。
转变是停止成为那个进行提示的东西。
你给 Agent 一个目标和追逐它的工具,然后让它运行:
- 选择下一步。
- 调用工具。
- 对照目标检查结果。
- 继续直到检查通过。
你设计那个循环一次。从那时起,循环就会为 Agent 生成提示。
在 Claude Code 中,整个事情就是一个命令。/goal 让 Agent 一轮接一轮地运行,直到达到完成条件,条件就是纯文本,不需要引号:
## Claude 运行多轮,直到一个独立的快速模型确认完成条件。
## 而不是直到构建者觉得完成。
/goal 不要引号:tests/auth 中的所有测试通过且 lint 干净,否则在 6 轮后停止

Agent 循环
以下是让它工作的关键部分。
每轮之后,/goal 将条件和对话交给一个独立的快速小型模型(默认为 Haiku),并问一个问题:这是真的完成了吗?
编写代码的模型不是决定它完成的模型。内置的第二意见是整个窍门,也是下一步的主题。
你不再为步骤提供提示。你为循环提供一次提示,然后循环自行运行。
08. 停止条件:让构建者远离检查者。
这就是循环悄悄出错的地方,也是代币账单的来源。
循环需要一个循环自身无法移动的终点线。
失败模式是让编写代码的 Agent 决定代码是否完成。用 Addy Osmani 在循环工程中的原话说,“编写代码的模型在给自己的作业评分时实在太仁慈了。” 它说服自己“足够好了”,然后在一半完成的工作上触发完成信号。
解决方法有一个名字。Anthropic 早在 2024 年 12 月的工程帖子中就将其记录为评估者-优化器模式,远在这套词汇流行之前。
该模式:一个模型生成,另一个模型批评,你重复直到评论者满意为止。构建者和检查者不是同一个模型,理想情况下甚至不是相同的指令。
这正是 /goal 在底层所做的工作。单独的检查者在每轮之后运行,所以终点线从来不是构建者的意见:
## 检查者是不同的、全新的模型;硬停止存在于条件本身中。
/goal tests/auth 全部通过且 lint 干净且没有新的 TODO,否则在 6 轮后停止
两条规则使这安全,且都不是可选:
- 检查是客观的。一个通过或失败的测试。一个编译或不编译的构建。一个返回零或非零的代码检查器。不能是第二个有意见的 Agent,那只是两个乐观主义者的共识。
- 循环有硬停止。一个迭代上限、代币预算或时间限制,写入条件中。没有这个,一个雄心勃勃的循环会一直运行,直到速率限制或账单替你注意到。
还有一个工具,所以你不会混淆它们。/goal 运行直到条件成立。/loop 是另一个命令,用于按计划运行,比如按定时器进行夜间分类处理,而不是运行到完成。不同的任务。不要嵌套它们。
这一级横档搞错了,循环就会无声且昂贵地失败。搞对了,你就可以走开,这正是你构建它的全部原因。
09. 第四级横档:工具链,子 Agent。
一个原始的循环会漂移并信任自己。把它变成一个你可以放心离开的工具链,需要一组围绕它的零件。第一个也是最重要的是子 Agent。

工具链:Claude Code,逐一部件
子 Agent 是一个专门的助手,在它自己的上下文窗口中运行,有自己的指令、自己的工具,有时还有自己的模型。它重要有两个原因:
- 它将旁支工作排除在主线程之外。搜索、读取日志、探索:这些都不会弄乱你的主对话。
- 它使检查者与构建者是不同的思维。这是让子 Agent 物有所值的部分。
在 .claude/agents/ 中放一个文件,当工作匹配时,Claude 会委托给它:
---
name: reviewer
description: 审查差异,查找错误、缺失测试和有风险的更改。
tools: Read, Grep
model: sonnet
---
你是一个严格的代码审查者。对于给定的差异,只列出真正的问题:
缺失测试、未处理的错误、硬编码值、安全风险。
对每个问题,指出文件名并给出单行修复。不要表扬。不要软化。

真实的 Claude Code 文档 - 子 Agent
在运行的工作循环中,通常的分工是三个角色:
- 探索者。找到工作。
- 实现者。编写它。
- 验证者。对照规范检查,不接触实现者如何说服自己做出选择的过程。
验证者是让你安心睡觉的那个。给它强大的模型和严格的指令,即使成本更高。
一个警告。
每个子 Agent 都会进行自己的模型和工具工作,因此它们比单次通过消耗更多的代币。把它们用在真正值得为获得第二个独立意见付费的地方,主要是检查。
不要因为看起来令人印象深刻就启动一个集群。一个有一个优秀验证者的循环,胜过五个话多但无真正把关的助手。
10. 工具链:Hook和权限。
子 Agent 决定谁做工作。Hook和权限决定工作在你没看着时被允许做什么。
Hook在循环的固定点自动运行一个命令,因此规则无需有人记得去执行就能生效。
格式化、检查、在危险命令运行前阻止它的守卫。
把它们放在 .claude/settings.json 中:
{
"hooks": {
"PostToolUse": [
{ "matcher": "Edit", "hooks": [
{ "type": "command", "command": "npm run lint -- --fix" }
]}
]
}
}
那一个Hook意味着循环所做的每次编辑在落地后都会立即被检查,永远如此,无论 Agent 是否记得。Hook把“请总是做 X”从希望变成了事实。
权限是另一半。
循环在你睡觉时运行,这意味着它的爆炸半径是你允许的一切。提前决定什么是不允许的,并且无论 Agent 在运行过程中决定什么都保持不变:
- 默认只读。每个新循环都以允许它完成工作所需的最窄权限开始,只有在你遇到真正障碍时才放宽。
- 在危险事物周围设置硬墙。支付、认证、生产配置,任何不可逆的东西。没有人在路径中,循环不得触碰这些。
- 定期重新审计。经典的漂移是一个循环为了便利添加了“仅仅一个”写权限,然后从未移除它。权限范围蔓延是帮助性的循环变成无人值守的负债的方式。
Hook和权限不引人注目。但它们也是整个系统可以安全无人运行的原因。
一个你无法信任在无人看管下运行的工具体系不是工具链。那是一个非常昂贵的观看 Agent 工作的方式。
11. 工具链:技能、记忆和 MCP。
另外三个部分把一个今天工作的循环变成一个随着时间的推移变得更好并且能触及你真实工具的循环。
技能 是你如何一次性编写项目知识,并在每次运行时读取它们。
技能是一个包含 SKILL.md 的文件夹,里面有指令和元数据,加上可选的脚本和参考文件。
对于循环来说,关键是复利。没有技能,循环每次循环都会从零重新推导你的约定。添加技能后,每次运行开始时它们已经知道这些约定。
“我们不这样做因为那次事故”存在于外部,一次性编写,每次运行都遵守。
记忆 是听起来太蠢而无关紧要的部分。它实际上是每个存活超过一天的循环的脊柱。
Agent 默认会忘记。它们这次会话学到的东西明天就没了,除非你把它写下来。
所以写下来,在一个存在于对话之外的文件中:
## STATE.md - auth 质量循环
### 上次运行
2026-07-05 03:30 · 7 个失败已分类,3 个修复已起草,4 个已升级
### 进行中
- claude/fix-auth-token-refresh - 本地测试通过,等待 CI
### 经验教训(写在这里,而不是聊天记录里)
- 2026-07-04: 这个运行程序在 PowerShell 中遇到 TLS 问题。使用 bash。
- 2026-07-03: tests/e2e 需要 Stripe webhook 密钥在环境变量中。如果缺失则跳过。
规则很简单:Agent 会忘记,文件不会。
有状态的循环明天从它停止的地方继续。无状态的循环每天早上重新开始,这正是循环感觉没有学习的大多数原因。
MCP 是循环触及你真实工具而不是仅触及文件的方式。
基于模型上下文协议,连接器让 Agent:
- 读取你的问题跟踪器。
- 查询数据库。
- 访问暂存 API。
- 在 Slack 中发消息。
这是一个说“这是修复”的 Agent 与一个打开 PR、关联工单并在检查变绿后通知频道的循环之间的区别。
我也将在这里停下,因为记忆的最深版本(一个跨数周记住你而不是单个运行的记忆工具链)本身就是一个完整的指南。现在,一个 STATE.md 和几个技能足以让循环产生复利。
把这些部分放在一起,整个指南的重点就自然显现了。你不再照料模型。
第三部分 · 保持诚实
12. 凭证:他们把地球上最好的模型撤走了 18 天,我几乎没有注意到。
我说模型是可替换的部分。六月,世界以全规模、毫无预警地为我做了这个实验。
6 月 12 日,美国政府对 Fable 5 施加了出口管制,当时这是可用的最强大模型。Anthropic 在全球范围内将其撤下以保持合规。
整整十八天,地球上最好的模型对于世界大部分地区来说,就这么消失了。
它于 7 月 1 日回归,每百万输入代币十美元,每百万输出代币五十美元,大约是低一档模型价格的两倍。
如果你的结果存在于那一个模型中,你损失了十八天,然后支付双倍费用才能把它们拿回来。
我的工作从未慢下来过一个下午,因为一个与模型无关的工具链不在乎底层是哪个模型。
循环继续运行。上下文仍然加载,检查仍然通过,我换了一个不同的模型进去,没有触碰其他任何东西。输出几乎没有变化。
这就是那个论点,由一个真实且略显荒谬的事件所证明。
构建工具链,某个前沿模型被政府撤下就会变成你一周中的一个小注脚,而不是一个缺口。
反之,如果你追逐模型,那么别人的政策决定就成了你的故障。
13. 它是如何悄悄失败的。
一个工具链的危险失败不是那些响亮的失败。崩溃是你能看见的。
会让你付出代价的失败是那些看起来挺好但仍在运行的失败。
- 无声失败的循环。本应仅在完成时发出“完成”信号的 Agent 过早发出信号,循环在一半完成的工作上退出,而仪表板保持绿色。解决方法是步骤 8 中的客观门。没有真正的检查,循环不会在完成时停止。它在它说服自己已完成时停止。
- 目标漂移。在长时间的会话中,每次总结步骤都会丢失一点东西。你开始时设定的“永远不要碰支付”规则在第四十步悄悄消失了。解决方法是每次运行时重新读取一个固定的规范(VISION.md 或 CLAUDE.md 中的规则块),这样目标就不会被侵蚀。
- 自我偏好偏见。构建者对自己太宽松,这在步骤 9 中已涵盖,值得重复是因为它是循环产生自信垃圾的最常见原因。唯一的解药是构建者永远看不到的检查者。
- 理解债务。你的工具链越快交付不是你编写的代码,仓库中包含的内容与你理解的内容之间的差距就越大。代币账单不是那个让你痛苦的账单。让你痛苦的是有一天你必须调试一个团队中没人读过其代码的系统。通过每次阅读差异来偿还,即使是那些无聊的差异。
- 安全税。一个无人看管的循环就是一个无人看管的攻击面。三种造成伤害的方式,以及每种方式的防范:
- 它比人类阅读速度更快地打开 PR。用安全检查来把关合并。
- 它会安装一个带有注入在描述中的提示注入的技能。在安装任何技能之前先审计它。
- 它将秘密散落到无人监控的日志中。将冗长日志记录排除在任何你在睡觉时运行的东西之外。
这些都不是说不要构建工具链。它们的意思是睁大眼睛构建它。
工具链消除了输入。它绝不能消除思考。
一旦你让它消除思考,上述所有失败都会复合而不是被抓住。
14. 第五级横档:环境,地平线。
在工具链之上还有一级横档,这是前沿实验室已经在争夺的地方。
一旦模型成为可替换的部分,竞争就转移到其周围的一切:
- Agent 被训练和评估的环境。
- 让它们能够跨数周而非单次运行产生复利的记忆。
- 决定其中任何东西是否真正有效的评估。
这是你不能在一个周末构建的那级横档。它也是告诉你所有这一切未来走向的那级横档。
你今天不需要它来获得前沿结果。
你需要它来理解为什么工具链能工作,以及为什么随着底层模型的变化它仍在继续工作。
站在第四级横档已经让你领先于几乎所有仍在手动输入提示的人。
第五级横档是下一个指南。现在,它下面的攀登已经足够了。
让你困在提示词阶段的错误
- 追逐每个模型发布,而不是构建那个能在所有模型中存活下来的东西。
- 跳过诚实之门。为一次性任务或没有自动检查的工作构建工具链,并付出你永远无法收回的设置成本。
- 没有客观检查的循环。第二个“审查”但没有测试支撑的 Agent 只是给第一个盖章。
- 一个 Agent 既写又检查。构建者对自己的工作太仁慈,它总是通过。
- 没有 CLAUDE.md。Agent 每次会话都从零重建对你项目的理解。
- 没有记忆。明天的运行从零重新开始,而不是恢复。
- 循环没有硬停止。它一直运行直到你的速率限制或账单把它截断。
- 权限范围蔓延。一个便利的写权限,从未重新审计,现在一个无人看管的循环可以触碰它本不该碰的东西。
- 不阅读任何差异。理解债务以复利增长。当你需要调试一个没人读过的系统的那一天,成本远超代币的代价。
结论:模型从来不是变量。
两年来,杠杆在模型上。更好的模型,更好的提示,更好的一次性答案。
那个阶段正在结束。
模型已经变得足够好,下一个杠杆点向上移动了一层:工具链,它决定了:
- 它们看到什么。
- 它们何时运行。
- 什么可以阻止它们。
- 什么在运行之间存活。
现在你拥有了全部。地图。安装。一个 CLAUDE.md。一个自己运行、面对客观门的循环。一个包含子 Agent、Hook、权限、技能和记忆的完整工具链。以及你是否已经需要其中任何东西的诚实测试。
今年的赢家不会拥有最聪明的模型。他们将拥有最聪明模型插入的那个工具链。
当下一个版本发布时,他们会把它换入一个已经能工作的系统下,继续前进,而其他人则要花另一个周末重建。
今晚就构建第一级横档,那件你仍然手动做的事情,然后让模型成为简单的部分。
- 原文链接: x.com/phosphenq/status/2...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~