ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AGENTS.md:为AI编程助手构建项目级记忆的工程实践

AGENTS.md:为AI编程助手构建项目级记忆的工程实践

1. 从"失忆"到"有记性":AI 编程助手正在经历一场隐性革命

如果你在过去半年里深度使用过 AI 编程助手,大概率会遇到这样的场景:新开一个会话,把项目背景、技术栈、目录结构、代码规范从头到尾又说了一遍,AI 点头称是,结果写出来的第一段代码还是不符合项目约定。再追问两句,它连你自己十分钟前贴的依赖版本都忘了。这不是个例,而是无状态模型天生的缺陷。AI 编程正在从"每次空白开局"走向"持久记忆 + 显式规则约束"的范式转换,而承载这一转换的核心工程,业内正在逐步统一到一份文件上:AGENTS.md。

这个变化不是某一家工具的营销噱头,而是整个 AI 编码工具链条的共同走向。过去我们写提示词,本质上是"这一次对话"范围内想办法让模型记住约束;现在我们需要的是"项目级记忆",让 AI 在每次进入项目时自动加载规则、上下文和约束,并且不需要你反复唠叨。你可以把 AGENTS.md 理解成给 AI 助手写的"员工手册"或"交接文档":它不参与业务代码逻辑,却决定了 AI 助手的"做事方式"。

这篇文章想聊的核心,不是某个新框架的 API 用法,而是我过去几个月在多个真实项目里反复调试、推翻、再建立的一套记忆工程方法论。从无状态模型的痛点出发,到 Memory 工程的几个关键层次,再到 AGENTS.md 声明式配置的写法、组织方式、版本管理,最后是踩坑记录。适合正在用 AI 辅助写代码、又觉得"AI 总是不听话"的开发者,也适合团队想把 AI 助手的表现标准化、可复现的人。

先说结论:把"规则"从对话里搬进文件里,把"记忆"从模型的隐性上下文变成项目的显式资产,这不仅仅是效率提升,而是让 AI 编程从"碰运气"走向"工程化"的关键一步。接下来的内容,我尽量按实际踩坑的顺序讲,保证每一步都直接能落地。

2. 无状态模型的困境:为什么 AI 总觉得"你什么都没说"

要理解 AGENTS.md 为什么会出现,得先弄清楚旧模式到底卡在哪里。无状态这个词,听起来像技术术语,其实打个比方就明白了:每次你打开一个新会话,AI 都相当于第一天入职的新员工。它可能读过很多书(预训练知识),但对当前项目一无所知。你告诉它的每一句话,都只存在于当前对话的"短期记忆"里,一旦会话关闭或上下文超长被截断,它就全部忘光。

2.1 上下文窗口的"虚假安全感"

很多人以为既然上下文窗口越来越大,从几千 token 到几万甚至百万,那我把整个项目说明都贴进对话里总行了吧?实测下来,这条路走不通。一是成本,每次会话都重复贴大量背景说明,token 消耗飞快;二是效果,窗口变大并不等于模型能精确记住所有细节,长上下文中早期的信息往往被"稀释"。我在一个中大型项目里试过,把架构文档、编码规范、关键模块说明全部塞进系统提示和首轮对话,结果模型在生成后续代码时依然频繁违反约定,尤其是那些它"见过但没被强调"的规则。

更麻烦的是团队协作场景。团队里五个人都在用 AI 编程助手,每个人各自维护一套提示词,内容还不一致。A 同学告诉 AI 用函数式风格,B 同学告诉 AI 用类封装,AI 在不同人的会话里表现完全不一样。代码审查时经常出现同一模块两种写法交替出现的"精神分裂"状态。问题不在模型,在于我们从来没有把规则以"工程资产"的方式管理起来。

2.2 提示词注入的失效模式

早期的解决方案是"提示词模板 + 项目规则文件"混合使用。比如有人维护一个 RULES.md,每次使用 AI 时手动把内容复制进去;有人用 .cursorrules 之类的单文件规则;还有人干脆把所有约定写进代码注释。这些做法有共性缺陷:

  • 规则跟随"人",不跟随"项目":换了机器、换了工具、换了协作者,规则就丢了。
  • 复制粘贴容易遗漏或过期:文件更新了,粘贴的还是旧版本。
  • 缺少结构化和优先级设计:几十条规则堆在一起,模型分不清楚哪些是硬性约束、哪些是风格偏好。

