总结:LLMs (本质上) 是无状态的
LLMs 是无状态函数。 在推理时,它们的权重会被冻结,因此它们不会随着时间的推移而学习。 模型所知道的关于你的代码库的唯一信息是你输入其中的 tokens。
类似地,编码代理 Harness,如 Claude Code,通常需要你显式地管理代理的记忆。 CLAUDE.md (或 AGENTS.md) 是唯一默认情况下会进入你与代理进行的所有会话的文件。
这有三个重要含义:
- 编码代理在每个会话开始时对你的代码库一无所知。
- 你必须在每个会话开始时告诉代理任何与你的代码库相关的重要信息。
CLAUDE.md 是实现此目的的首选方式。
CLAUDE.md 用于将 Claude 引入你的代码库
由于 Claude 在每个会话开始时对你的代码库一无所知,因此你应该使用 CLAUDE.md 将 Claude 引入你的代码库。 从高层次上讲,它应该涵盖:
- WHAT (是什么): 告诉 Claude 关于技术、你的堆栈、项目结构的信息。 给 Claude 代码库的地图。 这在 monorepo 中尤其重要! 告诉 Claude 应用程序是什么,共享包是什么,以及一切的用途,以便它知道在哪里查找东西。
- WHY (为什么): 告诉 Claude 你的项目的 目的 以及存储库中每个部分的功能。 项目的不同部分的目的和功能是什么?
- HOW (如何): 告诉 Claude 它应该如何处理你的项目。 例如,你是否使用
bun 代替 node? 你需要包含它实际完成有意义的工作所需的所有信息。 Claude 如何验证 Claude 的更改? 它如何运行测试、类型检查和编译步骤?
但是,你这样做的方式很重要! 不要试图在 CLAUDE.md 文件中塞入 Claude 可能需要的每一个命令 - 你会得到次优的结果。
Claude 经常忽略 CLAUDE.md
无论你使用哪个模型,你可能会注意到 Claude 经常忽略 CLAUDE.md 文件的内容。
你可以通过在 claude code CLI 和 Anthropic API 之间放置一个日志代理来自行调查,使用 ANTHROPIC_BASE_URL。 Claude Code 会将以下系统提醒与你的 CLAUDE.md 文件一起注入到代理的用户消息中:
<system-reminder>
IMPORTANT: this context may or may not be relevant to your tasks.
You should not respond to this context unless it is highly relevant to your task.
</system-reminder>
因此,如果 Claude 认为它不与当前任务相关,它将忽略 CLAUDE.md 的内容。 你在文件中包含的信息越多,如果这些信息不是 普遍适用于 你正在使用的任务,Claude 忽略文件中指令的可能性就越大。
为什么 Anthropic 添加了这一点? 很难确定,但我们可以推测一下。 我们遇到的大多数 CLAUDE.md 文件都包含一些指令,这些指令 不 广泛适用于。 许多用户将此文件视为添加“热修复”的一种方式,通过附加许多不一定普遍适用的指令来修复他们不喜欢的一些行为。
我们只能假设 Claude Code 团队发现通过告诉 Claude 忽略坏指令,Harness 实际上产生了更好的结果。
创建一个好的 CLAUDE.md 文件
以下部分提供了关于如何编写一个好的 CLAUDE.md 文件,遵循 上下文工程最佳实践 的一些建议。
你的结果可能会有所不同。 并非所有这些规则都一定适用于每种设置。 就像任何其他事情一样,一旦你理解了何时以及为什么可以打破规则...
- 理解何时以及为什么可以打破规则
- 你有充分的理由这样做
Less (指令) is more
尝试将 Claude 可能需要的每一个命令、你的代码标准和风格指南塞入 CLAUDE.md 文件的诱惑很大。 我们不建议这样做。
虽然这个话题还没有被研究得非常透彻,但 一些研究 表明:
- **前