高飞 25-12-29 18:31
微博认证:至顶科技创始人 AI博主

#模型时代# Claude Code 架构拆解:一个 while 循环如何干掉复杂工作流

Claude Code肯定是这一年来的现象级产品了(今年2月份发布的),之前分享过官方的播客解读,但是我感觉讲的语焉不详。反而是PromptLayer 创始人 Jared Zoneraich 在 AI Engineer 大会上前不久做的非官方的 Claude Code 逆向工程分享,信息量更大一些。

他的公司每天处理数百万 LLM 请求,团队直接围绕 Claude Code 重构了整个工程组织——规则很简单:能在一小时内用 Claude Code 完成的事,就别排优先级,直接做。这场分享的核心论点可能让很多习惯复杂架构的工程师感到意外:Claude Code 的成功不是因为精巧的 agent 框架,而是因为极致的简化。

一、核心哲学:给工具,然后闪开

Jared 开场就抛出一个反直觉的判断:coding agent 突然变好用,不是因为什么黑科技突破,原因其实挺"无聊"的——更好的模型加上更简单的架构。

1、The Zen of Python 式的设计

Claude Code 的架构遵循 Python 之禅的核心原则:简单优于复杂,扁平优于嵌套。Jared 认为这不只是数据库 schema 设计的真理,同样适用于自主 coding agent。

过去两年多,大家构建 AI agent 的主流方式是画一张复杂的流程图:用户说想退款,先经过一个分类器判断意图,然后路由到退款处理分支,再检查用户资格,再调用退款接口……几百个节点层层嵌套,工程师们把这种结构叫 DAG(有向无环图),本质上就是一张"如果A则B,否则C"的巨型决策树。Claude Code 把这套东西基本全扔了。

2、删掉脚手架,让模型去探索

"Less scaffolding, more model"(少搭脚手架,多靠模型)是他反复强调的口号。工程师本能地想通过各种 prompt 技巧防止幻觉、用流程图控制每一步,但这种过度优化往往适得其反。Jared 举了个例子:他给自家网站的按钮加上标签想帮助 browser agent 导航,结果反而让 agent 表现更差——因为它被指令分散了注意力,不知道该点哪个按钮了。

3、别绕模型缺陷转圈

Anthropic 内部把这叫"AGI pill"思维:不要花大量精力工程化地绕过今天模型的缺陷,因为很多问题过几个月模型自己就能解决了。你的时间会浪费掉。

二、架构核心:一个 while 循环搞定一切

如果把 Claude Code 的核心逻辑压缩成四步,就是:检查是否有工具调用→执行工具→把结果返回给模型→重复,直到没有工具调用为止。

Anthropic 内部好像把这叫"N0"。没有复杂的流程分支,没有 ML 意图分类器,没有 embedding 检索——就是一个主循环反复调用工具,直到任务完成。

这和传统做法形成鲜明对比。以前做一个客服 agent,你可能要画一张几百个节点的流程图:用户说退款走这条路,用户问产品走那条路,每个分支再细分出十几个子分支。维护这张图是噩梦,改一个节点可能牵连一堆。Claude Code 说:不需要,让模型自己判断下一步该干嘛。

1、Claude.md:用户可编辑的系统 prompt

传统做法是让模型先研究仓库、建本地向量库。Claude Code 的方案简单得多:直接让用户写个 markdown 文件说明项目规范。用户改、agent 改都行。"一切都是 prompt engineering 或者 context engineering",Jared 说这话时带着点自嘲——毕竟他的公司就叫 PromptLayer。

2、核心工具清单

目前 Claude Code 的核心工具包括:Read(带 token 限制的文件读取)、Grep/Glob(用 grep 替代 RAG,模拟人类行为)、Edit(用 diff 而非重写,更快更省 token)、Bash(万能瑞士军刀)、Web Search/Fetch(分流给更便宜的模型处理)、Todo(保持模型专注)、Task(上下文管理,用子 agent 处理长流程)。

这些工具有个共同特点:都是人类在终端做的事情,不是凭空发明的 agent 专属工具。