我自己就吃过亏。某次重构,我明明在提示词里写了"不要修改公共接口签名",结果 AI 一口气改了五个公共方法。回头看,这条规则被淹没在了一长串指令中间,模型根本没接住。问题不在模型笨,而在我们没有用"它容易理解"的方式传递约束。

2.3 隐性知识是无法"提示"出来的

再往深一层说,无状态模型真正缺的不是基本信息,而是项目的隐性知识。所谓隐性知识,包括:这个模块为什么这么设计、哪个地方是历史遗留的坑、测试数据的生成规则、部署环境的特殊性。这些东西往往不在任何文档里,只存在于核心开发者的脑子里。你想靠提示词告诉 AI?你首先得想得起来,其次得说得清。大多数时候,你根本没意识到 AI 需要知道这些。

这让我意识到一个关键问题:AI 编程的记忆工程,不能只解决"信息存储",还要解决"信息组织"。换句话说,不是简单地建立一个文档让 AI 去读,而是要让规则、上下文、项目状态在合适的时候出现在合适的位置。这正是 AGENTS.md 这类声明式配置的用武之地。

3. Memory 工程的三个层次:会话层、项目层、组织层

在具体介绍 AGENTS.md 之前,我想先建立一个分析框架。过去几个月,我把 AI 编程中的记忆问题拆成了三个层次,分别对应不同的工具手段,大部分团队混乱的根源就在于把三个层次混为一谈。

3.1 会话层记忆:临时工作区

会话层记忆就是模型在当前对话里的上下文。它的特点是"瞬时且私有":只对当前会话有效,不会持久化。很多人拼命优化提示词,本质上是在会话层做文章——把尽可能多的信息塞进当前窗口。

会话层记忆适合放"一次性信息":当前要完成的具体任务、你刚粘贴的报错信息、某个临时决定的实现方案。把这些塞进项目级配置里反而有害,因为下次配置加载时,这些过时信息会干扰模型判断。

实操建议:在会话开始时,花 30 秒整理"本轮任务的三要素"——目标(要完成什么)、边界(不能碰什么)、验收标准(怎么算完成)。这比堆砌背景信息有效得多。

3.2 项目层记忆:规则与上下文的持久化

项目层记忆解决的是"AI 一进项目就知道规矩"的问题。它的载体就是项目内的配置文件:AGENTS.md、CLAUDE.md、.cursorrules 等。这一层的关键在于持久化、随项目走、可版本管理。

在 2025 年之前,各家 AI 编程助手各搞一套:某主流助手读 CLAUDE.md,另一个读 AGENTS.md,还有的读 .cursorrules。你维护了三个文件,内容还容易不一致。2025 年起,AGENTS.md 逐渐被多家主流工具共同采纳,行业事实标准的味道越来越浓。它本质上是一种约定:AI 工具在进入项目时,自动加载项目根目录下的 AGENTS.md 文件,将其内容作为系统级指令的一部分。

维度会话层提示词AGENTS.md 项目配置传统文档(如 README)
生效时机每次手动粘贴工具自动加载需要 AI 主动检索
持久性仅当前会话永久,随项目走永久,随项目走
规范约束力弱,取决于用户复述强,模型默认遵守取决于模型是否读到
版本管理无法管理Git 管理Git 管理
团队共享困难,依赖个人自然共享,提交即生效共享但不会自动生效

3.3 组织层记忆:跨项目的团队知识库

组织层是目前最容易被忽视的层次。一个团队可能有十几个项目,每个项目都有自己的 AGENTS.md,但有些规则是所有项目通用的——比如代码审查规范、commit 信息格式、常用的工具链约定。把这些重复内容复制到每个项目的 AGENTS.md 里,维护成本极高;不复制,跨项目协作时又管不住。

我的做法是维护一个"团队规则模板"仓库,每个新项目初始化时自动拷贝基础模板,再根据项目特性增删。这种"模板 + 增量"的方式既保证了基础一致性,又允许各项目灵活扩展。更进一步,团队可以搭建内部的知识检索服务,让 AI 在需要时查询组织级规范,但目前这还比较重,大多数团队做到"模板分发"就已经很好了。

