MemoryLake
返回全部文章
Tutorial2026 年 9 月 3 日·10 分钟阅读

如何将 Amp 的指令范围限制在适用的文件内(2026 指南)

大多数编程智能体对指令文件只提供两种设置:开启,或者开启。它在每个会话中都会加载,无论你是在编辑 React 组件还是数据库迁移,消耗的 token 都是一样的,而降低成本的唯一方法就是删除你可能需要的东西。

Amp 提供了第三种选择,但几乎没人使用。你从 AGENTS.md 引用的文件可以在其 frontmatter 中携带一个 globs 字段,然后只有在智能体实际读取了匹配该模式的文件后,它才会加载。你的 TypeScript 规范只有在处理 TypeScript 时才会引入。你的迁移规则在有人接触迁移之前都会保持静默。

该机制已被记录在文档中,只需几行 YAML,它改变了指令文件的用途。本指南将介绍 Amp 如何决定包含哪些内容、如何设置条件引导,以及边界在哪里。

首先明确一个我们自己的边界。这并不是智能体忽略你编写的指令的普遍问题——这在每个工具中都有原因,并在为什么智能体忽略你的指令文件中有所涵盖。这里是相反的情况:Amp 能够可靠地读取你的文件,问题在于如何阻止它一直读取所有文件。

为什么 Amp 加载的内容超出了你的要求

三条包含规则,其中两条是无条件的

Amp 的发现机制非常精确,一旦你阅读了它,就很容易理解:

"当前工作目录(或编辑器工作区根目录)以及父目录(最高到 $HOME)中的 AGENTS.md 文件总是会被包含。"
"当智能体读取子树中的文件时,子树中的 AGENTS.md 文件会被包含。"
"系统级引导文件,以及 $HOME/.config/amp/AGENTS.md$HOME/.config/AGENTS.md(如果存在),总是会被包含。"

因此,三条规则中有两条是无条件的。只有子树规则是有条件的,并且它是在智能体读取该子树中的文件时触发,而不是根据你配置的任何内容触发。

这意味着添加引导的默认方式——将其放在根目录的 AGENTS.md 中——也是最昂贵的方式。它在仓库中的每个任务中都会常驻。

个人和系统文件叠加在最上层

位置表列出了 Amp 寻找的几个地方:仓库文件,用于 "个人偏好、设备特定命令以及你在提交前在本地测试的引导" 的 $HOME/.config/amp/AGENTS.md$HOME/.config/AGENTS.md,以及用于 "所有 Amp 会话的系统级或组织管理的引导" 的 /etc/ampcode/AGENTS.md/Library/Application Support/ampcode/AGENTS.md%ProgramData%\ampcode\AGENTS.md

所有这些文件只要存在就总是会被包含。在某人设置了组织管理文件、你拥有个人文件且仓库拥有根文件的机器上,在智能体查看任何代码之前,就已经有三个文件常驻了。

一个可能会让你感到意外的备用方案

"如果目录中不存在 AGENTS.md,但存在名为 AGENT.md(没有 S)或 CLAUDE.md 的文件,则该文件将被包含。"

这很有用——这意味着为其他工具设置的仓库无需任何修改即可在 Amp 中工作。但这也意味着你遗忘的陈旧 CLAUDE.md 也是生效的引导,而你以为已经删除了指令的目录可能仍然保留着一些指令。在寻找为什么旧规范不断出现的原因之前,这很值得了解。

Amp 本身推荐进行拆分

文档并没有将一个庞大的根文件视为预期的设计:

"在具有多个子项目的大型仓库中,我们建议保持顶层 AGENTS.md 的通用性,并在每个子项目的子树中创建更具体的 AGENTS.md 文件。"

这是答案的前半部分。globs 机制是后半部分,它处理了子树无法处理的情况:适用于文件类型而非目录的引导。

人们尝试过的方法

将所有内容放入根目录的 AGENTS.md 这是默认做法,在文件增长到智能体无法可靠遵循所有内容之前一直有效。在每个任务中,每个规范都会与其他规范争夺注意力。

删除引导以节省上下文。 有效但有损。你删除的规则之所以存在,是因为曾经有人犯过错。

为所有内容创建子树文件。 当引导是目录结构时,这确实很好,这也是 Amp 推荐它的原因。但它对 "绝不使用 any 类型" 毫无作用,因为该规则适用于所有地方的 TypeScript 文件。

用纯文本编写条件并寄予希望。 在常驻文件中添加 "在处理 API 端点时,请遵循以下规则"。文本成本仍然相同,而且现在你依赖模型去应用一个你本可以用模式(pattern)表达的过滤器。

在没有 frontmatter 的情况下使用 @ 提及文件。 成功了一半。Amp 支持通过 @ 提及来引入其他文件,文档对默认行为的说明很明确:"如果没有指定 globs,则在被 @ 提及进时,该文件总是会被包含。" 因此,仅靠提及只会重新组织你的文件,而不会减少加载的内容。

