Claude Code系统提示词完全拆解:背后藏着40多个提示词

197 阅读14分钟

我这些天在 Evol 里面使用Claude Code ,然后看到朋友说,有个仓库火了,把Claude Code的系统提示词全给扒出来了。我看完之后挺震惊的——我们平时用Claude Code敲一行指令,背后其实是几十个提示词在协同工作。

大家可以去国内 Claude Code开发者平台 多了解这方面知识

今天就来彻底搞懂这套系统

Claude_Code提示词结构拆解_d62e22_副本.png

1️⃣ 先打破一个认知误区

大部分人理解的claude code cli工具是这样的:

[系统提示词] + [你的问题] = [AI回答]

但Claude Code根本不是这么玩的。它是动态组装的——根据你当前的状态、使用的工具、触发的模式,实时拼接出最终发给模型的提示词。更像是这样:

主系统提示词
+ 工具描述提示词(Bash、Write、Edit...)
+ 模式提示词(Plan模式、Explore模式...)
+ 子代理提示词(如果用到了subagent)
+ 系统提醒(Plan mode is active等)
= 最终发给模型的context

这就解释了为什么Claude Code有时候表现得特别"规矩",有时候又特别"激进"——因为不同场景下,它看到的"规则"是完全不同的。

2️⃣核心架构:四层提示词体系

我把这套系统拆成四层来讲。

第一层:主系统提示词(约3000 tokens)这是Claude Code的"宪法",定义了最基本的行为规范。

语气和风格:

- Only use emojis if the user explicitly requests it
- Your output will be displayed on a command line interface
- Your responses should be short and concise

翻译一下:不用emoji、回答简洁、用GitHub风格的markdown。这就是为什么Claude Code的输出风格和网页版Claude差别那么大。

专业客观性原则:

Prioritize technical accuracy and truthfulness over validating the user's beliefs. 
Focus on facts and problem-solving, providing direct, objective technical info 
without any unnecessary superlatives, praise, or emotional validation.

说白了就是:别拍马屁,说实话。这条规则直接决定了Claude Code不会说"您的想法太棒了"这种话。

任务执行原则:

- NEVER propose changes to code you haven't read
- Avoid over-engineering. Only make changes that are directly requested
- Don't add features, refactor code, or make "improvements" beyond what was asked

这三条太重要了。第一条防止Claude瞎改代码,第二条防止过度设计,第三条防止画蛇添足。

我见过不少人抱怨Claude Code"改了不该改的地方",根因就是没理解这套规则——Claude Code被设计成要先读代码再改代码,如果你跳过了读取步骤直接让它改,它就会变得不那么"规矩"。

第二层:工具描述提示词

每个工具都有自己的"使用说明书",这些说明书也是提示词的一部分。

Bash工具(约1000 tokens):这是最重的一个工具描述。

核心规则:

IMPORTANT: This tool is for terminal operations like git, npm, docker, etc. 
DO NOT use it for file operations (reading, writing, editing, searching) 
- use the specialized tools for this instead.

明确告诉Claude:Bash是用来跑终端命令的,不是用来读写文件的。

还有一条很有意思:

- Avoid using Bash with `find``grep``cat``head``tail``sed``awk`
- File search: Use ${SEARCH_TOOL_NAME} (NOT find or ls)
- Read files: Use ${READ_TOOL_NAME} (NOT cat/head/tail)

这就是为什么你让Claude Code"看一下这个文件",它不会用 cat 命令,而是用专门的ReadFile工具。

Write工具(约150 tokens):

- If this is an existing file, you MUST use the ReadFile tool first to read the file's contents. 
  This tool will fail if you did not read the file first.
- ALWAYS prefer editing existing files. NEVER write new files unless explicitly required.
- NEVER proactively create documentation files (*.md) or README files.

看到没?如果你让Claude Code写一个已存在的文件,它必须先读。如果你没让它读,工具会失败。这是硬性约束,不是建议。

Task工具(约1200 tokens):

这是启动子代理的工具,描述里明确列出了什么时候不该用:

When NOT to use the Task tool:
- If you want to read a specific file path, use ReadFile or Glob instead
- If you are searching for a specific class definition, use Glob instead
- If you are searching within 2-3 files, use ReadFile instead