理解了这三个层次,你就明白 AGENTS.md 只解决了"项目层"的问题,但它是整个记忆工程的基石。会话层太灵活,做不到强制约束;组织层太重,不适合作为切入点;只有项目层,既有持久性,又能在每次代码生成时持续生效,是性价比最高的一层。

4. AGENTS.md 声明式配置:从"怎么说"到"定规矩"

终于讲到核心了。AGENTS.md 的定位不是一份普通文档,而是一份"可执行的约定"——AI 工具阅读它之后,会按照里面的指令调整行为。它的威力不在于写了什么,而在于它是"声明式"的:你描述期望的状态和规则,AI 负责在生成代码时自我约束,而不是等待你一步步下达指令。

4.1 声明式 vs 命令式的本质区别

传统的提示词方式更像命令式编程:你告诉 AI 每一步怎么做,"先读取 utils.py,然后用 retry 装饰器包裹网络请求,出错时打印日志"。这种方式的问题是:步骤一旦变更,你必须重新指示;而且它依赖模型在生成长序列时逐条遵守,实际效果很差。

声明式配置的思路是描述"规矩"本身:"本项目所有网络请求必须使用统一的 retry 机制,超时时间默认 5 秒;对外部依赖的引入需要经过代码审查确认。"至于具体哪个文件怎么改,AI 会结合当前代码自行判断。这就像你给新员工交底,"不管你写什么模块,网络请求都得走统一通道",而不是手把手教他某个函数怎么实现。

这个转变非常关键,因为它把"遵守规则"从用户的责任变成了框架和配置的责任。AI 不是每次都在等你说,而是默认遵守一套预先定义好的规范。

4.2 AGENTS.md 的标准结构与常见误区

不同工具对 AGENTS.md 的解析方式略有差异,但经过实践检验,一个工程可用的 AGENTS.md 通常包含以下几个区块:

  • 项目概览:一句话说明项目是什么、核心业务领域、主要技术栈。
  • 常用命令:测试、构建、代码检查、格式化等命令的准确写法,减少 AI 猜命令的浪费。
  • 代码风格与架构约定:命名规范、模块组织方式、事务边界、错误处理策略。
  • 关键约束:不可触碰的模块、禁止使用的模式、安全敏感区的处理方式。
  • 工作流指引:改代码前要做什么检查、提交 commit 前要跑什么命令、如何写测试。

这里我踩过一个典型误区:一开始把 AGENTS.md 写成了"项目百科",什么背景、历史、未来规划都往里塞,洋洋洒洒两千字,结果 AI 反而抓不住重点。后来我意识到,AI 不是人,它不会"通读并理解",它是在生成每一步代码时参考这份配置。因此配置内容必须"高度与代码生成决策相关"。

举例来说,"项目使用 Python 3.11"很重要;"项目立项于 2023 年,目标是提升行业数字化水平"基本没用。前者直接约束了语法特性和依赖选择,后者与任何一次代码生成都无关。写 AGENTS.md 的第一原则是:只写会影响"代码如何写"的内容。

还有一点经常被忽略:AGENTS.md 不是写给"你"的,而是写给"AI 和未来维护者"的。它不能替代 README 向人类介绍项目,也不能替代架构文档解释设计动机。它的目标是让 AI 在没有任何对话背景的情况下,接手项目后第一行代码就符合项目规范。

4.3 多工具兼容策略:一份配置,处处生效

如前所述,生态里存在 CLAUDE.md、.cursorrules、AGENTS.md 等多个配置文件。理想情况下,你应该以 AGENTS.md 为唯一维护入口,然后做一层"桥接"。

主流编程助手对 AGENTS.md 的自动识别方式不同:有的直接读取根目录 AGENTS.md,有的需要配置开启,还有的可能更偏好 CLAUDE.md。我在团队里的做法是:主文件只维护 AGENTS.md,然后在根目录放一个 CLAUDE.md,里面只写一行:"请参考项目根目录下的 AGENTS.md 获取全部项目规则。" 这样既避免了多份配置的同步成本,又保证了不同工具都能加载到同一份规则。

