原文 What makes Claude Code so damn good (and how to recreate that magic in your agent)!?

Claude Code 是我目前使用过的最令人满意的 AI 智能体 / 工作流。它不仅让针对性代码修改或氛围式编写临时工具的过程不再繁琐,使用 Claude Code 甚至能让我感到愉悦。它拥有足够的自主性去完成有趣的任务,同时不会像其他一些工具那样,让人产生强烈的失控感。当然,大部分繁重工作由新版 Claude 4 模型(尤其是交错思维功能)承担。但即便基于相同的底层模型,我发现 Claude Code 在使用体验上,客观来说比 Cursor 或 GitHub Copilot 智能体更省心!是什么让它如此出色?如果你读到这里也有同感,接下来我会尝试给出一些答案。
注:本文并非一篇剖析 Claude Code 架构的博文(这类优质博文已有不少)。本文旨在基于我过去几个月使用和研究 Claude Code 的经验(以及我们拦截并分析的所有日志),为打造令人满意的大语言模型(LLM)智能体提供指南。你可以在附录部分找到相关提示词和工具。本文约 2000 字,建议耐心阅读!若你想快速了解核心内容,可从 “核心摘要” 部分入手。

如下如图,Claude Code 各类系统提示词,包括:

prompts

  • summarize_messages(总结消息)
  • analyze_bash_commands(分析 Bash 命令)
  • new_conversation(新对话)
  • analyze_git_history(分析 Git 历史)
  • unknown(未知)、main_prompt(主提示词)
  • analyze_file_paths(分析文件路径)
Claude Code(简称 CC)的使用体验极佳,核心原因在于它能直接解决问题。开发团队深刻理解大语言模型的优势与短板,CC 的提示词和工具既弥补了模型的不足,又充分发挥了其优势。它的控制循环极易理解,调试起来也十分简单。
Claude Code 一经推出,我们 MinusX 团队就开始使用。为了探究其内部机制,斯里吉特(Sreejith)编写了一个日志记录程序,用于拦截并记录所有网络请求。以下分析基于我过去几个月的大量使用经验。本文试图解答一个问题 ——“为何 Claude Code 如此出色?如何在你自己的基于对话的大语言模型智能体中,打造出类似 CC 的体验?”

Claude Code 的 “用户 – 助手 – 工具” 交互序列 ,包括user_text(用户文本)、assistant_tool_use|LS(助手工具使用 | 列表显示)、assistant_tool_use|Bash(助手工具使用 | Bash 命令)、assistant_tool_use|Write(助手工具使用 | 写入)、assistant_tool_use|Edit(助手工具使用 | 编辑)、assistant_tool_use|MultiEdit(助手工具使用 | 多文件编辑)、assistant_tool_use|Glob(助手工具使用 | 文件匹配)、assistant_tool_use|Grep(助手工具使用 | 文本搜索)、assistant_thinking(助手思考)、assistant_tool_use|Task(助手工具使用 | 任务)、assistant_tool_use|WebSearch(助手工具使用 | 网络搜索)、assistant_text(助手文本)、assistant_tool_use|WebFetch(助手工具使用 | 网络获取)、assistant_tool_use|TodoWrite(助手工具使用 | 待办事项写入)、user_image(用户图片)、assistant_tool_use|mcp__ide__getDiagnostics(助手工具使用 | IDE 诊断信息获取)、assistant_tool_use|Read(助手工具使用 | 读取)

tools

在所有工具中,“编辑(Edit)” 的使用频率最高,其次是 “读取(Read)” 和 “待办事项写入(TodoWrite)”。

核心摘要

如果说本文有一个核心要点需要你记住,那就是:保持简单,别搞复杂。大语言模型本身的调试和评估就已经足够困难,你额外增加的任何复杂度(多智能体、智能体交接或复杂的检索增强生成(RAG)搜索算法),都会让调试难度提升 10 倍。即便这样一个脆弱的系统能正常运行,后续你也会不敢对其进行大幅修改。因此,尽量将所有内容整合到一个文件中,避免过多冗余的框架代码,并且至少要彻底简化代码结构两三次。
以下是从 Claude Code 中提炼出的、可应用到你自己系统中的核心要点:

1. 控制循环

  • 1.1 保持一个主循环(最多包含一个分支)和一份消息历史记录。
  • 1.2 所有场景下都使用较小规模的模型,没错,任何时候都用。

