ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

项目知识:给 Agent 的文档,怎么反而拖累了 Agent——从 AGENTS.md 到 CONTEXT.md 的上下文瘦身实践

项目知识:给 Agent 的文档,怎么反而拖累了 Agent——从 AGENTS.md 到 CONTEXT.md 的上下文瘦身实践 1. 从 AGENTS.md 越写越厚说起Agent 上下文膨胀的真实代价如果你正在维护一个用 Agent 写代码的仓库大概率经历过这个循环一开始 AGENTS.md 只有二十行写着「用 pnpm 不用 npm」「提交信息用 conventional commits」。三个月后它变成八百行里面塞了目录结构说明、命名规范、历史决策、示例代码、踩坑记录。再后来你发现 Agent 开始犯低级错误——明明文档里写了「不要直接改 generated 目录」它还是改了。问题不在文档写得不好而在于这份文档怎么进入 Agent 这一轮的上下文。Agent 的上下文窗口是有限的注意力预算一份两千行的规则全量塞进去真正和当前任务相关的三条被淹在噪音里。更糟的是你上周改了约定Agent 还按上上周的版本行事因为旧内容还躺在某个没被清理的 CLAUDE.md 里。我试过在一个中型前端仓库里做对比把 1200 行的 AGENTS.md 全量常驻和拆成「常驻 80 行规则 按需加载技能」两种方式跑同一批任务。前者的表现是 Agent 频繁忽略命名约定、重复问已经写过的目录结构后者在同样的任务上规则命中率明显更高因为它每次只看到和当前动作相关的那几条。这就是「上下文瘦身」要解决的核心问题什么时候进、进多少、进哪些。它不是写作问题是工程问题。文档分层、索引化、流程化三件事分别对应「量」「找得到」「记得用」。本文会以一个真实仓库为例拆解从 AGENTS.md 到 CONTEXT.md 的分层策略给出可复制的目录结构和 AGENTS.md 模板并演示用统一 Key/API 通道 TaoToken 跑通一次上下文加载对比验证。适合正在用 Claude Code、Cline、Codex 这类工具做长期项目、并且已经被文档膨胀困扰的开发者。先说结论文档本身没错写文档也没错。错的是它没有分层没有索引没有和 Agent 的执行流程绑定。下面按三层来拆。2. 前置准备用 TaoToken 统一 Key/API 通道跑通 Agent 上下文验证要做上下文加载对比你需要一个能稳定调用模型的通道。这里用 TaoToken 作为统一入口原因是它把模型对话、Coding Plan、API Keys 放在同一个控制台里切换模型不用改一堆环境变量做对比实验时省事。TaoToken 是什么一个面向开发者的模型 API 聚合通道提供兼容 OpenAI 风格的接口支持在控制台里管理 Key、查看用量、切换模型。适合谁需要在一个项目里反复调用不同模型做验证、又不想为每个模型单独配一套凭证的开发者。前置动作只有三步都很短第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。控制台里能看到模型对话、Coding Plan、API Keys 几个入口。第二步进入 API Keys 页面创建一个 Key。地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建后立刻复制页面刷新后不再完整显示。第三步确认你要用的模型 ID。可以在模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 里先手动问一句确认通道正常再回到代码里配。这里要强调一个容易踩的坑Base URL 和 Key 是两件事。Base URL 统一用https://taotoken.net/api不要加 UTM 参数也不要自己拼/v1之外的路径。Key 放在环境变量里不要硬编码进仓库。如果你打算长期跑 Agent 编码任务可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它更适合高频、长会话的场景普通验证用按量 Key 就够了。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到参数不确定时先查这里比在群里问快。准备好通道后我们进入正题文档怎么分层。3. 可复制配置AGENTS.md 分层目录结构与模板这一节给可直接抄的结构。核心思路是把「常驻」和「按需」分开把「规则」和「背景」分开把「分散存储」和「集中索引」分开。先看目录结构。假设你的仓库根目录叫my-appmy-app/ ├── AGENTS.md # 常驻只放能改变 Agent 行为的硬规则目标 100 行 ├── CLAUDE.md # 如果同时用 Claude Code指向 AGENTS.md不重复内容 ├── docs/ │ ├── CONTEXT.md # 领域语言术语的权威定义全项目唯一 │ ├── adr/ │ │ ├── README.md # ADR 索引一行一条编号 标题 结论 │ │ ├── 0001-use-pnpm.md │ │ ├── 0007-order-vs-request.md │ │ └── 0009-supersede-0007.md │ └── background/ │ ├── architecture.md # 长背景、历史、示例Agent 默认不读 │ └── onboarding.md └── .agents/ └── skills/ └── project-knowledge/ └── SKILL.md # 按需触发的技能正文只放规则 指针关键点AGENTS.md是常驻的必须短。docs/background/里的东西默认不进上下文只在需要时通过指针加载。docs/CONTEXT.md和docs/adr/是权威来源其他地方引用它们不复制内容。下面是一份可直接用的 AGENTS.md 模板控制在 80 行以内# AGENTS.md ## 运行规则必须遵守 - 包管理器用 pnpm禁止 npm / yarn。 - 提交信息用 conventional commitsfeat / fix / docs / refactor / test / chore。 - 禁止直接修改 src/generated/ 下的任何文件改 schema 后重新生成。 - 新增依赖前先确认 package.json 里没有等价库。 - 所有对外函数必须有显式返回类型。 ## 命名约定 - 领域术语以 docs/CONTEXT.md 为准不要自造同义词。 - 组件文件用 PascalCase工具函数用 camelCase。 ## 上下文指针需要时再读 - 架构背景与历史决策docs/background/architecture.md - 领域术语定义docs/CONTEXT.md - 架构决策索引docs/adr/README.md - 完整目录说明docs/background/onboarding.md ## 完成判据 一个任务算完成必须满足 1. 测试通过 2. 新术语已沉淀进 docs/CONTEXT.md 3. 够格的架构决策已记为 ADR 并更新索引。注意最后一段「完成判据」。这是把文档维护钉进流程的关键——否则 Agent 绿了测试就冲下一个功能学到的东西转头就丢。如果你同时用 Claude CodeCLAUDE.md不要重复内容只写一行# CLAUDE.md 规则与上下文指针见 AGENTS.md本文件不重复维护。这样做的收益很直接常驻上下文从上千行降到几十行Agent 的注意力集中在真正影响动作的规则上。背景和术语按需加载不占常驻预算。CONTEXT.md 的格式建议极简一个术语一段# CONTEXT ## order 用户提交的购买意图包含商品与数量。不要与 request 混用request 专指 HTTP 请求对象。 ## request HTTP 请求对象。领域层的购买意图一律叫 order。ADR 索引docs/adr/README.md一行一条# ADR 索引 - 0001 使用 pnpm 作为包管理器 - 0007 领域层用 order 而非 request 表示购买意图 - 0009 推翻 0007统一改用 purchase-intentsuperseded by 0009写新决策前先扫这一屏命中相关旧决策就推翻它而不是并列新增。分散利于写索引利于找两者都要。4. 验证请求跑一次上下文加载对比看 Agent 是否真的变准配置写完了得验证。这一节用 TaoToken 的 API 跑一次对比确认「瘦身后」的上下文确实让 Agent 表现更好。先配环境变量。不要硬编码 Keyexport TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后写一个最小验证脚本用 curl 直接打模型对话接口把两种上下文分别喂进去看模型对同一个问题的回答差异。这里用curl是为了让你看清请求体结构curl -s $TAOTOKEN_BASE_URL/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [ {role: system, content: 你是项目助手严格按给定规则回答。}, {role: user, content: 我要新增一个购买流程的接口函数应该叫什么} ] }第一次跑system 里塞全量 1200 行 AGENTS.md。第二次跑system 里只放瘦身后的 80 行规则 一行指针「领域术语见 docs/CONTEXT.md其中 order 表示购买意图」。对比结果通常是这样全量版本里模型可能回答createRequest或addPurchase因为它被大量无关规则稀释没抓住命名约定瘦身版本里模型更稳定地回答createOrder因为规则集中、术语明确。如果你用 Python等价写法import os, requests resp requests.post( f{os.environ[TAOTOKEN_BASE_URL]}/v1/chat/completions, headers{Authorization: fBearer {os.environ[TAOTOKEN_API_KEY]}}, json{ model: 你的模型ID, messages: [ {role: system, content: open(AGENTS.md).read()}, {role: user, content: 新增购买流程接口函数叫什么}, ], }, timeout60, ) print(resp.json()[choices][0][message][content])成功的结果长这样返回 JSON 里有choices[0].message.content内容是模型按规则给出的命名建议。如果返回里没有choices说明请求体或模型 ID 有问题下一节专门讲。验证时建议固定同一个模型 ID、同一个 prompt只改 system 内容。变量控制住结论才可信。跑三到五次取稳定表现单次结果有随机性。这一步做完你手里就有了「瘦身前 vs 瘦身后」的真实对比数据而不是凭感觉说「好像变好了」。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节按真实报错来。做上下文验证时最容易卡在通道和配置上而不是文档本身。401 Unauthorized。最常见原因是 Key 没生效或环境变量没导出。检查顺序echo $TAOTOKEN_API_KEY是否为空Key 是否在 API Keys 页面被删除请求头是不是Authorization: Bearer sk-xxx少个空格都会 401。如果 Key 刚创建等几秒再试。local proxy failed / connection refused。这类报错通常出现在你本地配了某个代理工具、但工具没启动或端口变了。先确认TAOTOKEN_BASE_URL是https://taotoken.net/api没有多余路径再确认本机没有残留的HTTP_PROXY/HTTPS_PROXY环境变量指向一个不存在的端口。清掉再试unset HTTP_PROXY HTTPS_PROXY ALL_PROXYreading choices of undefined。这是典型的响应结构不符合预期。原因通常是模型 ID 写错接口返回了错误对象而不是正常响应或者你把 Base URL 拼成了https://taotoken.net/api/v1/v1。正确做法是 Base URL 只到/api路径里的/v1/chat/completions由 SDK 或你手动补。打印完整响应体再定位print(resp.status_code, resp.text)OAuth 相关报错。如果你用的是 Claude Code 这类工具它可能走 OAuth 登录而不是 API Key。混用两种认证方式会报错。要么统一用 API Key 配ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY要么统一走 OAuth不要一半一半。用 API Key 时Base URL 填https://taotoken.net/apiKey 填 TaoToken 控制台创建的 Key模型 ID 填控制台里确认过的那个。Codex 的 auth.json。如果你用 Codex认证信息在~/.codex/auth.json。要接 TaoToken需要保证三件套一致Base URL 为https://taotoken.net/apiKey 为 TaoToken 的 KeyModel ID 为控制台确认的模型。三者任一不对都会表现为认证失败或模型不存在。改完 auth.json 后重启 Codex 进程配置不会热加载。Cline / MCP 场景。Cline 里配自定义 API 时同样三件套Base URL、API Key、Model ID。MCP 服务器如果直连生产库不要在这个验证流程里开容易误操作。验证阶段只连本地或测试环境。排查顺序建议固定先看状态码再看响应体再看环境变量最后看模型 ID。大部分问题在前两步就能定位。6. 把知识组装进正确的上下文长期编码用 Coding Plan 收尾三层做完其实做的是同一件事把项目知识在正确的时候、以正确的量、组装进正确的上下文。省 token 是控制「量」索引是解决「找得到」流程地图是保证「记得用、记得更新」。但它们保证不了的是写进去的东西对不对。一条过期的规则同步得再及时也还是一条烂规则一个索引再整齐也拦不住你把一个错误决策记成 ADR。工具能让知识在正确的位置被正确取用至于那份知识本身值不值得信仍由人来判断。如果你要把这套流程长期跑下去尤其是每天都有 Agent 编码任务建议把通道固定下来。TaoToken 的 Coding Plan 适合这种高频、长会话的场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 配置细节以文档为准。需要新建或轮换 Key 时去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。想先手动验证模型行为用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 最快。最后一个实操建议把「重新运行 project-knowledge 同步」写进你的任务完成清单。每次改完 AGENTS.md 或新增 ADR跑一次同步让按需技能和索引跟上。文档瘦身不是一次性动作是每次提交都要维护的习惯。
返回列表