4.4 一个可复用的 AGENTS.md 骨架

直接给一份我目前实际在使用的模板,省略了具体业务细节,保留结构骨架:

# AGENTS.md ## 项目概述 - 项目名称:XX 数据平台 - 核心业务:提供数据采集、清洗、分析与可视化的一体化平台 - 技术栈:Python 3.11 + FastAPI + React 18 + PostgreSQL 15 ## 常用命令 - 安装依赖:poetry install - 本地启动 API:poetry run uvicorn app.main:app --reload - 前端开发:pnpm dev - 执行测试:poetry run pytest - 代码检查:poetry run ruff check . - 格式检查:poetry run black --check . ## 代码风格与架构约定 1. 后端代码按 domain 划分目录,每个 domain 内部包含 router / service / repository 三层 2. 数据库访问必须经过 repository 层,禁止在 service 中直接写 SQL 3. 所有外部 API 调用必须使用统一的 HTTP client 封装,默认超时 5 秒,重试 3 次 4. 新增接口遵循 RESTful 规范,返回格式统一为 { "code": 0, "data": ..., "message": "ok" } 5. 前端组件使用 TypeScript 类型定义,禁止使用 any 绕过类型检查 ## 关键约束 - 禁止直接修改数据库表结构,所有变更必须通过 migration 脚本 - 用户敏感数据在日志中必须脱敏,禁止打印原始 token - auth 模块为安全敏感区,涉及认证和权限的改动需要额外注释说明 - 存量代码中未经确认的"临时方案"不要主动替换,避免范围蔓延 ## 工作流指引 - 修改代码前,先定位相关模块,阅读现有实现再动手 - 写完功能代码后,必须补充或更新对应的单元测试 - 所有新依赖的引入需在 commit 说明中备注原因 - 提交 commit 前,必须运行 lint 和全部测试

这份模板不是银弹,但它覆盖了 AI 编码时需要的大部分关键信息。你可能注意到了,我特意用"必须""禁止"这类强约束词,以及"不要主动替换"这种边界说明。这是因为模型对强约束词和边界描述的响应比模糊的"建议"可靠得多。

5. 从文件到行为:配置驱动的 AI 工作流改造

AGENTS.md 文件放在项目里,只是"有记忆"的第一步。真正让它发挥威力,需要你改变使用 AI 的整个工作流。这一节分享我从失败的尝试到稳定流程的演化过程,以及让配置真正"管住" AI 的几个关键手法。

5.1 预检与上下文注入:让配置文件"活"起来

只放一个 AGENTS.md 在根目录,不保证 AI 每次都会读。有些编程助手在会话开始时自动加载,但你仍然要养成一个习惯:每轮任务开始前,先确认 AI 是否读取了项目配置。最简单的方式是直接问一句:"根据项目 AGENTS.md 中的约定,本次任务需要注意哪些约束?"

如果 AI 的回答明显没有命中关键约束,比如它没提到"禁止直接改数据库结构",说明配置没有被加载。这时不要把任务硬往下推,先解决配置加载问题。

你还可以把 AGENTS.md 当作"检查清单"来用:在任务完成后,要求 AI 对照配置逐条自查。我曾经让 AI 修改一个数据处理模块,产出后看起来完美,但自查时它自己发现:"我的实现中在 service 层直接写了 SQL,违反了第 3 条约定。" 这个发现如果没有自查环节,恐怕要到 code review 时才能被人工捉住。

5.2 规则冲突与优先级:当 AGENTS.md 跟上文打架

使用中一定会遇到一个问题:如果我在当前会话提示词里说"这次特殊处理,允许绕过 service 层直查数据库",而 AGENTS.md 里写了"禁止直接写 SQL",AI 听谁的?

我实测下来的结论是:明确、具体的当前会话指令通常会覆盖配置文件中的通用规则,但前提是你要明确说出来。模糊的"这次随便写写"无法覆盖配置中的强约束。这实际上是好事——强约束保证了默认安全,临时突破则需要显式授权。这跟权限管理里的"默认拒绝,显式允许"是同一个道理。

