跳转到主要内容

给 Claude 提供上下文:CLAUDE.md 和更好的提示

Claude Code 开箱即用效果很好,但一旦它了解你的项目约定并且你养成一些提示习惯,它会变得明显更有效。本指南涵盖两者。


第 1 部分 — CLAUDE.md:你的项目记忆

它是什么

CLAUDE.md 是一个纯 markdown 文件,Claude 在该目录中的每个会话开始时自动读取。把它想象成你会给一位能干的新队友在他们第一个早上所做的简报:团队如何做事、要避免什么,以及重要的部分在哪里。

你不需要在提示中引用它或手动附加它。如果文件存在,Claude 已经读过了。

它在哪里

Claude 在几个地方查找并合并发现的内容,从广泛到具体:

位置

范围

适合用于

~/.claude/CLAUDE.md

你机器上的每个项目

个人偏好(例如,“我使用 pnpm,不是 npm” 或 “总是建议测试”)。

<repo-root>/CLAUDE.md

这个项目

架构、约定和命令。这是主要的。

<subdir>/CLAUDE.md

该子目录(当 Claude 读取该目录中的文件时按需加载,不在会话开始时)

模块特定的规则(例如,frontend/ 与 api/ 中的不同约定)。

大多数团队只需要项目根文件。将其提交到 git,以便整个团队受益。

它是如何加载的(以及成本是多少)

工作目录及其上方的文件在会话开始时读取,并在系统提示之后立即作为用户消息传递给 Claude(不嵌入系统提示本身)。子目录 CLAUDE.md 文件稍后按需加载,当 Claude 读取该子目录中的文件时。没有摘要或截断,也不会在每个回合重新从磁盘读取。如果你在会话中编辑文件,下次运行 /compact 或通过 /memory 打开它时会获取更改;否则它在你的下一个会话生效。

对于 Claude for Enterprise 客户,成本情况比“每个请求都加载”可能暗示的要好。Claude Code 对 CLAUDE.md 应用 Anthropic 的提示缓存。会话中的第一个请求支付文件的完整输入令牌价格;大约五分钟内的后续请求命中缓存,按低得多的缓存读取率计费。缓存是内容寻址的,所以对 CLAUDE.md 的任何更改都会使其失效,下一个请求再次支付全价。

实际上,这意味着一个相当大的 CLAUDE.md 每个会话支付一次完整令牌,加上缓存过期后任何足够长的空闲间隙后支付一次,而不是每条消息一次。保持文件精简以获得上下文窗口空间和信噪比仍然值得,但你不需要仅为了控制每条消息的支出而限制行数。在 Enterprise 使用仪表板中,文件的占用空间几乎完全显示为缓存读取令牌,而不是标准输入令牌。

入门:运行 /init

在任何项目中,输入 /init。Claude 将探索代码库并为你起草一个 CLAUDE.md,涵盖构建命令、测试命令、结构概览和它检测到的任何约定。审查草稿,删除任何不准确的内容,并提交。这需要大约五分钟,但永久回报。

实际上应该包含什么

目标是一个简短且信号密集的文件 — 大约 200 行以下。每一行都加载到每个请求的上下文中,所以每一行都应该值得其成本。

值得包含:

  • 命令 — 如何在本地构建、测试、lint 和运行。Claude 将执行这些,所以准确性很重要。

  • 约定 — 命名、错误处理、文件布局和“我们使用 X,不是 Y”的决定。

  • 三句话的架构 — 主要部分是什么以及它们如何通信。

  • 硬约束 — 例如,“永远不要从测试写入生产数据库,”“所有 API 路由都需要身份验证中间件,”或“不要编辑 generated/。”

  • 已知陷阱 — 每个新工程师都会遇到的问题。

不值得包含:

  • 完整的 API 文档(Claude 可以直接读取代码)。

  • 更改日志或历史记录。

  • 从文件树中已经显而易见的任何内容。

  • 团队实际上不遵循的理想规则。

多久更新一次

把它当作一个活的入职文档,而不是规范。

  • 在 /init 之后 — 审查一次以清理生成的草稿。

  • 当 Claude 两次出错时 — 这是一个规则缺失的信号。添加一行来解决它。

  • 当约定改变时 — 例如,新框架、测试运行器或一组 lint 规则。

  • 季度浏览 — 删除任何过时的内容,因为过时的说明比没有更糟。

你也可以在会话中添加:打开 /memory 直接编辑文件,或只是要求 Claude “记住”一条规则,它会为你将其附加到正确的 CLAUDE.md。


第 2 部分 — 在 Claude Code 中值得养成的提示习惯

这些不是通用的提示工程技巧;它们是当 Claude 读取和编辑真实代码库时最重要的习惯。

1. 陈述结果,而不是步骤

Claude 可以自己探索代码库。告诉它你想要什么和为什么,让它自己找出在哪里。

❌ “打开 userService.ts,找到 validate 函数,在第 42 行添加空检查。”

✅ “没有电子邮件的用户在验证步骤中崩溃。让它优雅地处理并添加测试。”

2. 逐字给出错误

粘贴完整的堆栈跟踪,而不是总结它。确切的文件名、行号和消息是允许 Claude 快速找到正确位置的原因。

3. 用计划模式先确定大任务的范围

对于涉及多个文件的任何内容,按 Shift+Tab 两次以循环进入计划模式(第一次按进入 acceptEdits)并询问:

“计划你如何向公共 API 添加速率限制。暂时不要改变任何东西。”

审查计划,在对话中调整它,然后切换模式并说“执行第 1 步。”这会在误解变成十二文件差异之前捕获它。

4. 当你已经知道文件时指向它们

Claude 可以自己搜索代码库,但如果你已经知道相关文件,就说出来 — 它更快且使用更少的令牌。使用 @ 引用路径,例如 @src/auth/login.ts。

5. 说出“完成”是什么样子

例子包括“测试通过,”“与其他处理程序的风格匹配,”或“没有新的依赖项。”预先陈述验收标准比多轮修订更有效率。

6. 每个对话一个任务;在它们之间 /clear

长会话会积累噪音。当你从“修复登录错误”切换到“重构计费模块”时,运行 /clear 并重新开始。你的 CLAUDE.md 携带持久上下文,所以聊天历史不需要。

7. 像同事一样纠正它,而不是搜索引擎

如果第一个答案不对,你不需要重新表述整个请求。只需说出什么是错误的 — 例如,“这改变了公共 API;保持签名相同。”Claude 将保留其他所有内容并仅调整该点。


快速参考

想要…

这样做

生成起始 CLAUDE.md

/init

查看 Claude 使用的内存

/memory

在会话中添加规则

打开 /memory,或要求 Claude “记住”该规则

重新开始但保留项目内存

/clear

在提示中引用特定文件

@path/to/file

这是否解答了您的问题?