用一个长对话线程处理所有事情。 相关的问题,相同的症状。Amp 自己的建议是:"每个任务使用一个线程。线程可以持续很长时间,但混合了无关工作的线程会给智能体提供更差的推理上下文。" 当线程确实变长时,文档中记录的做法是交接——"要求智能体‘Handoff and …’(交接并……),它就会启动一个带有关键上下文的新线程。"

解决方案:从 AGENTS.md 引用文件,然后使用 Glob 进行限制

步骤 1:按触发条件拆分根文件

阅读你的根 AGENTS.md,并将每个块分类到三个堆中。

通用。 构建和测试命令、仓库布局、评审和发布步骤,这些在任何地方都适用的规范。这保留在根文件中。Amp 的位置表准确地描述了根目录的这些内容:"架构、构建/测试命令、内部 API 概述、评审和发布步骤。"

目录结构。 仅在某个子项目内部起作用的引导。这会成为该子树中的 AGENTS.md,当智能体读取那里的文件时,Amp 会将其包含进来。

文件类型结构。 语言规范、测试模式、框架规则。这就是 glob 的用途,在成熟的仓库中,这通常是最大的一堆。

步骤 2:关联受 glob 限制的文件

三个步骤,完全按照文档的布局进行。

首先,在你的 AGENTS.md 中放入一个提及。它可以放在文件中的任何位置:See @docs/*.md。提及本身支持 Glob 模式,因此一行代码就可以引入整个规范文件目录。

其次,在 YAML frontmatter 中使用 globs 列表创建每个被引用的文件。文档中的示例创建了 docs/typescript-conventions.md,以一个列出 globs'**/*.ts''**/*.tsx' 的 frontmatter 块开头,紧接着是规范本身——示例规则为 "绝不使用 any 类型"。

第三,针对每种语言或关注点重复此操作。文档给出了三种可供复制的结构:前端引导 globs: ["src/components/**", "**/*.tsx"],后端引导 globs: ["server/**", "api/**"],以及测试引导 globs: ["*.test.ts", "__tests__/*"]

你获得的行为被清晰地阐述:"只有在 Amp 读取了匹配任何 glob 的文件时,带有 globs 的被提及文件才会被包含。" 注意触发条件——是 Amp 读取了匹配的文件,而不是你打开了文件。

有两个细节可以避免让你困惑一下午。提及的路径解析是相对于提及文件的,而不是你的工作目录:"相对路径是相对于包含该提及的智能体文件进行解析的。" 绝对路径和 @~/some/path 也适用。此外,glob 解析有其自身的规则:"除非以 .././ 开头,否则 glob 会隐式地加上 **/ 前缀,在这种情况下,它们指的是相对于被提及文件的路径。" 因此,*.test.ts 匹配任何地方的测试文件,而 ./fixtures/*.json 表示在声明它的文件旁边。

还有一个细节,如果你在纯文本中记录路径,这很重要:"代码块中的 @ 提及会被忽略,以避免误报。" 你可以在反引号内编写路径,而不会导入它。

步骤 3:验证加载的内容,然后将事实移出

Amp 提供了一种直接检查工作的方法:"要查看 Amp 正在使用的智能体文件,请从命令面板中选择 agents-md list。" 在几个不同的目录中运行它,并在智能体接触不同的文件类型后运行。这是确认 glob 是否如你所想发挥作用的最快方法。

然后进行实际缩小常驻集的操作。回顾根文件中剩下的内容,并询问每一行是指令还是事实。"在提交前运行 pnpm test" 是一条指令——简短、行为导向,属于 AGENTS.md。"API 在路径中进行了版本控制,因为有两个移动客户端固定了旧版本" 是一个事实。它没有适合的 glob,因为它与文件类型无关;它与你的项目有关,智能体在涉及该主题时就需要它,而不是在模式匹配时。

事实是导致指令文件膨胀到无法被遵循的根源,没有任何限制机制可以解决这个问题,因为限制的维度总是错误的。解决办法是将它们保存在智能体可以按需读取的地方。MemoryLake 的设置只需三个步骤。

步骤 1:创建 API 密钥

登录并从你的控制面板生成一个 API 密钥。它完全独立于 AGENTS.md 链之外,因此它所包含的任何内容都不会常驻在每个会话中,也不会受到不适合它的模式的限制。

创建 MemoryLake API 密钥,使事实存在于 Amp 总是包含的指令文件之外
创建 MemoryLake API 密钥,使事实存在于 Amp 总是包含的指令文件之外

步骤 2:上传你的第一批记忆

放入事实:架构决策及其背后的原因、领域词汇、服务所有权、为什么存在临时解决方案、你在代码评审中不断给出的答案。任何关于项目本身而非关于文件类型的事实。

将项目事实上传到 MemoryLake,而不是让根目录的 AGENTS.md 膨胀
将项目事实上传到 MemoryLake,而不是让根目录的 AGENTS.md 膨胀