2. 提示词

  • 2.1 采用 claude.md 格式,便于协作并记录用户偏好。
  • 2.2 使用特殊的 XML 标签、Markdown 格式,并搭配大量示例。

3. 工具

  • 3.1 大语言模型搜索优于基于检索增强生成(RAG)的搜索。
  • 3.2 如何设计优质工具?(高阶工具与低阶工具的选择)
  • 3.3 让智能体自主管理待办事项列表。

4. 可控性

  • 4.1 语气和风格的把控。
  • 4.2 “请注意,此事至关重要(PLEASE THIS IS IMPORTANT)” 这类表述,目前仍是最有效的方式。
  • 4.3 编写算法时,要附上启发式规则和示例。
Claude Code 在架构设计的每个环节都优先选择简洁性 —— 一个主循环、简单的搜索功能、简洁的待办事项列表等。请克制过度开发的冲动,为模型搭建良好的运行框架,然后让它自主发挥即可!这难道不是自动驾驶技术发展历程的重演吗?教训还不够深刻吗?

1. 控制循环设计

1.1 保持一个主循环

可调试性远比复杂的手工调优多智能体语言链图节点组合更重要。
尽管多智能体系统如今十分热门,但 Claude Code 仅有一个主线程。它会定期使用几种不同类型的提示词来总结 Git 历史、将消息历史整合为单条消息,或设计一些有趣的用户体验元素。除此之外,它始终维持着一个扁平化的消息列表。对于层级化任务,Claude Code 有一种巧妙的处理方式:将自身作为子智能体生成,但该子智能体无法再生成新的子智能体。系统最多只会存在一个分支,分支的结果会以 “工具响应” 的形式添加到主消息历史中。
若问题较为简单,主循环会通过迭代式工具调用来处理;若存在一个或多个复杂任务,主智能体会生成自身的副本。“最多一个分支” 与 “待办事项列表” 的结合,既能让智能体将问题拆解为子问题,又能确保其始终聚焦最终目标。
我严重怀疑你的应用是否真的需要多智能体系统。每增加一层抽象,系统的调试难度就会增加一分,更重要的是,会偏离通用模型的改进轨道。
control_loop
  • 简单问题:用户问题→助手→读取工具(Read Tool)→响应→编辑工具(Edit Tool)→响应→助手
  • 复杂问题:用户问题→主循环(含一个分支)→助手→任务工具(Task Tool)→助手→读取工具(Read Tool)→响应→文本搜索工具(Grep Tool)→响应→编辑工具(Edit Tool)→响应→助手

1.2 所有场景都使用较小规模的模型

Claude Code 中,超过 50% 的重要大语言模型调用都指向 claude-3-5-haiku(较小规模模型)。该模型被用于读取大文件、解析网页、处理 Git 历史和总结长对话,甚至还用于生成单字处理标签 —— 实际上,每一次按键操作都会调用它!与标准模型(Sonnet 4、GPT-4.1)相比,小规模模型的成本低 70%-80%,建议你大量使用。

2. 提示词

Claude Code 的提示词内容极其详尽,包含启发式规则、示例以及 “重要(IMPORTANT)” 提示。系统提示词约 2800 个 token,而工具相关提示词更是多达 9400 个 token。用户提示词中总会包含 claude.md 文件,该文件通常又会占用 1000-2000 个 token。系统提示词涵盖语气、风格、主动性、任务管理、工具使用规则和任务执行等部分,还包含日期、当前工作目录、平台、操作系统信息以及最新提交记录。
建议你完整阅读一遍这些提示词!

2.1 用 claude.md 整合用户上下文与偏好

如今,大多数代码智能体开发者都会采用上下文文件(又称 Cursor 规则、claude.md、agent.md),这已成为一种主流模式。有无 claude.md,Claude Code 的性能表现可谓天差地别。对于开发者而言,这是传递无法从代码库中推断出的上下文信息、明确所有严格偏好的有效方式。例如,你可以通过它强制大语言模型跳过某些文件夹,或使用特定库。Claude Code 会在每次处理用户请求时,都发送 claude.md 的完整内容。
我们最近在 MinusX 中引入了 minusx.md 文件,它正迅速成为我们智能体记录用户和团队偏好的默认上下文文件。

2.2 特殊 XML 标签、Markdown 格式与大量示例

