课程0基础Agent开发课 / Claude-Code实战教程 / 工作原理
— 14 min read

工作原理

> **时效说明**:本文内容以 2026 年 3 月为基准。

Claude Code:工作原理

时效说明:本文内容以 2026 年 3 月为基准。

5.1 Agent循环:Claude是怎么干活的

很多人把Claude Code当成一个"高级自动补全",其实不对。它是一个真正的Agent,运行的是一个循环:收集上下文 → 采取行动 → 验证结果 → 继续循环

拿一个具体例子说明。你说"帮我找一下为什么登录接口有时候会返回500",Claude Code会:

  1. 收集上下文:读你的项目文件、查找登录相关的Controller和Service代码、查看最近的Git提交记录、看有没有CLAUDE.md里写的背景说明
  2. 采取行动:可能先用grep搜索异常日志,再打开对应的文件,分析堆栈
  3. 验证结果:判断找到的原因是否合理,如果不确定就继续查
  4. 报告结论:给出定位结果,或者提出下一步建议

这和你在IDEA里Alt+Click找定义是完全不同的逻辑——IDEA是被动响应,Claude Code是主动推理。

5.1.1 循环的实际执行过程

举一个更完整的例子,让你看清楚这个循环到底跑了几轮。你输入:

code
帮我重构 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 打断,然后补充说明:

code
停一下,我没让你改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 testgit status 这类无副作用的命令。

5.2.3 搜索工具

Glob(文件模式搜索)

按文件名模式搜索,比如找所有Controller文件:

code
**/*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自己找:

code
# 低效(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在分析一个复杂问题时,它通常会按这个顺序思考:

  1. 范围界定:这个任务涉及哪些文件、哪些组件
  2. 信息收集:把相关代码读进来
  3. 模式识别:在代码里找到问题症结或改进点
  4. 方案生成:制定修改方案
  5. 影响分析:这个改动会波及到哪里
  6. 执行确认:把计划展示给你,等待确认

如果Claude在某一步卡住(比如找不到某个文件,或者代码逻辑矛盾),它会明确告诉你缺少什么信息,而不是凭空猜测。

5.4.3 让推理更透明的技巧

如果你想了解Claude对代码的具体理解,可以直接问:

code
你读完这段代码,告诉我你理解这个类的职责是什么,再开始改

这样做有两个好处:一是你能发现Claude理解有偏差的地方,在它动手前纠正;二是迫使Claude先做"理解"再做"修改",质量更高。


5.5 上下文管理:什么时候需要/compact

5.5.1 如何判断上下文快满了

Claude Code会在状态栏显示当前上下文的使用情况。当你注意到以下信号时,说明上下文快满了:

  • Claude开始"忘记"你前面说过的事情,比如它不再遵守你之前设定的规则
  • 回复速度明显变慢
  • Claude明确提示上下文接近限制
  • 回复质量开始下降,出现前后矛盾

5.5.2 /compact的原理和代价

执行 /compact 之后,Claude会:

  1. 把整个对话历史总结成一段摘要
  2. 用这段摘要替换原来的详细历史
  3. 继续在摘要的基础上工作

代价是细节丢失。如果你之前讨论了某个很具体的实现细节,compact之后Claude可能只记得"讨论了缓存方案",而忘记了"决定用本地Caffeine而不是Redis,原因是避免分布式锁"。

什么时候用/compact

  • 已经完成一个子任务,准备开始下一个不相关的任务
  • 对话轮次超过30轮,历史已经很长
  • 收到上下文接近满的提示

什么时候不用/compact

  • 正在进行一个需要前后细节互相引用的复杂任务
  • 刚刚在对话里确认了某个重要决策,还没有写入CLAUDE.md

5.5.3 更好的替代方案:结构化地管理上下文

/compact 更好的做法是主动管理上下文

markdown
# 在CLAUDE.md里记录已确定的决策
## 缓存方案(2026年3月确认)
- 使用本地Caffeine缓存,不用Redis
- 原因:单机部署,分布式锁开销不必要
- 最大缓存容量:10000条,TTL:5分钟

把重要决策存进CLAUDE.md,就算compact之后,下次会话Claude依然能读到这些信息。


5.6 会话管理的最佳实践

5.6.1 什么时候新建会话

应该新建会话的情况

  • 任务类型完全不同(刚做完缓存优化,现在要写新功能)
  • 旧会话的上下文已经混乱(Claude开始答非所问)
  • 需要在一个干净的状态下做高风险操作
  • 已经完成了一个完整的开发任务,准备开始下一个

应该继续旧会话的情况

  • 任务还在进行中,需要前面讨论的背景
  • 需要参考前面几轮对话的结论
  • Claude已经对你的项目有了足够了解,不想重新建立上下文
bash
# 继续最近的会话
claude -c

# 查看所有历史会话并选择(如果支持)
claude --list-sessions

5.6.2 用"会话目标"管理对话方向

每次开始一个新的会话,先明确一个清晰的目标:

code
今天的任务:重构订单模块的缓存逻辑。
约束:只修改 service 层,不动 mapper 层。
完成标准:所有缓存相关测试通过,没有引入新的接口变更。

这样做的好处是:一旦对话偏离方向,你和Claude都能意识到,容易拉回来。

5.6.3 多终端多任务的正确姿势

如果你需要同时做多个不相关的任务,开多个终端、每个终端对应一个独立会话:

bash
# 终端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"理解局限"的最有效方式。


本页目录