将行为保留在 AGENTS.md 中,在模式真正适用时通过 glob 进行限制。这两层承担着不同的工作。

步骤 3:连接你的 AI 和智能体

将 Amp 指向该存储。你的根文件变得足够简短,可以被可靠地遵循,你的受 glob 限制的文件保持精简且行为导向,而项目知识在问题需要时才会到达——这与通过记忆层减少 token 使用背后的道理相同。

通过 MCP 将 Amp 连接到 MemoryLake,使引导保持在限定范围内
通过 MCP 将 Amp 连接到 MemoryLake,使引导保持在限定范围内

这在实践中改变了什么

第一个改变是,添加引导不再是一种权衡。如今,一个新的规范要么放入常驻文件中并对每个任务征税,要么被排除在外。受限文件为任何具有文件类型结构的内容消除了这种选择。

第二个改变是,无需你编写更好的文本,遵循度就会提高。较短的常驻指令集比长指令集更容易被一致地遵循,这就是为什么即使在上下文预算不紧张的情况下,拆分也是值得做的。

第三个改变是,切换工具的成本变得更低。Amp 已经将 AGENT.mdCLAUDE.md 作为备用方案进行读取,因此指令层几乎是可移植的——正如将 CLAUDE.md 迁移到 AGENTS.md中所描述的结构。而事实层是只有当你将其保持在工具之外时才具有可移植性的部分。

限制 Amp 指令范围的最佳实践

  • 保持根文件通用。 架构、构建和测试命令、评审和发布步骤。这是 Amp 自身对大型仓库的建议。
  • 对目录结构的引导使用子树文件。 当智能体读取子树中的文件时,它们就会加载。
  • 对文件类型结构的引导使用 globs 语言规范、测试模式、框架规则。
  • 记住,单纯的 @ 提及仍然是无条件的。 如果没有 globs,被提及的文件总是会被包含。
  • 注意两条解析规则。 提及路径相对于提及文件进行解析;除非以 ./../ 开头,否则 glob 会获得隐式的 **/ 前缀。
  • 检查陈旧的备用方案。 在没有 AGENTS.md 的目录中,遗留的 AGENT.mdCLAUDE.md 是生效的引导。
  • 使用 agents-md list 进行验证。 从不同的目录运行它,并在接触不同的文件类型后运行。
  • 每个任务一个线程,并在其增长时进行交接。 这是 Amp 的引导,这关乎上下文质量,而非整洁度。

结论

Amp 的指令系统对于每个文件何时加载有着异常明确的规定,而其模式之一——从 AGENTS.md 引用的受 glob 限制的文件——将指令从固定成本转变为条件成本。它只需要几行 frontmatter,是根文件已经膨胀的仓库中唯一最具杠杆效应的改变。

它无法解决的是没有模式的内容。项目事实不是文件类型结构的,限制对它们来说是错误的工具。将指令与知识分离开来,限制指令,并将知识放在智能体可以获取的地方,而无需在每个会话中为此支付租金。

常见问题

使用 @ 引用的文件每次都会加载吗?

只有在它没有 globs 的情况下才会。文档很明确:"如果没有指定 globs,则在被 @ 提及时,该文件总是会被包含。" 添加 globs 列表才是使包含变为有条件的原因。

究竟是什么触发了受 glob 限制的文件?

Amp 读取了匹配的文件。其表述为 "只有在 Amp 读取了匹配任何 glob 的文件时,带有 globs 的被提及文件才会被包含" —— 因此它遵循的是智能体在任务期间的实际读取,而不是你的编辑器状态。

我的 glob 模式从哪里解析?

除非以 .././ 开头,否则 glob 会获得隐式的 **/ 前缀,"在这种情况下,它们指的是相对于被提及文件的路径。" 提及路径本身是相对于包含该提及的智能体文件进行解析的,而不是工作目录,并且支持绝对路径以及 @~/some/path

Amp 总是包含哪些文件?

你工作目录中的 AGENTS.md 以及最高到 $HOME 的父目录中的 AGENTS.md,加上系统级引导以及 $HOME/.config/amp/AGENTS.md$HOME/.config/AGENTS.md(如果存在)。子树文件是有条件的情况,当智能体读取子树中的文件时会被包含。

Amp 会读取我遗留的 CLAUDE.md 吗?

是的,在没有 AGENTS.md 的目录中:"如果目录中不存在 AGENTS.md,但存在名为 AGENT.md(没有 S)或 CLAUDE.md 的文件,则该文件将被包含。" 这对于迁移很方便,如果旧规范不断浮现,也值得进行审计。

我如何查看 Amp 实际加载了什么?

从命令面板中选择 agents-md list。它会显示正在使用的智能体文件,这是确认 glob 是否按预期进行限制的可靠方法,而不是从行为中推断——这在编程智能体实际读取了什么中描述的普遍习惯。