另一个常见冲突是 AGENTS.md 内部自相矛盾。比如规则 A 说"所有接口必须走 service 层",规则 B 说"性能敏感路径允许直接查询"。如果不加限定条件,AI 判别时会很挣扎。解决办法是给规则加适用场景:"以下情况可以绕过 service 层:读多写少的报表接口,且响应时间要求低于 200ms。" 模型对"条件化规则"的处理明显好于"无条件但相互矛盾的规则"。

5.3 与代码库的可检索性结合

AGENTS.md 对 AI 的约束是"软性"的——模型尽力遵守,但不保证百分百。要把规则变成"硬性"的,必须配合代码库的可检索性。什么是可检索性?就是 AI 在生成代码时,能快速找到现有代码里与规则对应的参考。

我在一个项目里设置了一条规则:"所有日期时间处理必须基于 UTC 存储,展示层再转换为本地时区。" 这条规则写在 AGENTS.md 里,AI 偶尔还是会写出datetime.now()这种本地时间调用。后来我把项目里现有的 UTC 时间工具函数命名为get_utc_now(),并在 AGENTS.md 里写明"获取当前时间统一使用 utils/time.py 中的 get_utc_now,禁止直接调用 datetime.now()"。因为有了明确的函数入口,AI 生成代码时更容易"命中"正确写法。规则从"语义约束"变成了"符号约束",遵守率大幅提升。

这个经验可以推广:配置规则时,尽量指明"应该使用哪个模块的哪个函数/类",而不是只说"应该使用统一的封装"。AI 对具体符号的检索能力远强于对抽象原则的遵循能力。

5.4 版本管理与变更流程

AGENTS.md 跟代码一样需要演进。当项目技术栈变化、架构调整、或者你发现有反复出现的问题时,应该更新配置。但配置变更不能随意,因为它会影响 AI 在后续所有会话中的行为。

我建议把 AGENTS.md 的变更视同 API 变更来管理:更新后,在 commit message 里写清楚变更原因;重大变更(比如禁止某类写法、新增架构约束)要在团队里同步,避免部分人不知道新规则而导致 AI 行为不一致。

还有个小技巧:在 AGENTS.md 的 changelog 区记录每次变更的日期和原因。AI 在加载配置时看到这段历史,也能推断"最近关注什么",有时反而有助于它理解当前的行为偏好。我自己的仓库里记录过这样一条:"2025-06-12:经排查,大量线上事故源于未捕获的数据库异常,现禁止裸露的 raw query,必须经由 repository 统一异常映射。" 从那以后,AI 写数据库相关代码时自动带上了异常处理,效果立竿见影。

6. 实操:我从零搭建一套项目记忆配置的过程记录

前面讲了原则和方法,这一节用一个接近真实的模拟项目把全过程走一遍。假设要搭建的是一款内部数据报表系统,技术栈为 FastAPI + React,需要一套完整的 AI 编程记忆配置。

6.1 第一步:先梳理"AI 最容易犯的错"

在写 AGENTS.md 之前,我强烈建议先把项目过去两周内 AI 生成的代码里出现过的问题整理一遍,而不是凭空想象规则。我在模拟项目里整理出的高频问题包括:

  • 接口返回格式不统一,有的返回{code, data, message},有的直接返回裸数据
  • 部分开发环境变量被硬编码进了配置文件
  • 日期时间处理混用了 UTC 和本地时间
  • 测试只覆盖正常路径,缺少异常场景
  • 前端组件用了 any 类型,导致运行时错误发现得太晚

这些问题变成配置规则就有了依据。把"AI 经常做错什么"作为配置的第一输入,比我凭感觉列一长串规范要精准得多。

6.2 第二步:按"影响优先级"配置,而不是按"类别"堆砌

多数人写配置文件喜欢按主题分类:代码风格、架构、测试、部署……我现在的做法是按"对代码生成决策的影响程度"排序。最核心的规则必须放在文件靠前位置,因为模型在长文档中更容易记住前部和后部的内容,中段信息最容易丢失。

我给模拟项目设计的配置顺序是:

  1. 项目技术栈和快速命令(影响一切代码生成的前提)
  2. 不可触碰的约束(安全、数据库结构、敏感数据)
  3. 通用架构模式(分层约定、模块组织)
  4. 风格偏好(命名、格式、错误处理)
  5. 工作流要求(测试、提交、文档)

