
我们在 ECC 每天都会收到类似的反馈:Claude Code 早上还很顺手,下午就开始抽风。响应一点点变慢,改来改去停在原地,String to replace not found 的报错也冒了出来。很多人第一反应是模型降智了。但作为 Claude Code 的重度使用者,我可以负责任地说,多数情况下这不是模型的锅,而是工作流设计出了问题——这正是本篇想讲清楚的事。
Andrej Karpathy 用大约 700 次 Agent Loop 实验给了个不太中听的答案:优化 Agent Loop 的工程实践能带来约 76% 的性能提升,而且跟你用哪个模型关系不大。
76% 的差距,跟模型选型无关
无论你手里是 Claude 3.7、Claude 4,还是 GPT 系列,只要 Loop 设计有毛病,上限就卡死在那儿。大多数人默认「模型更强等于效果更好」,但在实际 AI Coding 场景里,真正卡脖子的是 Loop 设计本身。
我自己带团队跑项目时也验证过这一点。同样一套 Claude Code 配置,换个人来用效果天差地别,差别几乎全在工作流习惯上。模型只是底座,怎么喂上下文、怎么切任务,才决定了这个助手能发挥几成实力。
Claude Code 的 Agent Loop 到底怎么跑
想优化工作流,得先知道它在做什么。根据社区对 Claude Code 源码的逆向分析(非 Anthropic 官方文档,仅供参考),内部主循环代号 nO,是经典的 while-loop:一直执行,直到模型响应里不再包含工具调用为止。
几个值得记的架构取舍:
- 单线程主循环加受控并行,派生有限的子 agent,不搞蜂群
- 扁平的消息历史,不是树状任务图
- TODO 式规划配合 diff 工作流
为什么官方没上复杂的多 agent 架构?核心就一条:可调试性。简单有纪律,比复杂失控好用太多。这也解释了为什么「一口气跑到底」很危险——这个循环没有内置质量检查点,一旦跑偏,它会顺着错误方向一路跑下去。想扩展能力,MCP 是更合适的入口,后面会提到。
越跑越差的根源:上下文
社区整理的数据(样本规模不明,看趋势就好)显示,65% 的用户报告过性能下降,其中约 85% 的根因是上下文累积。响应时间的退化大致是这样:
| 会话时长 | 响应时间 | 相比基准 |
|---|---|---|
| 0–30 分钟 | 2–5 秒 | 基准 |
| 30–60 分钟 | 10–20 秒 | 2–4 倍 |
| 1–2 小时 | 30–60 秒 | 6–12 倍 |
| 2 小时以上 | 60 秒+ | 12 倍以上 |
这不是玄学,是数学。上下文窗口被塞满,模型每轮都得重新处理一大堆历史信息,自然越来越慢。
更麻烦的是触发 autocompact thrashing:文件或工具输出反复把上下文窗口填到上限,自动压缩陷入死循环,报错长这样:
Autocompact is thrashing: the context refilled to the limit...
碰上这个,基本只能重启会话。
对照自查:你中了几条
- 响应越来越慢——会话太长,上下文累积
- 答案质量下滑、开始出现幻觉——上下文噪音太多,注意力被分散
- 频繁报
String to replace not found——上下文错位,模型找不到代码锚点 - 理解偏差——早期信息被稀释
- 反复问你已经交代过的事——关键信息被淹没在历史消息里
同时中三条以上,基本可以判定是工作流问题。
三个能立刻上手的最佳实践
拆小步长,加验收节点
「一次性跑到底」是我见过最常见的反模式。Karpathy 实验的核心结论之一:小步迭代加中间验收节点,比一次性甩个大任务效果好得多。把大任务切成有明确验收标准的小块:
# 反例(一次性喂给 Claude)
实现用户认证模块,包括注册、登录、密码重置、邮件验证...
# 正例(分步执行,每步有验收)
Step 1: 只实现用户注册接口,完成后运行测试,确认通过再继续
Step 2: 实现登录接口...
每步跑完都检查一下输出,确认方向对了再往下走。
主动管理上下文生命周期
别等 Claude Code 开始抽风才动手:
# 会话跑到 30–40 分钟,主动压缩
/compact
# 完成一个主要任务后重启会话
# 不要把所有任务堆在同一个会话里
处理大文件用行范围读取:
# 不要这样
Read the entire file: src/components/BigComponent.tsx
# 改成这样
Read lines 100-200 of src/components/BigComponent.tsx
特别大的文件操作,官方建议迁到 subagent 里处理,它有独立的上下文窗口,不会污染主会话。
CLAUDE.md 的规则要带上原因
Reddit 社区总结出的一条经验:规则要把「为什么」写清楚,光列禁令没用。Agent 得理解约束背后的逻辑,才能把规则套用到你没预料到的边缘场景:
# 反例
- 不要截断测试输出
# 正例
- 绝不截断测试输出——CI 使用完整输出进行故障检测,
截断会导致隐性 bug 漏过 CI 流水线
前一种写法,Claude 在「影响不大」的时候可能就自作主张忽略了。后一种它能读懂逻辑,自动套用到类似情况。
用 MCP 给工作流补上缺口
上面三条解决「怎么跑」,MCP 解决「能跑多远」。MCP(Model Context Protocol)是 Anthropic 推出的开放协议,让 Claude Code 能标准化地接入外部工具、数据库和服务。与其把一大堆上下文硬塞进对话,不如让模型按需去 MCP Server 取数据——这本身就是一种上下文减负。
如果你有 MCP Server 开发需求,从职责单一的 server 起步,比如只负责查内部文档或跑数据库查询,别一开始就想做大而全。工具描述写得越清楚,Claude Code 调用时越不容易出错,这跟 CLAUDE.md 写原因是一个道理。MCP 搭配几个趁手的 Skills,是我目前跑长任务的标配。
Claude Code vs Cursor:怎么选
经常有人问我该用哪个。我的看法是它们不是替代关系。Cursor 是编辑器里的 AI 补全和对话体验,交互直观;Claude Code 是命令行里的 Agent,更擅长跨文件的自主任务和自动化流程。做重构、跑批量改动、需要 Agent 自己规划步骤时,我更倾向 Claude Code;纯写代码时随手用 Cursor 补全也很顺手。两个一起用并不冲突。
FAQ
性能优化最该先做什么?
上下文管理。定期 /compact,每个主任务完成后重启会话。约 85% 的性能问题根因是上下文累积,不是模型。
Loop 设计和模型选型哪个更重要?
按 Karpathy 的实验结论,Loop 设计更重要。约 76% 的性能差异来自工程实践。先把工作流做对,再考虑要不要升级模型。
在国内怎么稳定用 Claude Code?
直连经常碰到网络问题,海外信用卡绑定也麻烦,还有用量限制。我们 ECC 做的就是把这些坑替你填平——免梯子、免绑海外卡、按量计费,接入的仍然是原汁原味的 Claude Code。安装教程和接入步骤官网都有。
出现 String to replace not found 怎么办?
上下文积累太深,模型对当前文件状态的理解错位了。先 /compact 压缩,还不行就重启会话,重新告知文件状态再继续。
写在最后
工作流越跑越差,大多数时候真不是 Claude 的问题。记住三件事:任务拆小加验收节点;会话超过 30 分钟就盯紧上下文;CLAUDE.md 的规则写上原因。想再进一步,用 MCP 和 Skills 把能力边界撑开。
工具本身没毛病。工作流烂,再强的助手也只能发挥三成。
关于 Easy Claude Code
如果你想用上 Claude Code,可以试试我们 ECC(Easy Claude Code)的中转服务:免🪜、低成本、快速稳定,直连官方 Claude Code。企业定制化服务可详询。