你打开编辑器,开启一次会话。在你输入任何内容之前,甚至在光标还没在输入框里稳住之前,智能体就已经读了相当多的东西。它吸收了自己的系统提示词、它能调用的每一个工具的定义、它的行为指令、你项目里的 CLAUDE.md(或 .cursorrules,或 AGENTS.md)、所有适用的按路径生效的规则,以及它记忆文件里的一切。等到你说出第一个词时,智能体早已建立起关于你、关于你的项目、以及关于它该如何表现的模型。
天真的心智模型是:你输入,代理回应。真实的顺序是:代理先读你的上下文,然后你输入,然后代理回应。那个无声的第一步,代理在你开口之前先读了你,恰恰决定了结果中出人意料的一大部分。而关于你喂给它的上下文究竟有没有帮助,证据比我们大多数人以为的更让人不安。
简短版本
- AI 编程代理会在你发出第一条消息之前就加载预先写好的上下文:系统提示词、工具定义,以及 CLAUDE.md、Cursor 规则、GitHub Copilot 指令,或在受支持或被导入时的 AGENTS.md 等特定工具的指令文件。发起对话的不是你,而是代理的这次阅读。
- 在你敲下第一个字符之前,这些预加载就已经吃掉了可用上下文窗口的很大一部分,所以你实际可用的工作额度比模型宣称的窗口要小。
- 实证结论才是反直觉的部分:开发者亲手写的上下文文件确实有一点帮助(任务成功率约 +4%),但代价实在(推理成本约 +19%);而由 LLM 生成或复制粘贴来的上下文文件,反而可能让结果稍微 更差.
- 自托管模型改变了你能做的事 参见,而不是你必须 do。会话前架构在任何地方都相同;本地工具只是让您能够检查和审计它。编写您真正理解的上下文这一规范不会消失。
朴素模型是错的:智能体先读取
想象一个 Claude Code 会话开始的那一刻。系统提示词被送进去。工具定义被送进去。然后,在你还没说任何话之前,你的 CLAUDE.md 就被投递进去了,而这里的机制细节很重要。Anthropic 自己的文档明确指出, CLAUDE.md 的内容“在系统提示之后作为用户消息传递,” 在“每次对话开始时”加载。因此,对话记录中用户的第一个回合不是你。那是你的文件,代你说话,在你到来之前就设定好了条件。
在开场的那一刻真正被加载的是一整套堆栈:系统提示词、工具定义、行为指令、你的项目级与用户级上下文文件、与当前涉及文件相匹配的按路径生效的规则,以及一个由智能体自己维护的记忆文件。在 Claude Code 中,上下文文件通过四级层次结构解析(受管策略,然后是用户级(~/.claude/CLAUDE.md),然后是项目级(./CLAUDE.md),然后是本地级(./CLAUDE.local.md)),并按这个顺序拼接。自动记忆还会加上自己的一份:智能体自行写入并读取的 MEMORY.md 的前 200 行(或 25KB),每次会话都会加载。
这些都不是免费的。基础设施开销(系统提示词、工具定义、行为指令)在你的第一条消息落地之前,就已经吃掉了有效上下文窗口中相当大的一块。这是你为“让代理知道怎么当一个代理”所缴的税,而且除非你专门去查,否则根本看不见。
围绕管理这一切的学科,一个名称正在形成。Anthropic 的应用 AI 团队将其称为 上下文工程:“在 LLM 推理过程中,用于筛选并维持最优 token(信息)集合的一整套策略。”这个说法很有用,因为它把你写的那个文件,从写给机器人的便条,重新定位成一项关于谁来占用稀缺而昂贵资源的架构决策。
四个代理,四种优先读取你的方式
各个智能体读取您的方式并不相同。它们沿着两个值得命名的轴线分布: 什么 在会话开始时加载(精选的文件层级,而不是始终开启的规则,也不是全仓库扫描),以及 你能检查多少,也就是这套机制究竟是一份确定、可审计的产物,还是一个只能凭信任接受的语义索引。Claude Code、Cursor、GitHub Copilot 和 Aider 真正的分歧就在这两条轴上。
| 工具 | 会话开始时加载的内容 | 机制 | 可审计性 |
|---|---|---|---|
| Claude Code | CLAUDE.md hierarchy + .claude/rules/ + 自动记忆;AGENTS.md 仅在导入或符号链接时生效 | 基于文件的层级结构;路径范围规则可以延迟加载;压缩和重读行为各有不同 | 对你的文件和内存来说高;系统提示词仍为专有 |
| Cursor | 项目、团队和用户规则;AGENTS.md 支持;代码库索引用于语义上下文 | 可读规则文件加语义代码库索引 | 混合:规则可读,但索引检索透明度较低 |
| GitHub Copilot | 整个代码库 copilot-instructions.md 加上路径特定的 .instructions.md 在支持的地方 | 应用于 Copilot 工作流的自定义指令文件 | 中等:文件可读,但范围取决于产品界面 |
| Aider | 从 git 仓库派生的紧凑 repo-map,加上手动添加/读取的文件 | 基于符号/图的仓库映射,针对令牌预算进行优化 | 高:repo-map 可以检查,但它仍然是一张经过筛选的地图,而非完整的仓库原文 |
Cursor 的分割方式最具启发性。其规则存放在您可控的可读文件中,但它同时还会构建一个 整个代码库的语义索引,驱动 @codebase 搜索但无法真正检查的向量嵌入。Aider 位于另一端:读取您的整个 git 仓库并构建 repo-map,以确定性的方式完成,全程不涉及任何嵌入向量。你可以精确审计它到底喂给了模型什么。同样的架构倒置,可见度却完全不同。想要逐个工具的深入比较,我们在 代理式编码 CLI 大比拼 并在此正面交锋 OpenCode 对比 Claude Code 其他地方。
在各家工具各自的格式之下,一个跨工具的标准正在成形。AGENTS.md 从智能体工具生态中诞生(OpenAI Codex、Amp、Google 的 Jules、Cursor 和 Factory),如今由 由 Agentic AI Foundation 在 Linux Foundation 旗下管理,已在超过 60,000 个代码仓库中被采用。这意味着会话前上下文文件从单个工具的便利功能,升格为一等的、可移植的产物:整个行业都认可“在你开口之前智能体读到的东西”值得拥有自己的标准。
证据对这些是否有帮助的说法
这里是那个令人安心的故事开始破裂的地方。ETH Zurich 的一个团队(Gloaguen、Mündler、Müller、Raychev 和 Vechev)进行了一项受控评估, 《AGENTS.md 评估》 这些仓库级上下文文件是否真的能提升编码代理的表现。在他们研究的各个代理和模型中,结论既不是“上下文文件有用”,也不是“上下文文件没用”。当前的摘要写道,上下文文件通常不会提高任务成功率,平均还会让推理成本上升超过 20%。在论文的详细结果里,开发者自己写的文件是个例外:它们平均把表现提升了约 4%,但成本最多增加了 19%。由 LLM 生成的文件则走向了相反的方向,平均让表现下降约 3%,同时把成本推高超过 20%。第三项发现让结论更锋利:当某个工具在上下文文件中被点名时,代理调用它的频率会高出 1.6~2.5 倍,而这究竟是帮忙还是添乱,完全取决于那些额外的调用是否有必要。
请在“由 LLM 生成的文件”这一条上多停留一秒,因为它才是承重的那一条。你没有亲手写的文件,无论是模型生成的,还是从社区整理的“最佳 CLAUDE.md 配置”包里下载后丢进仓库的,在代理读来都像是出自一个并不真正了解你代码库的人之手的指令。在该研究测试的模型上,这是净负面的:你花了更多 token,换来的结果却略差一些。 Augment Code 评测 对此的总结很到位:它把这种累积的结果称为“你的智能体上下文就是一个杂物抽屉”。你铲进去的每一条看似合理的指令都有代价,而那些不是你写的、面向它并不理解的代码库的指令,往往代价大于回报。
我不把这读成“上下文文件是坏东西”,也不读成“上下文文件是好东西”。恰恰是这种非黑即白的框架,一碰到数据就散架了。更收敛的读法是:上下文是你刻意设计的基础设施,而一份不是你写的、面向它并不理解的代码库的文件,是成本而不是礼物。适用范围的限定同样重要。这是那篇论文在它测试的模型和代理上得到的结果,不是适用于每一个 LLM 的普遍定律。但它明确地指向一个方向,而且厂商这边也有佐证:Anthropic 自己的应用 AI 团队就提到,业界正在转向在运行时通过工具“按需”加载上下文,而不是一开始就把所有内容预先塞进去,并描述了一种混合方式:先取一部分数据,其余的在运行时再去探索。当发布 CLAUDE.md 的这家公司自己都倾向于少预加载时,那种复制粘贴一个巨大上下文文件的本能,就值得重新掂量一下。
本节要点: 作者是谁,才是预测上下文是否划算的信号。无论哪种情况,token 成本都是一样的;真正改变回报的,是这些说明是否出自真正了解这套代码的人。
逐渐消失的上下文:为什么会话开始不是全部
预加载设定了约束,却不会维持这个约束。开发者反复撞上的是故事的后半段:你在会话开始时精心安排好的上下文,会随着会话推进而不断流失,而且是悄无声息地流失。
一个有用的理解方式来自 Mem0 团队的表述,即 上下文窗口是 RAM,而非存储,短暂而有边界,并不是你的指令长住的地方。在开头加载进去,它就在那里;持续够久却一直不去调用它,它就会淡去,就像一个你不再引用的变量最终被覆盖。这正是研究者称之为「指令衰减」的现象背后的机制。 2026 年 Gamage 及同事的研究 发现「不要做某事」这类约束尤其脆弱:在一个测试设定中,遵从率从第 5 轮的 73% 跌到第 16 轮的约 33%。这是实验室结论,不是普适常数,但它与很多人在长会话中的体感相符。
会话边界就是一切变得更清晰的地方。 Hacker News 讨论中的开发者 报告说,派生出的子代理可能遇到上下文交接问题,因此在任务中途移交的工作,携带的父会话上下文可能比你以为的要少。而空闲时间本身也有代价:在一个讨论帖中, Anthropic 的 Boris Cherny 发表了看法,那场讨论谈到了闲置的会话如何在毫无提示的情况下触发一次大规模的缓存未命中重建,动辄几十万 token。社区反复反映的共同线索就是「安静」:压缩跑了,先前的推理被裁掉,质量下滑,而屏幕上没有任何东西告诉你这件事发生过。你只是察觉到输出变差了。
自托管能给你更多控制权吗?
自己把整套跑起来(Ollama 加 Open WebUI,或者像 Aider、Continue.dev 这样指向本地模型的智能体),那么“我现在是不是获得了更多控制权?”这个问题的诚实答案是:你得到的更多的是 可见性,而非更多固有控制。这一区别才是关键所在。
自托管真正给你的,是可查验性。没有任何对话数据离开你的基础设施。你可以读到完整的系统提示词,而不必对一个闭源提示词照单全收。配合 Aider 这类确定性工具,你能精确审计每一次模型调用里到底放进了什么:repo-map 是可读的产物,而不是像 Cursor 的嵌入索引那样的语义黑箱。对于在意可审计性与可复现性、在意能否回答“智能体究竟看到了什么?”的人来说,这份可查验性是实实在在的,而且分量不轻。
但这种架构上的倒置并不在乎模型跑在哪里。无论你用的是通过 Ollama 运行的本地模型、连着云端 API 的 Claude Code,还是订阅制的 Cursor,代理依然会在你开口之前先读完它的会话前上下文,你依然得刻意设计那份上下文。这份纪律完全一样。自托管给你的是一扇更清楚地看见机制的窗户,而不是另一套机制,更不会免除你 ETH Zurich 那条教训:加载不是自己写的上下文会发生什么。所以从这一切中值得带走的唯一转变是:别再把上下文文件当成送给代理的礼物,把它当成有持续开销的基础设施。写下你对代码库真正理解的东西,宁少勿多,并且记住代理先读了你,所以它读到的那个版本的你,应该是你愿意为之背书的版本。
常见问题
AI 编程智能体在你输入任何内容之前会读取你的文件吗?
是的。会话开始时,AI 编码代理会加载它的系统提示词、工具定义以及你的上下文文件(CLAUDE.md、.cursorrules 或 AGENTS.md),还有 repo-map 或记忆文件,这一切都发生在你发出第一条消息之前。具体到 Claude Code,CLAUDE.md 会在系统提示词之后立刻以用户消息的形式送入,因此这场对话实际上是从你的文件开始的,而不是从你开始的。
像 CLAUDE.md 这样的上下文文件真的能提升智能体性能吗?
部分是的,而且比大多数人以为的要少。在 ETH Zurich 对 AGENTS.md 风格文件的评估,当前的摘要指出,上下文文件通常并不能提高任务成功率,还会让推理成本平均上升超过 20%。详细结果对实践者更有价值:开发者自己提供的文件平均把性能提升了约 4%,但成本最多上升 19%;而由 LLM 生成的文件平均把性能拉低了约 3%,成本却上升超过 20%。实用的解读是:你自己写过并且真正理解的文件可能会有一点帮助;不是你写的文件则可能在无声中让你付出代价。
在我发送消息之前,有多少上下文窗口被使用了?
占比相当可观。系统提示词、工具定义和行为指令都在任何用户输入之前加载,加在一起会吃掉有效上下文窗口中不小的一块。由于这项固定的启动开销,你真正可用的工作预算要小于模型宣称的上下文窗口。
自托管 AI 模型是否能让你对上下文拥有更多控制权?
是更多的可见性,而不是更多的固有控制权。自托管让你能查看完整的系统提示词,把对话数据留在自己的基础设施里,并且(配合 Aider 这类确定性工具)让你精确审计每一次调用里到底送进了什么。但会话开始前的上下文架构和云端工具完全一样,你仍然必须有意识地去设计自己的上下文。
什么是 AGENTS.md?
AGENTS.md 是一种开放格式,用来告诉编码智能体如何处理一个代码库,相当于面向智能体的 README。它在智能体工具生态中逐步成形(OpenAI Codex、Amp、Google 的 Jules、Cursor 和 Factory),现由 Linux Foundation 旗下的 Agentic AI Foundation 维护,已在超过 60,000 个代码仓库中被采用,正在成为会话前智能体上下文的跨工具标准。