为什么 Claude Code 等 AI Agent 能自己写代码、改 bug、提交 PR?为什么它和 ChatGPT 完全不一样?这篇文章用最简单的语言,拆解 AI Agent 的底层工作原理。
一句话说清楚:AI Coding Agent 和普通 AI 有什么不同?
普通 AI(如 ChatGPT 对话)= 一问一答你输入 → 它输出 → 结束
AI Coding Agent(如 Claude Code)= 自主循环你给目标 → 它自己规划、执行、观察结果、调整、再执行……直到完成
直观对比:看看区别有多大
编辑
场景:给登录模块加邮件验证
🔴 普通 AI(ChatGPT)的工作方式
你:帮我写一个登录函数AI:(输出一段代码文本)你:复制粘贴到编辑器你:有个 bug,再帮我改AI:(输出修改后的文本)你:再复制粘贴……
👉 你是执行者,AI 只是建议者
🟢 AI Coding Agent(Claude Code)的工作方式
你:给登录模块加邮件验证Claude: ✓ 读取现有代码 ✓ 理解架构 ✓ 制定计划 ✓ 写入文件 ✓ 运行测试 ✓ 发现错误 → 自己修复 ✓ 测试通过 → 提交 PR
👉 Claude 是执行者,你是审批者
能力对比表:差距在哪里?
| 能力维度 | 普通 AI 对话 | AI Coding Agent |
|---|---|---|
| 📖 读取文件 | 需要你粘贴给它 | 自己读取 |
| ✏️ 修改代码 | 输出文本,你手动改 | 直接写入文件 |
| ⚙️ 运行命令 | 告诉你要跑什么 | 自己执行 |
| 🐛 处理错误 | 你复制错误信息给它 | 看到输出,自己调整 |
| 🔄 多步任务 | 每步都要你介入 | 自主完成多步骤 |
| ⏱️ 持续工作 | 一轮结束就停 | 可以跑几小时 |
核心差异:Agent 有 感知 → 思考 → 行动 的循环能力,普通 AI 只有"思考 → 输出"。
Agent 的核心秘密:循环机制(The Agent Loop)
这是 Agent 能"自主工作"的关键。理解这个循环,就理解了 Claude Code 为什么这么强大。
编辑
🔄 完整循环的 6 个步骤
步骤 ① 接收目标 + 完整上下文
Claude 接收的不只是你的指令,还包括:
- • 你的指令
- • CLAUDE.md 项目规范
- • 之前读取的所有文件内容
- • 上一轮命令的输出
- • 历史对话记录
这个"输入包"可能长达数万个 Token。
示例:
你说:"给登录模块加邮件验证"Claude 实际接收到:- 你的指令- CLAUDE.md 中的项目规范- 之前读取的 auth/login.ts 文件内容- 上次运行测试的输出- ...
步骤 ② 思考 & 规划
Claude 分析整个上下文,决定下一步做什么。
内部推理过程:
"需要先了解现有的 login 函数结构→ 应该先读取 auth/login.ts→ 然后再决定怎么修改"
在 Plan Mode 下,这个推理过程会展示给你审批;普通模式下 Claude 直接进入下一步。
步骤 ③ 生成工具调用请求
关键点:Claude 不是直接执行操作,而是生成一个"请求"。
Claude 生成的请求:
{ "tool": "Read", "input": { "path": "src/auth/login.ts" }}
这个请求会被发送给 Claude Code 进程。
步骤 ④ 宿主进程执行(权限检查在这里)
Claude Code 进程收到请求后的处理流程:
1. 触发 PreToolUse Hook(如果配置了)2. 检查 settings.json 权限规则 - deny:直接拒绝 - ask:询问用户 - allow:通过3. 执行真正的操作(读文件、写文件、运行命令等)4. 触发 PostToolUse Hook(如果配置了)5. 返回结果给 Claude
示例:
权限检查:"Read(src/auth/login.ts)" → 匹配 allow 规则 → 执行执行结果:读取文件内容,返回给 Claude
步骤 ⑤ 观察结果,更新上下文
工具执行的结果(文件内容、命令输出、错误信息)被追加到上下文窗口。
Claude 在下一轮会看到这个结果,就像"眼睛看到了执行的效果"。
追加到上下文:
[Tool result]:export async function login(email, password) { // TODO: add validation const user = await db.find(email) ...}
步骤 ⑥ 决定:继续 or 结束?
Claude 判断:
- • ✅ 任务完成了吗?
- • 🤔 还需要什么信息?
- • 📋 下一步该做什么?
如果任务未完成,回到步骤 ②,开始新一轮循环。
Claude 的判断:
"已读取文件,看到了 TODO 注释→ 需要编写邮件验证逻辑→ 继续循环,下一步:Edit 文件"
💡 上下文是循环的"记忆"
- • 每次循环的结果都被追加到上下文窗口
- • Claude 在下一轮看到完整历史
- • 这就是为什么 Claude 能"记得"几步之前做了什么
但这也是最大的局限:
- • 上下文窗口有限(如 200k Token)
- • 太长的任务需要压缩(
/compact)或拆分为子任务 - • 上下文用完后,"记忆"就断了
这正是 CLAUDE.md、session logs 存在的原因——提供不依赖上下文的持久记忆。
工具系统:Agent 的"手"
语言模型本身只能生成文本。工具(Tools)让它能真正影响世界。
没有工具,Claude Code 和普通对话 AI 没有区别。
🛠️ 核心工具清单
| 工具 | 功能 |
|---|---|
| Read | 读取文件 |
| Write | 写入文件 |
| Edit | 精确编辑(替换指定内容) |
| Bash | 执行命令 |
| Glob | 查找文件(支持通配符) |
| Grep | 搜索内容 |
| WebFetch | 获取网页 |
| WebSearch | 搜索引擎 |
| TodoWrite | 任务管理 |
| MCP 工具 | 外部服务扩展 |
🔧 工具调用的技术实现
三个关键点:
1️⃣ Claude 生成请求,不直接执行
- • Claude 生成结构化的 JSON 请求
- • 描述它想做什么
2️⃣ Claude Code 进程真正执行
- • 接收请求
- • 执行操作
- • 返回结果
3️⃣ Claude 没有文件系统权限
- • 通过"委托宿主执行"来影响世界
- • 所有操作都经过权限检查
🧠 形象类比
Claude = 大脑(思考和决策)Claude Code 进程 = 手臂(实际执行)工具调用 = 神经信号(大脑告诉手臂做什么)工具结果 = 感觉反馈(手臂告诉大脑发生了什么)
📋 工具调用实战示例
看看一个完整的循环是什么样的:
// ① Claude 决定读取文件{ "tool": "Read", "input": { "path": "src/auth/login.ts" } }// ② Claude Code 执行,返回文件内容{ "result": "export function login(email, password) { ... }" }// ③ Claude 看到内容后,决定修改{ "tool": "Edit", "input": { "path": "src/auth/login.ts", "old_string": "// TODO: add validation", "new_string": "if (!isValidEmail(email)) throw new Error('...')"}}// ④ Claude Code 执行编辑{ "result": "File updated successfully" }// ⑤ Claude 决定跑测试{ "tool": "Bash", "input": { "command": "npm test auth" }}
这个循环每秒可能发生数次,构成了 Claude Code "自主工作"的底层机制。
Claude Code 的五层架构
理解这五层,就理解了整个系统是如何协作的。
编辑
🎯 第 1 层:你(用户)
角色:目标提供者 & 最终审批人
你不是执行者,是决策者。提供目标、审批计划、处理边界情况。
接口:终端 / VS Code / 浏览器 / 手机(Remote Control)/ 语音(/voice)
⚙️ 第 2 层:Claude Code 进程(编排层)
角色:在 Claude 和真实环境之间做"翻译"和"守门"
核心职责:
- • 管理 Agent 循环
- • 权限检查
- • Hooks 触发
- • 会话状态管理
- • 上下文压缩
配置文件:settings.json 控制这一层的行为边界
🧠 第 3 层:Claude 模型(大脑层)
角色:理解意图、规划步骤、生成工具调用
输入:
- • System Prompt
- • CLAUDE.md 内容
- • 对话历史
- • 工具结果
输出:下一步行动(工具调用请求)
配置文件:CLAUDE.md 注入到这一层的 System Prompt
🔨 第 4 层:工具层(执行层)
角色:把 Claude 的"想法"转化为真实世界的操作
工具集:Read / Write / Edit / Bash / WebFetch / MCP……
扩展性:MCP 服务器让工具无限延伸(数据库、Slack、浏览器……)
🌍 第 5 层:真实环境(被操作的世界)
包含:
- • 文件系统
- • Git 仓库
- • 终端进程
- • 外部 API
- • 浏览器
- • 数据库
这是 Agent 最终影响的对象。
📊 数据流向:一次完整任务的旅程
从你的指令到代码落地,数据是这样流动的:
编辑
你的指令 ↓Claude Code 进程接收 ↓读取 settings.json 权限配置 ↓注入 CLAUDE.md 内容到 System Prompt ↓发送给 Claude 模型(含完整上下文) ↓Claude 生成工具调用请求 ↓Claude Code 检查权限(deny/ask/allow) ↓触发 PreToolUse Hook(如有) ↓执行工具(读写文件、跑命令) ↓触发 PostToolUse Hook(如有) ↓工具结果追加到上下文 ↓返回给 Claude 模型(下一轮循环) ↓Claude 决定:继续执行 or 任务完成 ↓你看到最终结果
🤔 为什么这样设计?
Q1: 为什么是"循环"而不是"一次性生成"?
① 现实任务有不确定性
- • 你不可能在开始时就知道所有需要的信息
- • 读了文件才知道架构
- • 跑了测试才知道有没有 bug
- • 循环允许 Claude 边做边学
② 错误是不可避免的
- • 一次性生成的代码必然有错
- • 循环让 Claude 能:看到错误 → 理解原因 → 自我修正
- • 无需你介入
③ Token 限制
- • 一次性生成整个功能会超出输出 Token 限制
- • 循环允许分步处理,每次只生成一小部分
④ 人类介入点
- • 循环在每个工具调用前暂停(ask 模式)
- • 给你审批或纠正的机会
- • 而不是等到最后才发现整个方向错了
Q2: 为什么工具调用要经过"宿主进程"?
① 安全隔离
- • Claude 模型运行在 Anthropic 的服务器上
- • 不能直接访问你的文件系统
- • 通过宿主进程,可以实施权限检查(settings.json)
② 可审计性
- • 所有工具调用经过宿主进程
- • 可以记录日志
- • 可以触发 Hooks
- • 可以通知用户
③ 可扩展性
- • 新工具(MCP 服务器)只需向宿主进程注册
- • Claude 模型无需更新就能使用新能力
⚠️ Agent 的核心局限 & 应对策略
每个配置工具都在针对 Agent 的某个固有局限提供解决方案。
| 局限 | 根本原因 | 应对策略 |
|---|---|---|
| 🧠 会"忘记"早期指令 | 上下文窗口稀释效应 | CLAUDE.md 持久注入 + /compact 压缩 |
| 🎯 方向跑偏 | 没有规划就执行 | Plan Mode 先规划后执行 |
| 🔁 重复犯同类错误 | 没有跨会话记忆 | lessons.md 记录 + CLAUDE.md 累积规则 |
| ⚡ 危险操作无法撤销 | 工具有副作用 | settings.json deny 规则 + Hooks 拦截 |
| 🔀 并发任务互相干扰 | 共享文件系统 | git worktree 给每个 Agent 独立工作区 |
这就是 Claude Code 整个配置体系存在的原因。
💡 总结
AI Coding Agent 不是更强的 ChatGPT,而是一种全新的工作模式。
核心区别
普通 AI:
你问 → 它答 → 你执行
AI Coding Agent:
你定目标 → 它自己规划、执行、修正、完成
三大核心机制
这种转变的核心是:
-
🔄 循环机制
- 感知 → 思考 → 行动 → 感知 → ……
-
🛠️ 工具系统
- 让 AI 能真正影响世界
-
📝 上下文管理
- 让 AI 能"记住"之前做了什么
最后一句话
当你看到 Claude Code 在终端里不断输出、读文件、改代码、跑测试……
那不是魔法,而是一个精心设计的循环系统在运转:
感知(工具结果)→ 思考(Claude 推理)→ 行动(工具调用)→ 感知(新的结果)→ ……
这就是 AI Coding Agent 的本质。
理解了这些,你就理解了为什么 Claude Code 能"自主工作"。