就是说,简单任务不要启动子代理,直接用轻量工具解决。

第三层:子代理提示词Claude Code会根据任务类型启动不同的子代理,每个子代理有自己的系统提示词。

Explore Agent(约500 tokens):

You are a file search specialist for Claude Code.

=== CRITICAL: READ-ONLY MODE - NO FILE MODIFICATIONS ===
This is a READ-ONLY exploration task. You are STRICTLY PROHIBITED from:
- Creating new files
- Modifying existing files
- Deleting files

Explore Agent是只读的,专门用来搜索和分析代码,绝对不能修改任何东西。这是通过提示词硬性限制的。

Plan Agent(约600 tokens):

You are a software architect and planning specialist for Claude Code. 
Your role is to explore the codebase and design implementation plans.

REMEMBER: You can ONLY explore and plan. You CANNOT write, edit, or modify any files.

和Explore Agent一样是只读的,但角色定位不同——Plan Agent是架构师,负责设计方案而不是执行。

对话总结Agent(约1100 tokens):

这个Agent负责生成对话摘要,就是compact操作的核心。提示词要求它按8个维度总结:

1. Primary Request and Intent
2. Key Technical Concepts
3. Files and Code Sections
4. Errors and fixes
5. Problem Solving
6. All user messages
7. Pending Tasks
8. Current Work

为什么Claude Code在长对话后能保持上下文?就是靠这个Agent把关键信息压缩保留下来。

第四层:系统提醒(System Reminders)这是一类特殊的提示词,会在特定条件下动态注入。

Plan Mode激活提醒(约1200 tokens):

Plan mode is active. The user indicated that they do not want you to execute yet -- 
you MUST NOT make any edits, run any non-readonly tools, or make any changes to the system.

这就是Plan模式"只规划不执行"的实现原理。不是靠限制工具权限,而是在提示词层面告诉Claude"用户现在只想规划,不要执行"。

更有意思的是,Plan模式有完整的五步工作流:

Phase 1: Initial Understanding - 理解需求,启动Explore Agent搜索代码
Phase 2: Design - 启动Plan Agent设计方案
Phase 3: Review - 审查方案,确保和用户意图一致
Phase 4: Final Plan - 写最终方案到plan文件
Phase 5: Call ExitPlanMode - 告诉用户规划完成

整个流程分五步走,每一步该干什么都写清楚了。这就是为什么Plan模式的输出那么结构化。

3️⃣Skills的系统提示词单独说说

Claude到底是怎么知道该调用哪个Skill的?

这次正好看到系统提示词被扒出来了,里面有个 tool-description-skill.md (约400 tokens),专门控制Skills的调用逻辑。

Skills提示词原文

Execute a skill within the main conversation

<skills_instructions>
When users ask you to perform tasks, check if any of the available skills below 
can help complete the task more effectively.

When users ask you to run a "slash command" or reference "/<something>" 
(e.g., "/commit", "/review-pr"), they are referring to a skill.

Important:
- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action
- NEVER just announce or mention a skill without actually calling this tool
- This is a BLOCKING REQUIREMENT: invoke the Skill tool BEFORE generating any other response
- Only use skills listed in <available_skills> below
</skills_instructions>

<available_skills>
${FORMAT_SKILLS_AS_XML_FN(LIMITED_COMMANDS, AVAILABLE_SKILLs.length)}
</available_skills>

几个关键设计

动态注入的Skills列表

看到最后那个变量没?

${FORMAT_SKILLS_AS_XML_FN(LIMITED_COMMANDS, AVAILABLE_SKILLs.length)}

这不是静态文本,而是运行时动态生成的。你安装的每个Skill,它的元数据(name + description)会被格式化成XML注入到这里:

<available_skills>
  <skill name="commit" description="Create git commits with conventional commit messages"/>
  <skill name="review-pr" description="Review pull requests for code quality"/>
  <skill name="pdf" description="Generate PDF documents from markdown"/>
</available_skills>

这就解释了为什么你必须在SKILL.md里写好name和description——Claude就是靠这两个字段来匹配的。description写得不好,Claude就匹配不上。

阻塞式调用要求

这条规则特别狠:

- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action
- NEVER just announce or mention a skill without actually calling this tool
- This is a BLOCKING REQUIREMENT

