Claude Code背后的5个反直觉真相
你有没有想过一个问题:
为什么那些真正厉害的AI Agent,打开源码一看,简单到让人困惑?
没有复杂的状态机。 没有花哨的DAG图。 没有你以为"必须有"的各种组件。
就一个while循环,不停地转。
我最近深挖了Anthropic的Claude Code架构。
说实话,我被震撼到了。
不是因为它有多复杂。
恰恰相反——是因为它简单得"不讲道理"。
💡 核心架构:一个循环打天下
先看Claude Code的核心代码:
while tool_call:
execute_tool()
feed_results_to_model()
repeat()
就这?
对,就这。
模型决定调用什么工具,执行,拿到结果,再决定下一步。
没了。
Anthropic工程师的原话是:**"给它工具,然后让开。"**
🎯 最好的架构,不是你加了什么,而是你敢删掉什么。
这背后的赌注很大胆:
现代大模型的推理能力,已经强到不需要你手把手编排每一步了。
你以为需要的复杂度,可能只是你的安全感。
🔍 模式一:用Grep,不用RAG
这个选择让我意外。
当Claude Code需要在代码库里找东西时,它不用向量数据库,不用Embedding。
它用的是……grep。
rg "def calculate_total_price" /path/to/project
原始输出直接丢进上下文窗口。模型自己解析,自己决定下一步读什么。
为什么这样做?
🎯 有时候,最"土"的方案,才是最对的方案。
当然,RAG不是没用。
如果你处理的是大量文档、需要语义理解、或者多语言内容——RAG可能更合适。
但关键是:先测试,再假设。
别因为"大家都在用RAG"就默认选它。
🧩 模式二:子Agent + 隔离上下文
上下文管理,是Agent开发的真正难题。
上下文窗口塞满了,模型性能就崩了。
Claude Code的解法很优雅:子Agent。
主Agent是协调者。
需要调研?生成一个子Agent。 需要跑测试?生成一个子Agent。
每个子Agent有自己干净的上下文,干完活只返回结果。
sub_task = {
"name": "Task",
"parameters": {
"description": "找到DefaultChatContext在哪实例化",
"prompt": "搜索ChatTabViewViewModel.swift,只返回文件路径和行号"
}
}
核心洞察:
"每个worker有自己的短上下文;主Agent分发任务,子Agent收集信息,主Agent聚合结果。"
这样,主Agent的上下文始终保持清爽,专注在协调上,不会被中间过程的垃圾信息淹没。
🎯 让主Agent当老板,不要让它当打工人。
如果你的Agent总是做着做着就忘了目标——这个模式值得试试。
✅ 模式三:用Prompt管理任务,不用代码
这个发现让我最惊讶。
Claude Code的任务追踪,没有代码层面的校验。
没有validation layer检查模型有没有遵守规则。
纯靠Prompt。
系统提示词里写:
然后模型就……照做了。
{
"todos": [
{"id": "a1f", "title": "复现失败测试", "status": "done"},
{"id": "b9c", "title": "实现修复", "status": "running"},
{"id": "e7d", "title": "添加回归测试", "status": "pending"}
]
}
Anthropic工程师说了一句话,我印象很深:
"一年前这样做根本不行。"
但现在,模型的指令遵循能力已经强到,Prompt本身就是约束。
🎯 最好的代码,是你不用写的代码。
当然,高风险操作(删文件、支付)还是要代码级别校验的。
但对于工作流协调,想想你能删掉多少"以防万一"的复杂度。
🖥️ 模式四:Bash是万能工具
Claude Code没有几十个专用工具。
它有一个工具:执行Shell命令。
defexecute_shell(command):
return subprocess.run(command, shell=True, capture_output=True)
需要读文件?cat需要搜索?grep需要跑测试?pytest需要提交代码?git commit
甚至,模型会自己写一个Python脚本,运行完,再删掉。
为什么这样做?
但这里有个大坑:
给Agent shell权限 = 给它核弹发射按钮。
Anthropic团队自己都承认:**"我们有人真的把本地数据库删了。"**
所以Claude Code做了很多保护:
🎯 给Agent的权力越大,你的权限系统就要越强。
🚫 模式五:他们选择不做什么
有时候,没有的东西比有的东西更有趣。
Claude Code明确避免了:
逻辑很简单:
如果模型能做,就让模型做。
每多一层组件,就多一个可能出bug的地方,多一个要维护的东西,多一份复杂度。
🎯 你加的每一行代码,都是未来的负债。
🧠 关于上下文管理的细节
几个值得记住的技巧:
1. 异步缓冲区工具I/O和推理解耦。完整日志存磁盘,只有精简版进模型上下文。
2. 上下文压缩器在92%上下文使用率时触发。总结对话,把重要信息转存到markdown文件。
3. "掐头去尾"策略压缩时,保留开头(目标、背景)和结尾(最近工作)。中间部分可以大胆总结。
因为人类思考也是这样的——记得为什么开始,记得刚刚做了什么,中间过程?模糊就行。
🎬 不同问题,需要不同Agent
没有"最佳"Agent架构这回事。
架构要匹配问题,不是问题匹配架构。
📌 五条行动建议
读完这篇,你可以立刻做的事:
先试简单循环。一个while循环够不够用?测了再说。
信任Prompt。现代模型的指令遵循能力,可能比你想的强。
考虑Bash。作为万能适配器,但一定要投资权限系统。
质疑每个组件。那个Classifier真的需要吗?还是你从旧项目复制过来的?
🔮 未来方向
Anthropic提到的几个演进方向:
- 自适应推理深度:根据问题难度调整思考强度("think" → "think hard" → "ultrathink")
- 技能作为可扩展Prompt:只在需要时加载额外上下文
- 无头Agent SDK:让Agent跑在CI/CD和定时任务里
底层趋势很清晰:
模型越来越强,脚手架越来越少。
💬 最后
一年前,这些做法会被认为是"偷懒"或"不专业"。
现在,它们可能是最聪明的选择。
🎯 最好的工程师,不是写代码最多的人,而是删代码最多的人。
如果这篇对你有启发,转发给你正在做Agent的朋友。
他们可能正在过度工程化的路上狂奔。
基于Anthropic Claude Code架构分析撰写,原始信息来源于AI Engineer Code Summit分享