AI Agent 设计与实现

拆解 Claude.ai · Claude Code · Codex · Cursor 的 Agent 架构
2026-05-05 · 技术白皮书

目录

  1. 工具调用的本质:模型能力 vs 系统工程
  2. Agent 核心架构:ReAct 与 Tool Use Loop
  3. 拆解 Claude.ai 的 Agent 设计
  4. 拆解 Claude Code 的 Agent 设计
  5. 横向对比:Claude Code vs Codex vs Cursor
  6. 设计你自己的 Agent 系统

一、工具调用的本质:模型能力 vs 系统工程

1.1 三层协作

工具调用是模型训练 + API 层转换 + 应用层执行三层协作的结果:

┌────────────── 应用层(你的代码 / Claude Code)──────────────┐ │ 定义工具 → 发请求 → 收到 tool_use → 执行工具 → 回传结果 │ ├────────────── API 层(Anthropic / OpenAI 服务端)─────────────┤ │ tools JSON → 转成 prompt 文本 → 解析模型输出 → 结构化返回 │ ├────────────── 模型层(Claude / GPT)─────────────────────────┤ │ 理解工具描述 → 决策是否调用 → 生成结构化 JSON → 整合结果回答 │ └──────────────────────────────────────────────────────────────┘

1.2 模型层:训练赋予的四个能力

  1. 意图识别 — 判断"用户的请求是否需要外部信息或动作"
  2. 工具选择 — 从可用工具列表中选最合适的(可以选多个)
  3. 参数生成 — 根据工具 schema 生成正确的 JSON 参数
  4. 结果整合 — 基于工具返回的结果,综合生成最终回答

这些能力是通过 Supervised Fine-Tuning (SFT)RLHF 训练出来的。训练数据大致如下:

// 训练样本示例(简化)
System: You have tools: web_search(query), calculator(expr)
Human: 北京今天多少度?
Assistant: [tool_use: web_search("北京 今天 气温")]
Tool Result: 北京今日最高温 28°C,最低 18°C,晴
Assistant: 北京今天最高气温 28°C,最低 18°C,天气晴朗。

模型见过数百万条这样的样本后,学会了一个关键判断:"我不知道答案 → 有可用工具 → 应该调用"

1.3 API 层:看不见的翻译官

当你向 Anthropic API 发送带 tools 参数的请求时,API 层做了这些事:

你发送的: 模型实际看到的 prompt: { In this environment you have "tools": [{ access to tools: "name": "web_search", "description": "搜索网页", web_search: 搜索网页 "input_schema": { Parameters: {"query": string} "properties": { "query": {"type":"string"} (如需使用工具,输出特定格式的 } XML/JSON 块) } }] }

API 层是双向翻译:

这就是为什么不同 API 提供商(Anthropic vs OpenAI)的工具格式不同 — 它们的"翻译层"实现不同,但本质都是在做同一件事。

1.4 应用层:你写的循环

模型只负责"决定调用什么工具"。实际执行工具、管理上下文、控制循环全部是应用层的工作。这就是我们在 server.mjs 中写的 chat() 函数做的事。


二、Agent 核心架构:ReAct 与 Tool Use Loop

2.1 ReAct 范式

几乎所有现代 Agent 都遵循 ReAct(Reasoning + Acting)范式,由 Yao et al. (2022) 提出:

┌──────────────┐ │ 用户输入 │ └──────┬───────┘ ▼ ┌────────────────────────┐ │ Reason(推理/思考) │ ← 模型分析任务,决定下一步 └────────────┬───────────┘ ▼ ┌───────────────┐ │ 需要工具吗? │ └───┬───────┬───┘ │是 │否 ▼ ▼ ┌────────────┐ ┌──────────────┐ │ Act(行动) │ │ 输出最终回答 │ │ 调用工具 │ └──────────────┘ └──────┬─────┘ ▼ ┌────────────┐ │ Observe │ ← 观察工具返回的结果 │ (观察结果) │ └──────┬─────┘ │ └──→ 回到 Reason(可能需要更多工具)

2.2 Tool Use Loop 的工程实现

ReAct 在工程上的实现就是一个 while 循环