翻译一下:如果Claude判断某个Skill相关,它必须立刻调用,不能先说"我来帮你用xxx Skill"然后再调用。

为什么这么设计?防止Claude"光说不练"。早期版本可能有这个问题——Claude会说"我会使用pdf skill来生成文档",但实际上忘了调用。现在直接在提示词层面堵死这条路。

斜杠命令的映射

When users ask you to run a "slash command" or reference "/<something>", 
they are referring to a skill.

v2.0.73版本把"slash commands"术语改成了"skills",但用法不变。你输入 /commit ,Claude会识别为调用名为"commit"的Skill。

Skills调用的完整流程

1. Claude Code启动
   ↓
2. 扫描 ~/.claude/skills 目录,读取所有SKILL.md的元数据
   ↓
3. 把元数据格式化成XML,注入到系统提示词的<available_skills>里
   ↓
4. 用户发送请求
   ↓
5. Claude检查请求是否匹配某个Skill的description
   ↓
6. 如果匹配,立刻调用Skill工具(BLOCKING REQUIREMENT)
   ↓
7. 读取完整的SKILL.md内容,加载到上下文
   ↓
8. 按照SKILL.md里的指令执行任务

为什么你的Skill有时候不被调用

理解了这套机制,就能解释一些常见问题:

description写得太模糊

# 不好的写法
description:Ausefulskillfordocuments

# 好的写法  
description:GeneratePDFdocumentsfrommarkdownfileswithcustomheadersandfooters

Claude是靠description来匹配的。写得太模糊,匹配不上。

Skill名字和内置命令冲突

如果你创建了一个叫"help"的Skill,它不会被调用,因为提示词明确说了不能用Skill工具处理内置命令(/help、/clear这些)。

同时安装了太多Skill

每个Skill的元数据大约100 tokens,如果你装了50个Skill,光元数据就要5000 tokens。这会挤占上下文空间,也会让匹配变得困难。

懒加载的关联Skills的三层懒加载机制:

元数据层 :启动时只加载name和description

指令层 :匹配上后才加载完整SKILL.md

资源层 :执行时按需加载scripts和references

现在你知道为什么是这样设计的了——因为系统提示词里的 只包含元数据,不包含完整内容。只有当Claude决定调用某个Skill时,才会读取完整的SKILL.md文件。

这种设计既保证了匹配效率,又控制了token消耗。

4️⃣提示词之间是怎么衔接的

理解了四层体系后,来看看它们是怎么组合工作的。

场景1:修复一个bug

你输入: 帮我修复src/utils/parser.ts里的类型错误

此时Claude Code的context window大概是这样的:

[主系统提示词]
- 包含:不要改没读过的代码、避免过度设计等规则

[工具描述]
- ReadFile工具:怎么读文件
- Edit工具:怎么编辑文件
- Bash工具:怎么跑测试

[你的消息]
- 帮我修复src/utils/parser.ts里的类型错误

根据主系统提示词的规则,Claude Code会先调用ReadFile读取文件内容,然后分析问题,最后用Edit工具修复。

场景2:进入规划模式

当你输入 /plan 重构整个认证模块 时:

[主系统提示词]

[工具描述]

[Plan Mode系统提醒]
- 你现在不能执行任何修改操作
- 按照五步工作流进行规划
- 可以启动Explore Agent搜索代码
- 最后要调用ExitPlanMode

[你的消息]
- /plan 重构整个认证模块

Claude Code看到了Plan Mode的提醒,就知道自己只能规划不能执行。它会启动Explore Agent去搜索相关代码,然后设计方案。

场景3:启动Explore Agent

当Claude Code决定要探索代码库时,它会用Task工具启动一个Explore Agent。这个子代理看到的context是:

[Explore Agent专属提示词]
- 你是文件搜索专家
- 只能读取,不能修改
- 使用Glob、Grep、ReadFile工具

[工具描述]
- 只包含只读工具的描述

[父代理传递的任务]
- 探索认证模块的代码结构

注意,Explore Agent的context里没有Edit、Write这些工具的描述——因为它根本没有这些工具的权限。权限隔离是通过提示词组装实现的。

场景4:对话太长需要压缩

当对话达到一定长度,Claude Code会启动总结Agent:

[总结Agent专属提示词]
- 按照8个维度进行总结
- 保留所有用户消息
- 特别关注错误和修复

[之前的完整对话历史]

总结Agent生成的摘要会替换掉之前的对话历史,但关键信息都保留下来了。这就是Claude Code能处理长任务的秘密。

5️⃣一些有意思的设计细节

读完这些提示词,发现几个有意思的地方:

变量替换系统

提示词不是静态的,里面有大量变量:

${BASH_TOOL_NAME}
${READ_TOOL_NAME}  
${EDIT_TOOL_NAME}
${TASK_TOOL_NAME}

这些变量在运行时会被替换成实际的工具名。这样做的好处是,如果Anthropic改了某个工具的名字,只需要改变量定义,不用改所有提示词。这就是我们写代码的时候,强调使用变量的意义所在。

条件渲染

很多提示词有条件判断:

${AVAILABLE_TOOLS_SET.has(TODO_TOOL_OBJECT.name)?`
# Task Management
You have access to the TodoWrite tools...
`:""}

如果某个工具可用,就渲染对应的说明;如果不可用,就跳过。这就是为什么不同配置下Claude Code的行为会不一样。

Token预算管理

从仓库的README可以看到每个提示词的token消耗:

提示词Token数
主系统提示词约2981
Bash工具描述约1074
Task工具描述约1214
TodoWrite工具描述约2167
Plan Mode提醒约1211

这些加起来轻松就超过10000 tokens了,还没算你自己的代码和对话历史。所以Claude Code在context管理上下了很大功夫。

Git提交的详细规则

Bash工具的描述里有一大段关于Git提交的规则(约1600 tokens),包括什么时候可以amend、pre-commit hook失败怎么处理、已经push的commit能不能改。

这解释了为什么Claude Code处理Git操作时那么谨慎。

6️⃣对我们使用Claude Code有什么启发

理解了这套系统后,总结几点:

先读后改

Claude Code被设计成必须先读文件再修改。如果你直接说"改一下这个函数",效果不如"先看一下这个函数,然后改一下"。虽然Claude Code会自动先读,但你显式地让它读,能让它更好地理解上下文。

善用Plan模式

Plan模式不只是"帮你写个计划",而是启动了一个完整的分析-设计工作流。对于复杂任务,用 /plan 进入规划模式,让Claude Code先想清楚再动手,效果会好很多。

理解子代理的边界

Explore Agent和Plan Agent都是只读的,它们只负责收集信息和设计方案。真正执行修改的是主会话。

长任务要注意compact

Claude Code会自动压缩对话历史,但压缩过程中可能丢失一些细节。对于特别长的任务,可以在关键节点手动让Claude Code总结一下当前状态。

写好Skill的description

Claude是靠description来匹配Skill的,关键词密度很重要。写得太模糊就匹配不上。

7️⃣附录:提示词分类速查表

系统提示词

名称Token数用途
Main system prompt2981核心行为定义
Learning mode1042学习模式规则
MCP CLI1335MCP工具使用
Chrome browser automation758浏览器自动化

子代理提示词

名称Token数用途
Explore516代码探索
Plan mode enhanced633方案设计
Conversation summarization1121对话压缩
Security review2610安全审查

工具描述

名称Token数用途
Bash1074终端命令
Task1214子代理启动
Skill399Skills调用
TodoWrite2167任务管理
EnterPlanMode970进入规划模式
ReadFile439文件读取
Edit278文件编辑
Write159文件写入

系统提醒

名称Token数触发条件
Plan mode is active1211进入Plan模式
Plan mode for subagents310子代理在Plan模式下
Plan mode re-entry236重新进入Plan模式

8️⃣总结

我最近一直在 Evo l里面使用 Claude Code,相对稳定,免配置

Evol官网:www.evolai.cn/ 有兴趣的可以去看看

Claude Code的提示词系统比想象的复杂得多。它不是一个单一的长提示词,而是几十个模块化的提示词组合在一起。这种设计带来了几个好处:

灵活性 :可以根据场景动态组装

可维护性 :改一个模块不影响其他模块

权限隔离 :子代理只能看到自己该看的提示词

Token效率 :不需要的提示词不会被加载

有兴趣的同学可以去GitHub看看原始的提示词文件: github.com/Piebald-AI/…

Cluade Code 开发者平台