三、Bash 是真正的通用适配器

Jared 给出一个大胆论断:理论上你可以把其他工具全删了,只保留 Bash。

1、为什么 Bash 如此强大

两个原因。第一,它真的能做一切——几千个 shell 命令随便调。第二,训练数据极其丰富,因为这就是开发者日常用的东西。模型对 Bash 的熟练度远超那些小众编程语言。

2、Python 脚本的妙用

Jared 每次看到这个场景都觉得很酷:Claude Code 创建一个 Python 文件,运行它,然后删掉。临时脚本成了 agent 的思考工具。他现在甚至用 Claude Code 来启动本地开发环境——以前那些写在某个文件里、经常过时的五行命令,现在让 agent 自己搞定。

3、让模型试错

Bash 的另一个好处是让模型能够尝试事情。出错了?没关系,模型很擅长修复错误。这种灵活性比刚性流程控制更适合构建健壮系统。

四、To-do 机制:结构化但不强制

Claude Code 的 to-do 列表看起来像个周末项目,但效果出奇地好。

1、纯 prompt 驱动,无代码强制

规则很简单:一次一个任务,完成后标记,遇到阻塞就继续处理当前任务。关键是这些规则完全靠 prompt 实现,没有硬编码逻辑。一年前这种做法根本行不通,但现在模型的指令遵循能力已经够用了。

2、四个实际好处

强制规划、崩溃后可恢复、用户体验更好(你能看到进度而不是干等 40 分钟)、以及更好的可控性。

3、数据结构示例

每个 to-do 有版本号、ID、标题,还能注入 evidence(任意数据块供参考)。ID 用哈希,标题给人看——就像你整理桌面一样,这是在帮模型整理工作空间。

五、上下文管理:coding agent 的真正敌人

Jared 反复强调一点:上下文越长,模型越笨。

1、H2A 异步缓冲

Claude Code 用一种叫 H2A 的机制来解耦 IO 和推理,避免把终端看到的所有内容都塞进上下文。到达容量上限时(大约 92%),它会丢弃中间部分,只保留头尾摘要。

2、子 agent 的妙用

子 agent 有自己独立的上下文,只把结果反馈给主循环。典型用途包括:researcher、docs reader、test runner、code reviewer。

关键代码结构是 Task 工具接收两个参数:description(给用户看的)和 prompt(给子 agent 的长字符串)。这意味着主 agent 在 prompting 自己的子 agent——如果任务返回错误,就塞更多信息进去让它解决。灵活性比刚性更好。

3、Bash 的另一个好处:持久化存储

沙箱环境里可以存 markdown 文件作为长期记忆。Jared 预测未来所有 ChatGPT、Claude 窗口都会自带沙箱环境——因为把东西存到文件里能让上下文更短、模型更聪明、响应更快。

六、Skills:可扩展的系统 prompt

Skills 本质上是按需加载的专业知识包。

1、典型用例

文档更新(指定写作风格和产品规范)、编辑 Word/Excel 文件(自动反编译处理)、设计风格指南、deep research(Jared 把一个 deep research 的 GitHub repo 直接转成了 Claude Code skill,效果惊人)。

2、现实问题

有观众反馈:Claude.md 太长时系统会警告,但把内容拆成 skills 后 Claude 又不调用它们。Jared 承认这确实是个问题,可能需要模型层面更好地训练 skill 调用。

七、其他 Coding Agent 的不同哲学

Jared 提出一个"AI 治疗师问题":纽约每个街区都有六个治疗师,没有全局最优解。有人做冥想,有人做认知行为疗法,有人给你开死藤水。不同策略解决相同问题,coding agent 也一样。

1、Codex:Rust 核心,开源

架构类似但更偏事件驱动,沙箱用内核级隔离——macOS 上用 Seatbelt(苹果的进程沙箱机制),Linux 上用 Landlock(内核级文件访问控制)。真正的区别在模型本身。Jared 用 Claude Code 分析 Codex 源码——用 coding agent 研究 coding agent,这本身就很有意思。