async function agentLoop(userMessage) {
  const messages = [systemPrompt, userMessage];

  for (let round = 0; round < MAX_ROUNDS; round++) {
    const response = await callLLM(messages, tools);

    if (response.stop_reason === "tool_use") {
      // 模型想用工具 → 执行 → 结果追加到 messages
      for (const toolCall of response.tool_uses) {
        const result = await executeTool(toolCall);
        messages.push(assistantMsg, toolResultMsg);
      }
      continue; // 下一轮 → 模型看到结果后继续推理
    }

    // 模型直接回答 → 结束循环
    return response.text;
  }
}

这段代码就是所有 Agent 的核心骨架。Claude.ai、Claude Code、Codex 本质上都是这个循环的不同实现。

2.3 关键设计决策

决策点选项权衡
最大轮数通常 5–20 轮太少限制能力,太多浪费 token 和时间
流式 vs 非流式流式更好的 UX流式需要实时解析 tool_calls,复杂度高
并行工具调用模型可一次返回多个 tool_use并行执行更快,但需要处理依赖关系
上下文管理累积 / 压缩 / 滑动窗口累积最准确但 token 消耗大
错误处理重试 / 跳过 / 让模型决定把错误信息返回给模型通常是最好的策略

三、拆解 Claude.ai 的 Agent 设计

3.1 整体架构

┌─────────── claude.ai 前端 ──────────┐ │ 聊天界面 │ Artifact 面板 │ 文件上传 │ └─────────────────┬───────────────────┘ │ WebSocket / SSE ▼ ┌─────────── claude.ai 后端 ──────────┐ │ Session 管理 │ Tool Use Loop │ │ ┌──────────────────────────────┐ │ │ │ System Prompt(含工具描述) │ │ │ │ + 用户消息 │ │ │ │ → Claude API(/v1/messages)│ │ │ │ → tool_use? 执行并循环 │ │ │ │ → end_turn? 流式返回前端 │ │ │ └──────────────────────────────┘ │ │ 工具执行器: │ │ ├─ web_search → Brave API │ │ ├─ code_execution → JS Sandbox │ │ ├─ artifact → 前端 Artifact 面板 │ │ └─ file_read → 解析用户上传文件 │ └─────────────────────────────────────┘

3.2 工具清单与设计思路

Web Search

模型自主决定搜索词,可以多次搜索、逐步深入。这比传统的"用户勾选联网"体验更好,因为模型知道什么时候需要搜索、搜什么最有效。

Code Execution(Analysis Tool)

沙盒化的 JavaScript 运行环境。模型写代码 → 服务端在沙盒中执行 → 结果(文本/图表)返回给模型。典型用途:数据分析、数学计算、图表生成。

Artifacts

Claude.ai 最有辨识度的功能。本质是一个结构化输出工具

Extended Thinking

不是传统意义的工具,而是模型的内部推理过程。通过 API 的 thinking 参数控制。模型在调用工具前先"思考"策略,用户可以看到思考过程。

3.3 System Prompt 设计

Claude.ai 的 system prompt 是整个 Agent 行为的蓝图。核心要素:

  1. 身份定义 — "你是 Claude,由 Anthropic 开发"
  2. 工具使用指导 — 什么时候用什么工具、不用工具的场景
  3. Artifact 规范 — 什么内容该创建 Artifact、格式要求
  4. 安全边界 — 拒绝什么请求、如何处理敏感内容
  5. 输出风格 — 简洁、直接、不过度解释

四、拆解 Claude Code 的 Agent 设计

Claude Code 是一个比 claude.ai 复杂得多的 Agent 系统。它不是简单的聊天+工具,而是一个完整的软件工程 Agent。

4.1 架构总览

┌────────────────── Claude Code CLI ──────────────────┐ │ │ │ ┌─────────── Agentic Loop ───────────┐ │ │ │ │ │ │ │ System Prompt(极长,~3000行) │ │ │ │ + 工具定义(10+ 个原生工具) │ │ │ │ + 用户消息 │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ Claude API (/v1/messages) │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ stop_reason == tool_use? │ │ │ │ ├─ 是 → 权限检查 → 执行 → 循环 │ │ │ │ └─ 否 → 输出给用户 │ │ │ └────────────────────────────────────┘ │ │ │ │ ┌─ 权限系统 ─┐ ┌─ 上下文管理 ─┐ ┌─ Hook 系统 ─┐ │ │ │ 每个工具调 │ │ 自动压缩 │ │ 生命周期事件 │ │ │ │ 用需用户批 │ │ 超过限制时 │ │ 可注入自定 │ │ │ │ 准或自动批 │ │ AI 总结历史 │ │ 义行为 │ │ │ └────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌─ 子 Agent ──┐ ┌─ Plan 模式 ─┐ ┌─ Worktree ──┐ │ │ │ 并行执行独 │ │ 先规划后执 │ │ Git 隔离分 │ │ │ │ 立任务 │ │ 行,可分模 │ │ 支并行开发 │ │ │ └─────────────┘ └──────────────┘ └──────────────┘ │ └──────────────────────────────────────────────────────┘