对比之下,早期我把"命名规范"放在最前面,结果 AI 在生成核心业务代码时经常忽略更重要的架构约束。调整顺序之后,行为质量有了肉眼可见的提升。

6.3 第三步:为关键场景写"条件触发"的规则

纯粹的全局规则总有失灵的时候,因为实际情境差异太大。我逐渐发展出一种写法:以"当……时,必须……"为句式,为高频场景写条件规则。

例如:

  • 当新增一个数据接口时,必须先设计好 repository 层的数据访问,再写 router 层。
  • 当修改现有接口的行为时,必须在 commit 中标注 breaking change 并同步更新前端调用。
  • 当引入一个新的第三方库时,必须先确认已被团队审批白名单收录,并在 AGENTS.md 的依赖变更区登记。

这种条件触发式规则,把"一个抽象原则"分解成了"若干具体场景下的动作",模型不仅更容易执行,而且天然带有校验机制——你可以让 AI 在生成完成后检查自己是否满足了触发条件。

6.4 第四步:设计日志与自我检查机制

AGENTS.md 的配置工作流里,我加了一项"自检提示":

## 工作流指引 在完成代码改动后,请依次检查以下项目(如适用): - [ ] 是否有 SQL 直接写在 service 层?(应通过 repository) - [ ] 接口返回格式是否符合统一包装结构? - [ ] 是否处理了异常路径,而不仅仅是正常路径? - [ ] 是否补充了对应的单元测试? 如上述任何一项不符合,请先修正再输出。

这条规则的意义在于:把"输出代码"这个单一动作,拆成了"生成代码 → 对照约束自查 → 修正 → 输出"的流程。AI 编码工具大多数都支持让模型在产出后自我纠错,但这需要配置里明确写出来,否则模型的默认行为是"尽力一次性生成",不会回头检查。

6.5 第五步:并行维护一份人类可读的说明

AGENTS.md 是给 AI 看的,但团队里的开发者也得理解规则。很多规则不是 AI 需要遵守,而是人需要通过 AI 的反馈来学习项目规范。我建议在 docs/ 下维护一份简短的"AI 协作约定说明",讲清楚项目配置了什么规则、为什么、AI 违反时如何处理。

这份说明不需要很长,三五百字即可。它的作用是在新人加入、或团队 review AI 产出时,让人能快速理解"AI 为什么这么写",而不是看到 AI 代码里出现了奇怪的模式就一脸困惑。

7. 常见问题与排查技巧实录

使用 AGENTS.md 的过程中,几乎每个团队都会碰到相似的问题。这里记录我经历的典型故障和排查路径,按出现频率排序。

7.1 AI 完全没有读取 AGENTS.md

症状:不管配置写得多完整,AI 生成的代码还是老样子。

排查步骤:

  1. 确认文件名和位置:必须是项目根目录下的 AGENTS.md,有些工具放在子目录是无效的。
  2. 确认工具版本:较老版本可能不支持 AGENTS.md,需要升级或使用兼容配置。
  3. 确认工具偏好:部分编程助手优先读取自己的专属文件,如果你的工具偏好 CLAUDE.md,要在该文件里指向 AGENTS.md。
  4. 主动询问验证:直接问 AI"根据项目配置,你对数据库访问有什么要求?"如果回答为空,说明加载失败。

说实话,这一步最常见的原因是用户把文件放在了子目录或改了文件名,很多 AI 工具目前只支持根目录约定名。还有一部分是配置编辑器插件自动生成的 .mcp.json 或 .cursorrules 干扰了行为,导致工具没按预期读取 AGENTS.md。

7.2 规则 "被看见但不被遵守"

症状:AI 能复述配置内容,但生成代码时依然违反。

这类问题多半是规则语言抽象度太高。把"保持代码整洁""遵循良好设计"这类废话换成具体检查项,解决率非常高。

具体手法:把抽象规则拆成可验证的行为指令。比如不写"注意事务一致性",改写为"所有涉及多表更新的操作,必须使用 @transaction 装饰器或者 with db.transaction(): 包裹"。

