Claude Code工作原理学习笔记:从Agent Loop到工具调用
最近看了一些关于Claude Code底层实现的资料,发现AI编程工具并没有想象中那么神秘。它的核心不是"模型突然会自己写代码了",而是把大模型、工具调用、上下文管理和权限控制组合成了一个完整的工程系统。
这篇文章主要整理一下Claude Code背后比较重要的几个设计点。
一、AI编程工具的核心:Agent Loop
Claude Code这类工具和普通聊天最大的区别在于:
普通聊天是一次问答,而AI编程工具是多轮循环。
它的大致流程是:
text
用户提出需求
模型分析任务
调用工具
读取工具结果
继续判断下一步
直到任务完成
也就是说,它不是一次性回答问题,而是在不断执行:
text
思考 -> 行动 -> 观察 -> 再思考
比如用户说"帮我修一个bug",模型可能会先搜索代码,再读取文件,然后修改代码,最后运行测试。这个过程就是Agent Loop。
二、为什么说它本质上是一个循环
从实现角度看,Agent并不复杂,可以理解成一个循环结构:
text
while 任务没有完成:
让模型判断下一步
如果需要工具,就调用工具
把工具结果返回给模型
模型继续判断
这里最关键的是:
模型不只是生成文本,而是在决定下一步该做什么。
这也是AI编程工具和普通对话工具的主要区别。
三、工具调用是Agent能工作的基础
如果没有工具,模型只能给建议,不能真正操作项目。
Claude Code提供了很多工具,比如:
| 工具 | 作用 |
|---|---|
| Read | 读取文件 |
| Edit | 修改文件 |
| Write | 新建或覆盖文件 |
| Grep | 搜索文件内容 |
| Glob | 搜索文件路径 |
| Bash | 执行命令 |
| WebSearch | 联网搜索 |
| Agent | 启动子任务 |
这些工具让模型可以真正接触代码仓库,而不是只停留在"说"的层面。
所以AI编程工具的本质可以简单理解为:
大模型负责判断,工具负责执行。
四、为什么不能只用Bash
理论上,一个Bash工具就可以完成很多事情,比如读文件、改文件、运行命令。
但这样做风险很高。
因为Bash太通用了,也太危险了。它可以执行删除、覆盖、提交、推送等操作,一旦模型判断错误,后果会比较严重。
所以Claude Code更倾向于使用专用工具:
- 读文件用Read
- 改文件用Edit
- 搜内容用Grep
- 搜路径用Glob
- 真正需要命令行时再用Bash
这样可以让每个操作更可控,也方便做权限检查。
这个设计其实很重要:
不是给AI越大的权限越好,而是要让它在受控范围内完成任务。
五、Edit工具为什么适合改代码
Claude Code修改文件时,不是每次都重写整个文件,而是更偏向于局部替换。
也就是找到旧内容,再替换成新内容。
这样做有几个好处:
第一,节省上下文。
如果整个文件很长,但实际只改几行,没必要把全部内容都重新处理一遍。
第二,便于检查。
用户可以更清楚地看到模型到底改了哪里。
第三,减少误改。
局部修改比整体覆盖更安全,也更符合真实开发中的代码修改方式。
当然,这种方式也有缺点:
如果旧内容在文件中出现多次,就需要提供更多上下文来定位,否则可能匹配失败。
六、上下文为什么很容易不够用
很多AI编程工具支持很长的上下文窗口,但实际使用中还是很容易不够。
原因很简单:
一个真实的编程任务,会不断产生上下文。
比如:
- 系统提示词
- 用户需求
- 读取的代码文件
- 搜索结果
- 命令行输出
- 测试日志
- 历史对话
这些内容会不断累积。
当上下文太长时,系统就需要压缩或者截断一部分内容。
这也是为什么有时候AI会忘记前面说过的要求,或者重复读取之前看过的文件。
不是模型突然变笨了,而是上下文已经被压缩过了。
七、上下文管理的常见思路
为了减少上下文压力,Claude Code这类工具通常会做几件事:
第一,工具结果不会无限保留。
比如很长的日志和文件内容,可能只保留关键部分。
第二,早期对话会被总结。
一些较早的信息会变成摘要,而不是完整保留。
第三,复杂任务会拆给子Agent。
子Agent可以负责搜索、阅读、分析,然后只把总结结果返回给主Agent。
这样主Agent不需要直接接收所有细节,能节省不少上下文空间。
八、子Agent的作用
子Agent可以理解为一个临时助手。
主Agent把一个子任务交给它,比如:
- 搜索某个模块的代码
- 分析某个功能的实现
- 查找可能出问题的文件
- 总结测试失败原因
子Agent完成后,只把结果摘要返回给主Agent。
这样做的好处是:
主Agent不用亲自读取所有内容,可以减少上下文消耗。
这对于大型项目尤其有用。
不过子Agent也有问题:
它通常看不到完整上下文,只能根据主Agent给出的任务描述来工作。所以任务描述如果不清楚,子Agent也可能分析偏。
九、权限控制是AI编程工具必须解决的问题
AI编程工具最大的风险之一,是它可以操作真实项目。
比如:
- 删除文件
- 修改配置
- 执行命令
- 提交代码
- 推送远程仓库
所以权限控制非常重要。
Claude Code这类工具一般会对操作进行分级:
- 明确危险的操作直接拒绝
- 有风险的操作询问用户
- 安全操作可以直接执行
这个设计的重点不是"让AI无所不能",而是避免AI在不确定的情况下做不可逆操作。
尤其是删除文件、强制推送、修改关键配置这类操作,必须谨慎。
十、CLAUDE.md的作用
CLAUDE.md可以理解为项目说明文件。
它通常用于告诉AI:
- 项目是什么
- 常用命令有哪些
- 代码规范是什么
- 哪些文件不能乱改
- 测试和构建怎么执行
这类信息如果每次都靠用户重复输入,会很麻烦。
放到CLAUDE.md里后,AI每次进入项目时都可以读取这些规则。
不过要注意:
CLAUDE.md不应该被当成绝对真实的信息。
因为项目代码可能已经变化,文档可能没有及时更新。
更合理的做法是:
把CLAUDE.md当成索引,而不是最终依据。
真正修改代码前,还是要读取当前文件确认。
十一、双模型策略
Claude Code这类系统通常不会所有任务都用最强模型。
因为成本太高,也没有必要。
一些简单任务可以交给小模型,比如:
- 权限判断
- 操作分类
- 简单摘要
- 工具选择
复杂任务再交给大模型,比如:
- 理解代码逻辑
- 分析bug原因
- 设计修改方案
- 生成核心代码
这样可以在效果和成本之间做平衡。
简单来说就是:
小模型处理简单判断,大模型处理复杂推理。
十二、对开发者的启发
看完Claude Code的设计后,我觉得有几个点值得注意。
第一,Agent不是魔法。
它的核心就是循环、工具、上下文和权限控制。
第二,工具设计很重要。
工具不是越通用越好,而是要足够清晰、可控、可检查。
第三,上下文管理决定了Agent能走多远。
任务越复杂,越要考虑信息压缩、任务拆分和摘要机制。
第四,权限系统不能事后补。
只要AI能操作真实环境,权限和安全就必须从一开始设计进去。
第五,Prompt不是简单提示词。
它更像产品规则的一部分,决定模型在什么情况下该保守、什么时候该行动、什么时候该询问用户。
总结
Claude Code这类AI编程工具,本质上不是单纯的大模型聊天,而是一个完整的工程系统。
它的核心可以概括为:
text
大模型负责决策
工具负责执行
上下文负责记忆
权限系统负责兜底
真正值得学习的,不只是它能写代码,而是它如何把模型能力放进一个可控的工程流程里。
这也是以后AI应用开发中很重要的方向:
不只是让AI"更聪明",更要让AI"更稳定、更可控、更适合真实场景"。