4.2 原生工具体系

Claude Code 提供了一套专为软件工程设计的工具:

工具功能设计理由
Read读取文件内容(支持行范围)cat 更安全,有行号、支持图片/PDF
Write创建/覆写文件完整文件写入,适合新文件
Edit精确字符串替换只发 diff,token 效率高,避免覆盖整个文件
Bash执行 shell 命令万能后备,但鼓励用专用工具
Glob按模式查找文件find 更快,按修改时间排序
Grep搜索文件内容基于 ripgrep,比 grep 更强
Agent启动子 Agent并行执行独立任务,隔离上下文
设计哲学:专用工具优于通用工具。EditBash+sed 更安全、更省 token、用户更容易审查。GrepBash+grep 输出更规范。这种"禁止用 Bash 做能用专用工具做的事"的策略,在 system prompt 中被明确要求。

4.3 权限系统:Human-in-the-Loop

Claude Code 的核心安全设计:每个工具调用都要用户批准(除非配置了自动批准)。

// 权限分级
读文件    → 通常自动批准(低风险)
写/编辑   → 需要用户确认(中风险,显示 diff)
Bash 命令 → 需要用户确认(高风险,显示命令)
git push  → 特别警告(不可逆操作)
rm -rf    → 强烈警告(破坏性操作)

这是 Agent 设计中的关键权衡:自主性 vs 安全性。完全自主的 Agent 效率高但风险大;完全需要批准的 Agent 安全但效率低。Claude Code 的方案是分级权限 + 可配置的自动批准。

4.4 上下文管理:解决 200K token 限制

长时间工作的 Agent 会累积大量上下文(代码内容、命令输出、工具结果)。Claude Code 的策略:

  1. 自动压缩(auto-condense)— 当上下文接近限制时,用 AI 总结历史对话,保留关键信息
  2. 标准截断— 保留首尾对话,丢弃中间部分(分 50% / 25% 两档)
  3. 文件读取去重— 同一文件不重复读取
  4. Prompt Caching— Anthropic 的 5 分钟缓存,避免重复发送 system prompt

4.5 子 Agent 系统

Claude Code 可以启动子 Agent 并行工作。每个子 Agent 有独立的上下文窗口和工具集。

// 主 Agent 启动两个子 Agent 并行
Agent({
  description: "研究 API 文档",
  prompt: "查找所有 REST endpoint..."
})
Agent({
  description: "运行测试套件",
  prompt: "执行 npm test 并分析失败..."
})

子 Agent 的设计要点:

4.6 Plan 模式

对于复杂任务,Claude Code 支持"先规划再执行":

  1. Plan 阶段:模型探索代码库、分析需求、提出实现方案(只用读取工具,不修改)
  2. 用户审查:用户查看并批准/修改方案
  3. Act 阶段:模型按照方案执行(读取+写入+命令)

Plan 和 Act 可以使用不同的模型(比如 Plan 用快速模型,Act 用强力模型)。

4.7 Hook 系统

Hook 是 Claude Code 的扩展点,允许用户在 Agent 生命周期的关键节点注入自定义行为:

Hook触发时机用途示例
PreToolUse工具执行前阻止危险命令、修改参数
PostToolUse工具执行后记录日志、触发 CI
UserPromptSubmit用户提交消息时输入验证、上下文注入
PreCompact上下文压缩前保留关键信息
Notification系统通知桌面通知、Slack 推送

五、横向对比:Claude Code vs Codex vs Cursor

5.1 定位差异