另外,单条规则不要超过一句话。长规则最好拆成多条短规则,每条聚焦一件事。模型的注意力机制对"短促明确的指令"响应远高于"长段落劝告"。

7.3 配置变更后,旧会话仍按旧规则运行

AGENTS.md 在会话建立时被加载,如果你的编程助手是长驻会话模式(比如某些 IDE 插件保持长期对话上下文),修改配置后当前会话可能不会自动刷新。

解决办法:新开会话测试配置变更。如果你必须沿用当前会话,可以手动提示"请重新加载项目根目录下的 AGENTS.md 配置"来触发重读。大多数情况下,新会话会稳定加载最新配置。

从工程管理角度,我建议每次 AGENTS.md 变更后,团队约定新开会话再让 AI 改代码。旧会话继续用,相当于拿旧地图开新路,配置更新的价值就大打折扣了。

7.4 规则冲突:本地指令覆盖了全局约束

有时你会遇到"AI 宁可违反 AGENTS.md,也遵守用户当前会话里的一句随口指令"的情况。比如你随口说"快速改一下,别管那么多了",结果 AI 绕过了安全约束。

这不是配置的问题,而是配置里缺少"最高优先级"声明。我在 AGENTS.md 的头部加了固定片段:

> 最高优先级约束:除非用户明确要求并解释理由,以下规则不可被覆盖。 > 1. 禁止输出或记录用户真实 token / 密码。 > 2. 禁止绕过 repository 层直接修改数据库。 > 3. 禁止修改公共接口签名而不同步所有调用方。

加了这一段之后,"随便写写"这类模糊放松指令很难再突破硬约束。这也算间接帮用户守住了一些安全底线,尤其是涉敏感数据的项目。

7.5 配置膨胀:AGENTS.md 越来越长,AI 越来越"迟钝"

配置不是越多越好。我见过有人把 AGENTS.md 写到八千字甚至一万字,结果 AI 每次加载都消耗大量上下文,且长文档中关键约束反而容易被稀释。

我的配置维护标准是:超过 400 行的 AGENTS.md 必须拆。拆的方法有两种:

  • 把可独立存在的内容移到 docs/ 目录,在 AGENTS.md 里写一句"数据库 Schema 说明见 docs/database.md,仅在涉及相关改动时阅读"。
  • 启用工具的"按需检索"能力,让 AI 在需要时检索子文档,而不是一次性加载全部内容。

实测下来,500 行以内的 AGENTS.md + 按需检索子文档,是当前体验最好的组合。再往上堆,投入产出比快速下降。

7.6 团队成员各改各的,配置发生"分叉"

多人协作时,A 同学在 AGENTS.md 里加了"前端禁用 any",B 同学在本地分支把它删掉了,结果 AI 行为在团队内不一致。

解决办法很简单:把 AGENTS.md 纳入 code review 流程,任何变更必须走 MR 合入,不允许在本地长期停留。同时,在 CI 里加一个 lint 脚本检查 AGENTS.md 是否满足基本格式要求(比如是否存在"禁止""必须"这类关键约束词)。

可能有人觉得这个做法有点重,但经历过一次"团队 AI 行为分叉导致返工"你就明白了。规则文件也是代码,必须有变更管理和审查,否则它带来的混乱比没有规则还可怕。

8. AGENTS.md 之外:正在发生的范式迁移

如果说 AGENTS.md 是这套记忆工程的"配置文件"层,那它背后真正的范式转换是:AI 编程从"上下文无关的模型调用"变成了"上下文可编程的工程系统"。这个迁移还在进行中,有几个方向值得关注。

8.1 从"规则文件"到"规则自动化生成"

现在 AGENTS.md 还主要靠人来写,但很快会出现第一个自动化拐点:用 AI 分析项目的历史提交记录、代码结构和团队 review 意见,自动生成一份初始的 AGENTS.md 草案。

我在一个实验项目中试过:给模型喂了项目最近 200 条 commit message 和 50 条 code review 评论,让它总结"这个项目里反复出现的修改类型和问题模式"。生成的草案里准确命中了"事务处理薄弱""时间格式混用""接口返回结构不一致"三个高频痛点,跟我在人工梳理时发现的问题重合度相当高。

