11---
2- title : 翻译:AGENTS.md 在我们的 Agent 评估中优于 Skills
2+ title : 翻译:AGENTS.md 在我们的智能体评估中优于 Skills
33date : 2026-02-09 06:43
44categories : [技术]
55tags : [ai, agent]
66---
77
88翻译自 Vercel 博客文章:[ AGENTS.md outperforms skills in our agent evals] ( https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals )
99
10- 我们原本期望技能是教授编码代理框架特定知识的解决方案 。在构建专注于 Next.js 16 API 的评估后,我们发现了意想不到的结果。
10+ 我们原本期望技能是教授编码智能体框架特定知识的解决方案 。在构建专注于 Next.js 16 API 的评估后,我们发现了意想不到的结果。
1111
12- 直接嵌入在 ` AGENTS.md ` 中的压缩版 8KB 文档索引实现了 100% 的通过率,而技能即使在明确指示代理使用它们的情况下 ,最高也只能达到 79%。如果没有这些指示,技能的表现与完全没有文档时没有区别。
12+ 直接嵌入在 ` AGENTS.md ` 中的压缩版 8KB 文档索引实现了 100% 的通过率,而技能即使在明确指示智能体使用它们的情况下 ,最高也只能达到 79%。如果没有这些指示,技能的表现与完全没有文档时没有区别。
1313
1414以下是我们尝试的方法、我们学到的经验,以及如何在自己的 Next.js 项目中设置这一功能。
1515
1616## 我们试图解决的问题
1717
18- AI 编码代理依赖于会过时的训练数据 。Next.js 16 引入了 ` 'use cache' ` 、` connection() ` 和 ` forbidden() ` 等 API,这些 API 并不在当前模型的训练数据中。当代理不了解这些 API 时,它们会生成不正确的代码或回退到旧的模式。
18+ AI 编码智能体依赖于会过时的训练数据 。Next.js 16 引入了 ` 'use cache' ` 、` connection() ` 和 ` forbidden() ` 等 API,这些 API 并不在当前模型的训练数据中。当智能体不了解这些 API 时,它们会生成不正确的代码或回退到旧的模式。
1919
20- 反之也可能发生——你运行的是较旧版本的 Next.js,而模型建议了你的项目中尚不存在的新 API。我们希望通过向代理提供版本匹配的文档来解决这个问题 。
20+ 反之也可能发生——你运行的是较旧版本的 Next.js,而模型建议了你的项目中尚不存在的新 API。我们希望通过向智能体提供版本匹配的文档来解决这个问题 。
2121
22- ## 教授代理框架知识的两种方法
22+ ## 教授智能体框架知识的两种方法
2323
2424在深入探讨结果之前,先简要介绍一下我们测试的两种方法:
2525
26- - ** 技能** 是一种开放标准,用于封装编码代理可以使用的领域知识。一个技能将代理可以按需调用的提示 、工具和文档捆绑在一起。其理念是代理在意识到需要特定框架的帮助时调用该技能 ,并获取相关文档。
27- - ` AGENTS.md ` 是项目根目录中的一个 Markdown 文件,为编码代理提供持久上下文 。无论你在 ` AGENTS.md ` 中放入什么内容,代理在每个回合都可以使用,而无需代理决定加载它 。Claude Code 使用 ` CLAUDE.md ` 来达到相同的目的。
26+ - ** 技能** 是一种开放标准,用于封装编码智能体可以使用的领域知识。一个技能将智能体可以按需调用的提示 、工具和文档捆绑在一起。其理念是智能体在意识到需要特定框架的帮助时调用该技能 ,并获取相关文档。
27+ - ` AGENTS.md ` 是项目根目录中的一个 Markdown 文件,为编码智能体提供持久上下文 。无论你在 ` AGENTS.md ` 中放入什么内容,智能体在每个回合都可以使用,而无需智能体决定加载它 。Claude Code 使用 ` CLAUDE.md ` 来达到相同的目的。
2828
2929我们构建了一个 Next.js 文档技能和一个 ` AGENTS.md ` 文档索引,然后将它们通过我们的评估套件,看看哪种表现更好。
3030
3131## 我们最初押注于技能
3232
33- 技能似乎是正确的抽象。你将框架文档打包成一个技能,代理在处理 Next.js 任务时调用它,然后你就能得到正确的代码。职责分离清晰,上下文开销最小,代理只加载它需要的内容 。甚至在 skills.sh 上还有一个不断增长的现成技能目录。
33+ 技能似乎是正确的抽象。你将框架文档打包成一个技能,智能体在处理 Next.js 任务时调用它,然后你就能得到正确的代码。职责分离清晰,上下文开销最小,智能体只加载它需要的内容 。甚至在 skills.sh 上还有一个不断增长的现成技能目录。
3434
35- 我们期望代理遇到 Next.js 任务,调用技能,阅读版本匹配的文档,然后生成正确的代码。
35+ 我们期望智能体遇到 Next.js 任务,调用技能,阅读版本匹配的文档,然后生成正确的代码。
3636
3737然后我们运行了评估。
3838
3939## 技能没有被可靠地触发
4040
41- 在 56% 的评估案例中,技能从未被调用。代理可以访问文档但没有使用它 。添加技能相比基线没有产生任何改进:
41+ 在 56% 的评估案例中,技能从未被调用。智能体可以访问文档但没有使用它 。添加技能相比基线没有产生任何改进:
4242
4343| 配置 | 通过率 | 相比基线 |
4444| --- | --- | --- |
4545| 基线(无文档) | 53% | — |
4646| 技能(默认行为) | 53% | +0pp |
4747
48- 零改进。技能存在,代理可以使用它,但代理选择不使用 。在详细的构建/Lint/测试细分中,技能在某些指标上实际上表现比基线更差(测试方面为 58% vs 63%),这表明环境中未使用的技能可能会引入噪声或干扰。
48+ 零改进。技能存在,智能体可以使用它,但智能体选择不使用 。在详细的构建/Lint/测试细分中,技能在某些指标上实际上表现比基线更差(测试方面为 58% vs 63%),这表明环境中未使用的技能可能会引入噪声或干扰。
4949
50- 这并非我们设置所独有。代理不能可靠地使用可用工具是当前模型的一个已知局限性 。
50+ 这并非我们设置所独有。智能体不能可靠地使用可用工具是当前模型的一个已知局限性 。
5151
5252## 明确指令有帮助,但措辞很脆弱
5353
54- 我们尝试在 ` AGENTS.md ` 中添加明确指示,告诉代理使用该技能 。
54+ 我们尝试在 ` AGENTS.md ` 中添加明确指示,告诉智能体使用该技能 。
5555
5656``` text
5757Before writing code, first explore the project structure,
@@ -66,7 +66,7 @@ then invoke the nextjs-doc skill for documentation.
6666| 技能(默认行为) | 53% | +0pp |
6767| 带明确指令的技能 | 79% | +26pp |
6868
69- 一个实质性的改进。但我们发现指令措辞影响代理行为的方式有些出乎意料 。
69+ 一个实质性的改进。但我们发现指令措辞影响智能体行为的方式有些出乎意料 。
7070
7171不同的措辞产生了截然不同的结果:
7272
@@ -101,7 +101,7 @@ then invoke the nextjs-doc skill for documentation.
101101
102102## 产生回报的直觉
103103
104- 如果我们完全移除决策会怎样?与其希望代理调用技能 ,我们可以直接在 ` AGENTS.md ` 中嵌入文档索引。不是完整的文档,只是一个告诉代理在哪里找到与你的项目 Next.js 版本匹配的特定文档文件的索引。然后代理可以根据需要读取这些文件 ,无论你是使用最新版本还是维护旧项目,都能获得版本准确的信息。
104+ 如果我们完全移除决策会怎样?与其希望智能体调用技能 ,我们可以直接在 ` AGENTS.md ` 中嵌入文档索引。不是完整的文档,只是一个告诉智能体在哪里找到与你的项目 Next.js 版本匹配的特定文档文件的索引。然后智能体可以根据需要读取这些文件 ,无论你是使用最新版本还是维护旧项目,都能获得版本准确的信息。
105105
106106我们在注入的内容中添加了一个关键指令。
107107
@@ -110,7 +110,7 @@ IMPORTANT: Prefer retrieval-led reasoning over pre-training-led reasoning
110110for any Next.js tasks.
111111```
112112
113- 这告诉代理查阅文档 ,而不是依赖可能过时的训练数据。
113+ 这告诉智能体查阅文档 ,而不是依赖可能过时的训练数据。
114114
115115## 结果让我们惊讶
116116
@@ -140,7 +140,7 @@ for any Next.js tasks.
140140
141141我们的工作理论归结为三个因素。
142142
143- 1 . 没有决策点。 使用 ` AGENTS.md ` ,代理不需要决定 "我应该查找这个吗?"的时刻。信息已经存在。
143+ 1 . 没有决策点。 使用 ` AGENTS.md ` ,智能体不需要决定 "我应该查找这个吗?"的时刻。信息已经存在。
1441442 . 一致的可用性。 技能异步加载且仅在调用时加载。` AGENTS.md ` 内容在每个回合的系统提示中都可用。
1451453 . 没有顺序问题。 技能创建排序决策(先读文档 vs 先探索项目)。被动上下文完全避免了这个问题。
146146
@@ -159,7 +159,7 @@ for any Next.js tasks.
159159
160160完整索引涵盖 Next.js 文档的每个部分。
161161
162- 代理知道在哪里可以找到文档 ,而无需在上下文中包含完整内容。当它需要特定信息时,它会从 ` .next-docs/ ` 目录读取相关文件。
162+ 智能体知道在哪里可以找到文档 ,而无需在上下文中包含完整内容。当它需要特定信息时,它会从 ` .next-docs/ ` 目录读取相关文件。
163163
164164## 亲自尝试
165165
@@ -175,22 +175,22 @@ for any Next.js tasks.
1751752 . 将匹配的文档下载到 ` .next-docs/ `
1761763 . 将压缩索引注入到你的 ` AGENTS.md ` 中
177177
178- 如果你使用支持 ` AGENTS.md ` 的代理 (如 Cursor 或其他工具),同样的方法也适用。
178+ 如果你使用支持 ` AGENTS.md ` 的智能体 (如 Cursor 或其他工具),同样的方法也适用。
179179
180180## 这对框架作者意味着什么
181181
182- 技能并非无用。` AGENTS.md ` 方法在所有任务中提供代理与 Next.js 协作的广泛、横向改进。技能更适合用户明确触发的垂直、特定于操作的工作流,如"升级我的 Next.js 版本"、"迁移到 App Router"或应用框架最佳实践。这两种方法相辅相成。
182+ 技能并非无用。` AGENTS.md ` 方法在所有任务中提供智能体与 Next.js 协作的广泛、横向改进。技能更适合用户明确触发的垂直、特定于操作的工作流,如"升级我的 Next.js 版本"、"迁移到 App Router"或应用框架最佳实践。这两种方法相辅相成。
183183
184- 也就是说,对于一般框架知识,被动上下文目前优于按需检索。如果你维护一个框架并希望编码代理生成正确的代码 ,请考虑提供一个 ` AGENTS.md ` 片段供用户添加到他们的项目中。
184+ 也就是说,对于一般框架知识,被动上下文目前优于按需检索。如果你维护一个框架并希望编码智能体生成正确的代码 ,请考虑提供一个 ` AGENTS.md ` 片段供用户添加到他们的项目中。
185185
186186实用建议:
187187
188188- 不要等待技能改进。 随着模型在工具使用方面变得更好,差距可能会缩小,但结果现在就很重要。
189189- 积极压缩。 你不需要上下文中的完整文档。指向可检索文件的索引同样有效。
190190- 使用评估进行测试。 构建针对训练数据中不存在的 API 的评估。这是文档访问最重要的地方。
191- - 为检索而设计。 构建你的文档结构,以便代理可以找到并读取特定文件 ,而不需要预先获取所有内容。
191+ - 为检索而设计。 构建你的文档结构,以便智能体可以找到并读取特定文件 ,而不需要预先获取所有内容。
192192
193- 目标是将代理从预训练主导的推理转变为检索主导的推理 。` AGENTS.md ` 结果证明是实现这一目标的最可靠方法。
193+ 目标是将智能体从预训练主导的推理转变为检索主导的推理 。` AGENTS.md ` 结果证明是实现这一目标的最可靠方法。
194194
195195---
196196
0 commit comments