目前业界已普遍认可,XML 标签和 Markdown 是两种有效的提示词结构化方式,而 Claude Code 对这两种方式都进行了大量运用。以下是 Claude Code 中几个值得关注的 XML 标签:
  • <system-reminder>(系统提醒):常用于提示词各部分的末尾,用于提醒大语言模型一些它可能会忘记的内容。示例如下:
  • <good-example>(正面示例)、<bad-example>(反面示例):用于明确启发式规则。当模型面临多种看似合理的选择或工具调用方式时,这些示例能清晰对比不同情况,明确最优路径。示例如下:
Claude Code 还会使用 Markdown 在系统提示词中划分清晰的章节,例如:
  • 语气和风格(Tone and style)
  • 主动性(Proactiveness)
  • 遵循规范(Following conventions)
  • 代码风格(Code style)
  • 任务管理(Task Management)
  • 工具使用规则(Tool use policy)
  • 任务执行(Doing Tasks)
  • 工具(Tools)

3. 工具Tools

建议你完整阅读工具相关提示词(附录中) —— 其长度高达 9400 个 token!

3.1 大语言模型搜索优于基于检索增强生成(RAG)的搜索

Claude Code 与其他热门代码智能体的一个显著区别,在于它摒弃了检索增强生成(RAG)技术。Claude Code 会像人类一样搜索代码库,使用极为复杂的ripgrepjqfind命令。由于大语言模型对代码有深刻理解,它能运用复杂的正则表达式找到几乎所有它认为相关的代码块。有时,它还会使用较小规模的模型读取整个文件。
检索增强生成(RAG)在理论上看似可行,但会引入新的(且更隐蔽的)故障模式。比如,应使用何种相似度函数?选择哪个重排序器?如何对代码进行分块处理?如何处理大型 JSON 文件或日志文件?而借助大语言模型搜索,它只需查看 JSON 文件的 10 行内容就能理解其结构,若有需要,再查看 10 行 —— 完全模仿人类的操作方式。最重要的是,这种方式支持强化学习(RL)优化,目前各大实验室已在开展相关研究。模型承担了大部分繁重工作,这本身就是合理的设计,能大幅减少智能体中的可动部件数量。此外,将两个复杂的智能系统以这种方式连接,本身就不够简洁。我最近和朋友开玩笑说,这就像是大语言模型时代的 “摄像头与激光雷达之争”,而我说这话时半开玩笑半认真。

3.2 如何设计优质工具?(低阶工具与高阶工具的选择)

这是所有大语言模型智能体开发者都会反复思考的问题:应该为模型提供通用任务类工具(如执行有意义的操作),还是更基础的低阶工具(如模拟输入、点击和 Bash 命令)?答案是 “视情况而定”(且两种工具都应使用)。
Claude Code 拥有低阶工具(Bash、Read、Write)、中阶工具(Edit、Grep、Glob)和高阶工具(Task、WebFetch、exit_plan_mode)。既然 Claude Code 能使用 Bash 命令,为何还要单独设置 Grep 工具?核心权衡点在于:工具的预期使用频率,与模型使用该工具的准确性。由于 Grep 和 Glob 工具的使用频率极高,为它们单独设计工具是合理的;同时,在特殊场景下,模型也能编写通用的 Bash 命令。
同样,像 WebFetch 或 “mcp__ide__getDiagnostics” 这类更高阶的工具,其功能具有高度确定性。这能避免大语言模型反复执行低阶的点击和输入操作,确保其始终聚焦核心任务。就帮帮这个 “可怜” 的模型吧!工具描述会附带详尽的提示词和大量示例,系统提示词中还会说明 “何时使用工具”,以及 “如何在功能重叠的工具间做选择”。
Claude Code 包含的工具如下:
  • Task(任务)
  • Bash(命令行)
  • Glob(文件匹配)
  • Grep(文本搜索)
  • LS(列表显示)
  • ExitPlanMode(退出规划模式)
  • Read(读取)
  • Edit(编辑)
  • MultiEdit(多文件编辑)
  • Write(写入)
  • NotebookEdit(笔记本编辑)
  • WebFetch(网络获取)
  • TodoWrite(待办事项写入)
  • WebSearch(网络搜索)
  • mcp__ide__getDiagnostics(IDE 诊断信息获取)
  • mcp__ide__executeCode(IDE 代码执行)

3.3 让智能体自主管理待办事项列表