这背后的逻辑是:项目的行为规律藏在历史里,而 AGENTS.md 本质上是对"项目行为规律"的显式编码。既然规律可以从历史数据中学出来,那么规则生成必然走向自动化。将来的 AGENTS.md 不是人写的,而是"AI 从项目里提炼 + 人工审校确认"的产物。

8.2 Memory 的"运行时化":不只是静态文件

目前的 AGENTS.md 是静态文件,加载后就固定不变。但工程记忆的终极形态应该是"动态运行时":AI 在执行任务时,可以写回自己的认知,更新项目状态。

比如任务完成后,AI 自动在 AGENTS.md 的 changelog 区追加一条"已确认模块 X 的 v2 版本迁移完成,不再兼容 v1 接口"。这样下一次会话的 AI 就知道现状,不需要重新从代码里推断。更进一步,工具可以支持 AI 在会话中"修改自己的记忆文件",实现记忆的闭环更新。

这个方向类似 fine-tuning 和 RAG 之外的第三条路:不是改模型权重,也不是外部知识检索,而是"给模型一张可以持续更新的便签纸"。目前主流的编程助手已经开始实验类似机制,比如某些工具会在会话中记录用户的偏好并写回配置。这个能力值得关注,但目前还远未成熟,静态文件仍然是更可靠的基座。

8.3 从"单文件约定"到"全局上下文工作区"

再往前看,单文件 AGENTS.md 只是起点。一个项目的 AI 编程上下文会扩展到多个文件、多种来源:数据库 Schema、CI 配置、部署文档、测试快照、行为规范。这些信息分布在仓库的不同角落,理想的方案是让 AI 在需要时按需检索这些资源,而 AGENTS.md 则扮演"索引"和"规则中心"的角色。

也就是说,AGENTS.md 未来更像一个"入口文件",它不承载所有信息,而告诉 AI"什么信息在哪里、什么时候该读、什么规则永远生效"。这跟我前面建议的"500 行封顶 + 按需检索"的方向一致,只是目前需要手工配置,未来工具会自动编排。

8.4 团队协作层面的"配置即接口"

最后想提一个更宏观的变化。传统的软件工程里有"接口即契约"的说法,而在 AI 编程时代,AGENTS.md 正在成为一种新的"人机契约"。它定义的不是模块之间的接口,而是人类开发者和 AI 助手之间的接口:哪些事 AI 可以自主做、哪些必须请示、什么风格必须遵守、什么边界不可逾越。

一旦接受了这个角度,你就会发现,AGENTS.md 的编写和版本管理不应该由某个开发者随手维护,而应该成为团队工程实践的一部分。它跟 API 文档同等重要,跟 CI 配置同等需要 review,跟安全红线同等需要敬畏。坦率地说,目前大多数团队还没有完全意识到这一点,把 AGENTS.md 当成"给 AI 看的说明文档"而不是"人机协作的技术契约"。这正是早期参与者可以建立优势的地方。

9. 收尾:踩了无数次坑之后,我留下的最终建议

如果让我把整个记忆工程的实践压缩成几句话,大概是这样:

AGENTS.md 本质上解决的是"信任"问题。无状态模型让人无法信任,因为你不知道它这次会记住什么、忘记什么;而一份好的配置把规则摆在明面上,让 AI 的行为可预期、可审计、可纠偏。它不保证 AI 一定对,但它保证 AI 的错是可识别的——这已经比"黑盒碰运气"好了一大截。

关于具体建议,第一,从项目实际出发,先盘项目里 AI 最容易犯的错,再写规则,别照抄网上的模板。第二,规则要短、要具体、要有条件触发,抽象表述的价值很低。第三,把 AGENTS.md 纳入版本管理和 code review,它是工程资产,不是个人笔记。第四,每条规则都要"可验证",让 AI 能对照自查,否则等于没写。

最后分享一个小技巧:每次从零开始接一个别人写的仓库时,先让 AI 通读项目并草拟一份 AGENTS.md,然后你只做一件事——把其中"看起来像项目百科"的内容全部删掉,只留下"直接影响代码怎么写"的条目。这个动作做完,你对项目的理解、AI 后续的表现,都会上一个台阶。这套方法我已经在多个项目里验证过,推荐你也试试。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进