2、Amp(Sourcegraph):免费的 coding agent

利用模型提供商的过剩 token,靠广告变现。没有模型选择器——这让他们迭代更快,因为用户对输出没有精确预期。核心理念是构建"agent 友好的环境":密封的测试环境、快速反馈循环。

上下文管理用 handoff 而非 compact。就像《使命召唤》里换武器比重新装弹快——直接开新线程,传递必要信息,而不是等漫长的摘要过程。

他们还把模型选择分成 fast、smart、oracle 三档,后者用于特别难的问题。

3、Cursor:UI 优先,速度碾压

Composer 用蒸馏模型,快到吓人——Jared 有次不小心直接 push 到 master 了。他们靠数据做 fine-tuning,"让大家重新对微调产生兴趣"。

4、没有赢家,只有不同

Jared 个人偏好:Claude Code 处理本地环境和 git 操作,Codex 解决难题,Cursor Composer 追求速度。他甚至想象一个"专家混合"agent:同时跑 Claude Code 和 Codex,让它们在 Slack 里互相讨论。

八、评估:基准测试没用,回测最实际

1、Benchmark 已经变成营销工具

每个模型都"打破"基准测试记录,Jared 不知道这怎么发生的。真正有用的是你自己的 eval。

2、三种测试策略

端到端测试(问题修没修好)、时间点快照(给定上下文判断是否调用正确工具)、回测(捕获历史数据,重跑对比)。Jared 最推荐从回测开始。

3、Agent smell:表面指标的健全性检查

统计工具调用次数、重试次数、执行时长——这些表面指标能快速发现异常。

4、把严谨性放进工具

如果某个输出有非常具体的要求(比如邮件格式),就把它封装成可测试的工具。测工具比测自由探索容易得多。这其实是个折中方案:整体架构用简单循环,但对于需要精确控制的环节,做成独立工具单独测试。

九、未来方向

1、减少工具调用,回归 Bash

Jared 不认同"几百个工具调用"的路线,他倾向于一个超级工具调用,或者就几个核心工具加本地脚本。

2、自适应推理预算

把推理模型当工具调用。用超快但笨一点的模型处理大部分任务,遇到难题才调用 GPT-5 或 Opus。

3、Headless SDK 的潜力

Jared 有个 GitHub Action 每天自动更新文档:读所有提交、检查 Claude.md、创建 PR。未来可能大家在更高抽象层构建 agent,把底层编排全交给 Claude Code 这类 SDK。

总结

五条核心收获:信任模型(有疑问时让模型探索);简单设计取胜;Bash 就是你需要的一切(工具越少越好);上下文管理至关重要(这是持续要逃避的幽灵);不同视角同样有效(没有唯一最优,mix and match 才是正道)。

Jared 最后展示了用 Claude Code 制作这套幻灯片的过程:一个 Slidev skill(Slidev 是一款用 Markdown 写幻灯片的开源工具)、一个 deep research skill、一个 design skill。他形容自己"知道什么东西丑但不知道怎么改好"——skill 补齐了能力短板。

核心归纳

Q1: Claude Code 为什么突然好用了?

两个原因叠加:模型本身更强(特别是工具调用能力),以及架构极度简化。没有 RAG、没有意图分类器、没有复杂流程图,就是一个 while 循环加几个人类日常用的工具。Anthropic 让模型去探索,而不是用工程手段绕过模型缺陷。

Q2: 什么时候该用流程图控制,什么时候该用简单循环?

问题决定答案。通用 coding agent 需要灵活探索,适合简单循环。特定输出格式(如旅行行程模板)可以封装成工具调用。Jared 的建议是:用主循环 + 工具调用架构,把需要严谨控制的部分做成可单独测试的工具。

Q3: 上下文管理为什么这么重要?

上下文越长模型越笨,这是当前所有 coding agent 的共同敌人。解法包括:子 agent 独立上下文只返回结果、用文件存储代替内存、handoff 替代摘要压缩。未来所有对话窗口可能都自带沙箱,让 agent 把长期状态存成文件。

发布于 日本