维度Claude CodeOpenAI CodexCursor
形态CLI + IDE 扩展云端 Agent整合式 IDE
交互方式终端对话Web 面板+PRIDE 内嵌聊天
执行环境本地机器云端沙盒容器本地机器
模型Claude (Opus/Sonnet)codex-1 (o3 衍生)多模型(Claude/GPT/自有)
定价按 token按任务订阅制

5.2 Agent 架构对比

Claude Code — 实时交互式 Agent

Codex — 异步任务式 Agent

Cursor — IDE 集成式 Agent

5.3 工具设计对比

工具类别Claude CodeCodexCursor
文件读取Read(行范围+图片+PDF)直接文件系统访问IDE API + 索引
文件编辑Edit(精确替换)直接写入Apply 模型(diff)
代码搜索Grep+Glob标准命令行语义索引 + ripgrep
命令执行Bash(需批准)完全自由(沙盒内)Terminal(需批准)
网页搜索WebSearch不支持@web
子任务Agent(子 Agent)不支持不支持
扩展性MCP 协议 + Hook容器环境定制MCP 协议

5.4 核心设计哲学差异

Claude Code:"我是你身边的结对编程伙伴。每一步我都征求你的意见,你随时可以纠正我。"
Codex:"把任务交给我,去喝杯咖啡,回来看 PR 就行。"
Cursor:"我住在你的 IDE 里,从自动补全到完整 Agent,无缝切换。"

5.5 安全模型对比

安全策略Claude CodeCodexCursor
执行隔离本地(无隔离)云端沙盒容器本地(无隔离)
权限控制分级批准 + YOLO 模式沙盒 = 天然隔离工具调用批准
代码审查Diff 实时预览PR ReviewDiff 预览
网络访问完全(本地环境)受限(白名单)完全(本地环境)
回滚能力Checkpoint 系统Git 分支文件级撤销

Codex 的沙盒模型最安全(Agent 在隔离容器中,无法影响生产环境),但也最受限(无法访问本地资源)。Claude Code 和 Cursor 在本地运行,能力最强但风险也最大,通过人工审批来控制风险。


六、设计你自己的 Agent 系统

基于以上分析,设计 Agent 时的关键检查清单:

6.1 核心循环

// 最小 Agent 骨架(你已经实现了这个!)
while (round < MAX_ROUNDS) {
  response = await llm.call(messages, tools);
  if (response.wants_tools) {
    results = await execute(response.tool_calls);
    messages.append(response, results);
  } else {
    return response.text;
  }
}

6.2 工具设计原则

  1. 最小权限 — 每个工具只做一件事,避免万能工具
  2. 清晰的 schema — description 和参数描述是模型决策的依据
  3. 有限的输出 — 工具返回不要太长(会占用 context),做好截断
  4. 优雅的错误 — 把错误信息返回给模型,让它自己决定下一步
  5. 可观测性 — 每次工具调用都要让用户知道发生了什么

6.3 System Prompt 设计

  1. 角色定义 — 你是谁、你的能力边界
  2. 工具指导 — 什么时候用什么工具(正例和反例)
  3. 输出规范 — 回复的格式、长度、语言
  4. 安全约束 — 不能做什么
常见陷阱:System prompt 过长会导致模型"注意力分散",遵从度下降。Claude Code 的 ~3000 行 prompt 之所以有效,是因为 Claude 系列模型专门针对长 prompt 做了优化。自己设计时建议控制在 500-1000 字。

6.4 进阶能力路线图

你的 claude-lite 已经实现了第 1 级。后续可以按需添加:

级别能力实现复杂度
1 ✅基础 Tool Use Loop + Web Search + Artifact已完成
2Code Execution(沙盒 JS/Python)中 — Node.js vm 模块或 Docker
3URL 抓取 + 深度研究低 — fetch + html-to-text
4图片生成(你已有 LuckyAPI gpt-image-2)
5Artifact 版本管理(v1/v2/v3 切换)中 — 前端状态管理
6文件上传分析(PDF/CSV → 结构化数据)
7Extended Thinking 展示低 — 解析 thinking 块
8多 Agent 协作高 — 需要任务编排系统

结语

AI Agent 的核心并不神秘 — 它是一个 while 循环,里面是一个 LLM 调用和一组工具。真正的挑战在于工程细节:上下文管理、错误恢复、安全控制、用户体验。你的 claude-lite 已经走出了最关键的第一步:从"聊天机器人"变成了"Agent"。