这种设计有诸多优势。在长期运行的大语言模型智能体中,“上下文失效” 是一个常见问题:智能体起初会积极处理复杂问题,但随着时间推移,往往会偏离方向,最终输出无效内容。目前,智能体设计领域有几种解决该问题的方案:许多智能体会尝试使用明确的待办事项(一个模型生成待办事项,另一个模型执行),或采用 “多智能体交接 + 验证” 模式(需求文档 / 产品经理智能体→开发智能体→质检智能体)。
我们已经知道,出于多种原因,多智能体交接并非理想方案。Claude Code 采用了 “明确的待办事项列表” 设计,但由模型自主维护。这既能确保大语言模型始终聚焦目标(通过大量提示词引导它频繁参考待办事项列表),又能让模型在执行过程中灵活调整方向。同时,这一设计还能充分利用模型的交错思维能力,让它实时拒绝或新增待办事项。

4. 可控性

4.1 语气和风格

Claude Code 会明确控制智能体的 “审美行为”。系统提示词中设有专门章节,围绕语气、风格和主动性提供详细指导和示例。这也是为何 Claude Code 在评论内容和响应积极性上,都能给人 “得体” 的感觉。建议你直接将其中的大部分内容复制到自己的应用中使用。
 对应中文

4.2 “此事至关重要(THIS IS IMPORTANT)” 仍是当前最有效的方式

遗憾的是,在引导模型避免某些行为方面,Claude Code 并无更好的办法。“重要(IMPORTANT)”“非常重要(VERY IMPORTANT)”“切勿(NEVER)” 和 “必须(ALWAYS)” 这类表述,仍是防止模型出错的最佳方式。我期待未来模型的可控性会进一步提升,不再需要这种 “生硬” 的表述。但就目前而言,Claude Code 大量使用了这种方式,你也应如此。以下是部分示例:
中文翻译

4.3 编写算法(附带启发式规则和示例)

明确大语言模型需要执行的核心任务,并为此编写算法,这一点至关重要。你可以尝试模拟大语言模型的思考过程,通过示例梳理所有决策节点,并明确地记录下来。将其整理成流程图形式会更有帮助,这能规范决策流程,帮助大语言模型更好地遵循指令。务必避免将 “可做” 和 “不可做” 的事项混为一谈、杂乱罗列 —— 这种方式不仅难以记忆,还可能出现相互矛盾的情况。若你的提示词长达数千个 token,很可能会无意中包含相互冲突的 “可做” 与 “不可做” 规则。这种情况下,大语言模型会变得极其脆弱,你也无法再为其新增使用场景。
Claude Code 系统提示词中的 “任务管理(Task Management)”“任务执行(Doing Tasks)” 和 “工具使用规则(Tool Usage Policy)” 章节,清晰地列出了需要遵循的算法。你还可以在这些章节中添加大量启发式规则,以及大语言模型可能遇到的各类场景示例。

额外建议:为何要关注大型实验室的提示词设计?

目前,引导大语言模型的核心工作之一,就是逆向工程其训练后优化(Post-training)/ 基于人类反馈的强化学习(RLHF)的数据分布。例如,应使用 JSON 还是 XML 格式?工具描述应放在系统提示词中,还是仅在工具部分提及?如何处理应用的当前状态?参考大型实验室在自家应用中的设计方案,能为你的开发提供有效指导。Claude Code 的设计具有鲜明的导向性,借鉴其设计思路,有助于你形成自己的设计方案。

结语

再次强调,本文的核心要点是 “保持简单”。过于复杂的框架弊大于利。Claude Code 让我坚信,一个 “智能体” 即便设计简单,也能拥有强大的功能。我们已将诸多经验应用到 MinusX 中,并且还在持续整合更多内容。
若你有兴趣为自己的大语言模型智能体融入 Claude Code 的设计理念,欢迎与我交流 —— 可在 Twitter 上联系我!若你需要为 Metabase 打造可训练的、类似 Claude Code 的数据智能体,可了解 MinusX,或通过此处与我预约演示。祝你(像 Claude 一样)编程愉快!
要不要我帮你整理一份Claude Code 核心设计要点对照表?表格会清晰列出设计维度、具体做法和优势,方便你快速参考并应用到自己的智能体开发中。

附录

Main Cluade Code System Prompt

All Claude Code Tools

 

分类&标签