工作原理
> **时效说明**:本文内容以 2026 年 3 月为基准。
Claude Code:工作原理
时效说明:本文内容以 2026 年 3 月为基准。
5.1 Agent循环:Claude是怎么干活的
很多人把Claude Code当成一个"高级自动补全",其实不对。它是一个真正的Agent,运行的是一个循环:收集上下文 → 采取行动 → 验证结果 → 继续循环。
拿一个具体例子说明。你说"帮我找一下为什么登录接口有时候会返回500",Claude Code会:
- 收集上下文:读你的项目文件、查找登录相关的Controller和Service代码、查看最近的Git提交记录、看有没有CLAUDE.md里写的背景说明
- 采取行动:可能先用grep搜索异常日志,再打开对应的文件,分析堆栈
- 验证结果:判断找到的原因是否合理,如果不确定就继续查
- 报告结论:给出定位结果,或者提出下一步建议
这和你在IDEA里Alt+Click找定义是完全不同的逻辑——IDEA是被动响应,Claude Code是主动推理。
5.1.1 循环的实际执行过程
举一个更完整的例子,让你看清楚这个循环到底跑了几轮。你输入:
帮我重构 OrderService.java,把里面重复的数据库查询合并掉
Claude Code内部会经历这样一个循环:
第1轮
- 行动:读取
OrderService.java - 发现:文件有 850 行,有些查询方法看起来相似
- 判断:需要更多信息,继续
第2轮
- 行动:搜索所有调用这些查询方法的地方(grep调用方)
- 发现:有3个方法其实查的是同一张表,只是过滤条件不同
- 判断:可以合并,但需要看一下Mapper层
第3轮
- 行动:读取
OrderMapper.java和对应的 XML - 发现:Mapper里有一个带动态SQL的方法可以覆盖三种查询场景
- 判断:信息足够,制定重构方案
第4轮
- 行动:展示修改计划,等待你确认
这个过程你在终端里能看到,每次Claude在读文件或执行命令时,都会有提示显示。理解这个循环之后,你就知道为什么有时候Claude花了20秒还没给你回答——它在认真干活,不是卡住了。
5.1.2 循环的打断和恢复
如果Claude在执行过程中跑偏了,你不需要等它跑完再纠正。直接按 Ctrl+C 打断,然后补充说明:
停一下,我没让你改Mapper,只需要优化Service层
Claude会从当前的上下文状态继续,按照新的方向推进。不需要重来。
5.2 Claude能访问的工具清单
Claude Code在执行任务时,靠的是一套内置工具。了解每个工具是什么、什么时候被触发,能帮你更准确地预判Claude的行为,也能写出更好的提示词。
5.2.1 文件读写工具
Read(读取文件)
最基础的工具。Claude用它来读取源代码、配置文件、文档。触发时机:
- 你提到某个文件名
- Claude需要了解某段逻辑的实现
- 分析前需要先看代码
Read工具默认一次读取最多2000行。如果文件很长,Claude会分段读取,或者先读文件头部摘要,判断哪一段最相关。
Write(写入文件)
创建新文件或完整替换现有文件。在执行前会展示diff给你确认。这个工具会修改磁盘,所以在默认模式下必须经过你的确认。
Edit(精确修改)
只替换文件里的某个片段,不是整体覆盖。比Write更精准,适合小范围改动。Claude通常优先用Edit而不是Write,因为风险更小——只改需要改的地方。
5.2.2 命令执行工具
Bash(执行shell命令)
这是最强大也最危险的工具。Claude用它来:
- 运行测试:
mvn test -Dtest=OrderServiceTest - 搜索代码:
grep -r "OrderService" src/ - 查看Git历史:
git log --oneline -20 - 执行构建:
mvn clean package - 启动服务:
mvn spring-boot:run
执行命令之前,Claude会展示即将运行的命令让你确认。你可以在 settings.json 里预先配置哪些命令可以自动执行,不需要每次确认——比如 mvn test、git status 这类无副作用的命令。
5.2.3 搜索工具
Glob(文件模式搜索)
按文件名模式搜索,比如找所有Controller文件:
**/*Controller.java
触发时机:Claude需要了解项目文件结构,或者需要找某类文件。
Grep(内容搜索)
在文件内容里搜关键词。比Claude手动读文件效率高很多,常用于:
- 找某个类在哪里被引用
- 查找所有TODO注释
- 搜索特定的错误码
5.2.4 网络和外部工具
WebFetch(获取网页内容)
Claude可以访问公开网页,比如:
- 查找某个依赖库的官方文档
- 查看某个API的最新规范
- 搜索技术资料
使用这个工具需要你的项目在 settings.json 里配置了 WebFetch 权限。对于内部网络地址,默认是禁止的。
5.2.5 任务编排工具
Task(子任务)
当任务很复杂时,Claude会把大任务拆分成子任务,并行处理。比如"给整个项目做安全审查",它可能同时启动多个子任务分别检查不同模块。
Task工具是并行能力的来源,这也是为什么Claude处理大规模任务比你手动一个个看快很多的原因。
5.3 Token消耗的原理
用Claude Code是有费用的(除非你是Claude Pro/Team用量内),理解Token消耗能帮你在效率和成本之间找到平衡点。
5.3.1 什么是Token
Token是LLM的计量单位,大概可以理解为"词语片段"。中文每个字大约1-2个Token,英文单词大约1-1.5个Token,代码因为有很多特殊字符,消耗比普通文字稍多。
粗略估算:1000个汉字 ≈ 1500-2000 Token,1000行Java代码 ≈ 3000-5000 Token。
5.3.2 哪些操作消耗Token
输入Token(你付费的大头):
- 你的提问本身
- Claude读取的每一个文件内容
- 整个对话历史(每次对话都要把之前的内容重新传入)
- CLAUDE.md 的内容(每次会话都要读入)
- 命令执行的输出结果
输出Token:
- Claude的回复
- 生成的代码
- 分析结果
一个常见的误解是"我只发了一行消息,应该很便宜"。实际上如果这条消息触发Claude读取了10个文件,那消耗的是这10个文件的全部内容作为输入Token,可能比你的消息贵几十倍。
5.3.3 不同操作的Token量级
| 操作类型 | 大约Token消耗 | 说明 |
|---|---|---|
| 读一个小文件(<100行) | ~500-1000 | 低消耗 |
| 读一个大文件(1000行) | ~4000-6000 | 中等消耗 |
| 一次完整的Bug排查 | ~20,000-50,000 | 涉及多个文件读取 |
| 重构一个模块 | ~50,000-200,000 | 大量文件读写 |
| 会话变长后的每次对话 | 随历史累积增长 | 主要来自对话历史 |
5.3.4 降低Token消耗的实用技巧
精确指向文件,而不是让Claude自己找:
# 低效(Claude要先搜索再找到)
帮我优化订单查询的性能
# 高效(直接告诉Claude在哪里)
帮我优化 OrderMapper.xml 里的 selectOrdersByUserId 方法
及时使用 /compact:当会话很长时,对话历史会越来越大。/compact 把历史压缩成摘要,大幅减少后续每次对话的Token消耗。
任务分块:不要在一个会话里做太多不相关的事。"给我重构整个项目"比"帮我重构订单模块"消耗多得多,而且效果也更差。
5.4 Claude的推理过程可视化
5.4.1 在对话中观察思考过程
Claude Code在执行任务时,它的每一步操作都是透明可见的。你不需要猜它在干什么:
- 读文件时会显示:
Reading file: OrderService.java - 执行命令时会显示命令内容并等你确认
- 遇到不确定的情况时,它会明确说出来
这是Claude Code和普通AI助手的一个重要区别:它的推理过程是可审查的,不是黑盒。
5.4.2 理解Claude的思考轨迹
当Claude在分析一个复杂问题时,它通常会按这个顺序思考:
- 范围界定:这个任务涉及哪些文件、哪些组件
- 信息收集:把相关代码读进来
- 模式识别:在代码里找到问题症结或改进点
- 方案生成:制定修改方案
- 影响分析:这个改动会波及到哪里
- 执行确认:把计划展示给你,等待确认
如果Claude在某一步卡住(比如找不到某个文件,或者代码逻辑矛盾),它会明确告诉你缺少什么信息,而不是凭空猜测。
5.4.3 让推理更透明的技巧
如果你想了解Claude对代码的具体理解,可以直接问:
你读完这段代码,告诉我你理解这个类的职责是什么,再开始改
这样做有两个好处:一是你能发现Claude理解有偏差的地方,在它动手前纠正;二是迫使Claude先做"理解"再做"修改",质量更高。
5.5 上下文管理:什么时候需要/compact
5.5.1 如何判断上下文快满了
Claude Code会在状态栏显示当前上下文的使用情况。当你注意到以下信号时,说明上下文快满了:
- Claude开始"忘记"你前面说过的事情,比如它不再遵守你之前设定的规则
- 回复速度明显变慢
- Claude明确提示上下文接近限制
- 回复质量开始下降,出现前后矛盾
5.5.2 /compact的原理和代价
执行 /compact 之后,Claude会:
- 把整个对话历史总结成一段摘要
- 用这段摘要替换原来的详细历史
- 继续在摘要的基础上工作
代价是细节丢失。如果你之前讨论了某个很具体的实现细节,compact之后Claude可能只记得"讨论了缓存方案",而忘记了"决定用本地Caffeine而不是Redis,原因是避免分布式锁"。
什么时候用/compact:
- 已经完成一个子任务,准备开始下一个不相关的任务
- 对话轮次超过30轮,历史已经很长
- 收到上下文接近满的提示
什么时候不用/compact:
- 正在进行一个需要前后细节互相引用的复杂任务
- 刚刚在对话里确认了某个重要决策,还没有写入CLAUDE.md
5.5.3 更好的替代方案:结构化地管理上下文
比 /compact 更好的做法是主动管理上下文:
# 在CLAUDE.md里记录已确定的决策
## 缓存方案(2026年3月确认)
- 使用本地Caffeine缓存,不用Redis
- 原因:单机部署,分布式锁开销不必要
- 最大缓存容量:10000条,TTL:5分钟
把重要决策存进CLAUDE.md,就算compact之后,下次会话Claude依然能读到这些信息。
5.6 会话管理的最佳实践
5.6.1 什么时候新建会话
应该新建会话的情况:
- 任务类型完全不同(刚做完缓存优化,现在要写新功能)
- 旧会话的上下文已经混乱(Claude开始答非所问)
- 需要在一个干净的状态下做高风险操作
- 已经完成了一个完整的开发任务,准备开始下一个
应该继续旧会话的情况:
- 任务还在进行中,需要前面讨论的背景
- 需要参考前面几轮对话的结论
- Claude已经对你的项目有了足够了解,不想重新建立上下文
# 继续最近的会话
claude -c
# 查看所有历史会话并选择(如果支持)
claude --list-sessions
5.6.2 用"会话目标"管理对话方向
每次开始一个新的会话,先明确一个清晰的目标:
今天的任务:重构订单模块的缓存逻辑。
约束:只修改 service 层,不动 mapper 层。
完成标准:所有缓存相关测试通过,没有引入新的接口变更。
这样做的好处是:一旦对话偏离方向,你和Claude都能意识到,容易拉回来。
5.6.3 多终端多任务的正确姿势
如果你需要同时做多个不相关的任务,开多个终端、每个终端对应一个独立会话:
# 终端1:在订单服务目录下工作
cd /projects/order-service
claude
# 终端2:在用户服务目录下工作
cd /projects/user-service
claude
不要在同一个目录下同时开两个Claude Code会话,两个实例对同一个文件的修改会互相覆盖,制造出难以排查的问题。
5.7 六种权限模式详解
按 Shift+Tab 可以在四种常用模式间循环切换(default → acceptEdits → plan → auto),右上角会显示当前模式。官方共有6种权限模式:
| 模式 | 说明 |
|---|---|
default |
标准模式,首次使用工具时提示确认 |
acceptEdits |
自动接受文件编辑,执行命令仍需确认 |
plan |
只能分析规划,不能修改文件或执行命令 |
auto |
自动审批工具调用(含后台安全检查,研究预览功能) |
dontAsk |
自动拒绝未预批准的工具调用 |
bypassPermissions |
跳过所有权限提示(仅限容器/VM等隔离环境) |
Shift+Tab 循环切换顺序:default → acceptEdits → plan → auto
5.7.1 default模式:每次都确认
这是安全性最高的模式。Claude执行任何文件修改或命令都会暂停,展示它要做什么,等你按y/N确认。
适用场景:
- 刚开始用Claude Code,还不了解它的行为模式
- 在做数据库迁移、删除文件等高风险操作
- 接手别人的项目,不确定改动影响范围
- 生产环境相关操作(强烈建议一直用这个模式)
坏处:有点慢,每一步都要你盯着。但刚开始的"摩擦感"是值得的——你在这个过程里能学到很多Claude是怎么工作的。
5.7.2 acceptEdits模式:自动接受文件编辑
文件修改自动执行,不需要确认;但执行shell命令仍然会等你确认。
适用场景:
- 日常开发,你已经对Claude的行为有基本信任
- 做大量小改动(比如批量修改代码格式)
- 时间紧,不想被每次确认打断节奏
重要提醒:自动接受编辑不代表可以不看diff。Claude Code仍然会显示它做了什么,你应该养成习惯扫一眼再继续。
5.7.3 plan模式:只规划不执行
在这个模式下,Claude会分析你的问题、制定计划、告诉你它打算怎么做,但不会真正修改任何文件或执行任何命令。
适用场景:
- 评估一个大功能的改动范围
- 跟团队讨论技术方案时,用Claude作为"顾问"
- 确认Claude理解正确后再让它动手
- 探索多种方案,比较优劣
使用技巧:plan模式可以用Shift+Tab切换,也可以在消息里说"先给我一个计划,不要动代码"。Claude会遵守这个指令。
5.7.4 auto模式:全自动执行
自动审批所有工具调用,包含后台安全检查(研究预览功能)。适合已经高度信任Claude的场景,或者在受控环境中批量执行任务时使用。
5.7.5 dontAsk和bypassPermissions
- dontAsk:自动拒绝所有未预批准的工具调用。用于严格限制Claude能做什么,只允许你明确白名单里的操作。
- bypassPermissions:跳过所有权限提示。仅限在容器、VM等完全隔离的环境中使用,不要在本机开发环境中开启。
5.7.6 根据场景选择正确的模式
| 场景 | 推荐模式 | 原因 |
|---|---|---|
| 接手新项目、第一次探索 | default | 了解项目,谨慎操作 |
| 日常功能开发 | acceptEdits | 效率优先,命令仍需确认 |
| 架构调整、大规模重构 | plan → default | 先对齐方案,再谨慎执行 |
| 数据库迁移脚本 | default | 不可逆操作,必须仔细确认 |
| 生产环境相关操作 | default | 宁可慢,不能错 |
| 隔离容器内自动化任务 | bypassPermissions | 环境安全,无需人工干预 |
5.8 一个常见的误解:Claude是怎么"理解"代码的
很多Java程序员第一次用Claude Code会有一个疑问:它真的能理解我的代码逻辑吗?还是只是在做文字匹配?
答案介于两者之间,但更靠近"真正理解"那一侧。
Claude读代码的方式更像一个有经验的程序员在做code review:它看的不只是单个文件,而是在构建一个关于项目的"认知地图"——哪些类负责什么职责、数据是怎么流动的、哪些地方有风险。
但它也有局限:它看不到运行时的状态(堆栈、内存、线程状态),除非你把这些信息粘贴给它。对于非常复杂的领域逻辑,如果CLAUDE.md里没有背景说明,它可能会做出看起来合理但实际不符合业务的修改。
实用建议:把你的业务约束、不允许改的东西、特殊的设计决策,都写进CLAUDE.md。这是弥补Claude"理解局限"的最有效方式。