这篇学完你能回答什么
- 你平时怎么用 AI 写代码?举一个省了一天的例子和一个翻车的例子。
- 给 AI 编程工具喂上下文有什么讲究?为什么把整个仓库塞进去反而更差?
- AI 已经这么能写代码了,你的价值是什么?
从一个真实故障讲起
周五下午,一个四十万行的 monorepo。任务不复杂:给支付回调加幂等,防止上游重推导致重复扣款。
工程师的做法很符合直觉——给得越全,AI 越不会漏。他把整个 payment/ 连同 common/、gateway/ 一起贴进对话,粗算十二万 token,然后写:「给支付回调加幂等,Redis SETNX,key 用商户单号。」
AI 给了一份挑不出毛病的 diff:加了 IdempotencyGuard,注入 PaymentCallbackHandler.handle() 首行,补了三个单测。评审的人扫一眼,逻辑对、有测试,合了。
周一早上,重复扣款照旧。
排查两小时才看清:PaymentCallbackHandler 三个月前就被拆走了,线上真正在跑的是 PaymentCallbackV2Handler,老的只留在灰度 0% 的旧路径上兜底,谁也没删。十二万 token 里新旧两套实现都在、长得几乎一样,没有任何一行代码写着「我才是在跑的那个」——模型在两个候选之间挑了名字更「正统」的。
第二次换了个做法:只给三个文件——V2 的实现、它的路由配置、一份两百字现状说明(哪个在跑、灰度多少、上次相关事故是什么),不到两千 token。AI 一次就改对了,还反问:「V1 还在兜底路径上的话,只改 V2 会留窗口,要不要一起加?」
这不是运气。2026 年 5 月的 SWE Context Bench(1476 个真实修复任务、51 仓库、9 语言)测的正是这件事:给模型一份平均 217 token 的精炼摘要,解决率从 26.26% 升到 34.34%;给它平均 25,633 token 的完整探索轨迹,只有 27.27%;让它自由地不受限检索,26.26%——等于没提升,成本却多花 27.3%。
一百倍 token,负收益——这就是本章的起点。
把三个目录全贴上
粗算十二万 token,指望模型自己筛
新旧两套都在里面断点
没有一行代码写着「我才是在跑的那个」
挑了名字更正统的那个
改的是灰度 0% 的旧路径,线上跑的是 V2
周一重复扣款照旧
评审只看逻辑对不对,看不出改错了对象
换成三个文件重来
V2 实现 + 路由配置 + 两百字现状说明
核心概念:先打比方,再给定义
比方:上下文不是资料袋,是工位
想象你给一个技术很好、但今天第一天来的外包同事派活。
第一种给法:把近三年所有文档打印出来堆满他的工位,说「都在这儿了,自己找」。他技术再好,也得先花半天分辨哪份是现行版本、哪份是废弃草稿——而且他判断错了你不会知道,因为他会很自信地按错的那份干。
第二种给法:桌上三份文件加一张便签:「这个模块上周刚出过事,注意第 47 行的重试逻辑;旧版在 legacy/ 下,不跑了,别动。」信息量小得多,但信噪比高得多。模型和这位新同事一样,没法从「文件存在」推断出「文件重要」——你不说哪个在跑,它就只能猜。
定义
- 上下文预算(context budget)——一次请求里,你实际能让模型「用上」的信息是有限的,而且远小于窗口标称的容量。装进去的东西之间会互相竞争注意力:多塞一份废弃代码,不是「多了一份参考」,而是「给正确答案多加了一个竞争者」。
- 上下文腐化(context rot)——上下文越长模型表现非均匀地下降。注意「非均匀」:不是线性变笨,而是在某些位置、某些任务上断崖式失效。一份测了 18 个模型的研究还发现:把干扰材料打乱顺序,模型反而比材料逻辑连贯时更准——连贯的错误材料更像正确答案。
- 代理式检索(agentic search)——不预先建索引,让模型自己
grep、读文件、顺引用爬,边找边判断。相对的是索引式检索:预先把仓库切块做 embedding,查询时向量召回。
近三年文档全打印出来,堆满他的工位
他得先花半天分辨哪份现行、哪份是废弃草稿;判断错了你还不知道,他会很自信地按错的那份干
上下文越长,表现非均匀地下降
不是线性变笨,是在某些位置、某些任务上断崖式失效。测了 18 个模型的研究还发现:把干扰材料打乱顺序,模型反而比材料逻辑连贯时更准 —— 连贯的错误材料更像正确答案
「上周刚出过事,注意第 47 行」
还写着「旧版在 legacy/ 下,不跑了,别动」—— 信息量小得多,信噪比高得多,他不用猜
能让它用上的,远小于窗口标称
装进去的东西之间会互相竞争注意力:多塞一份废弃代码,不是「多了一份参考」,而是「给正确答案多加了一个竞争者」
grep、读文件、顺引用爬,边找边判断;对面的索引式检索是先把仓库切块做 embedding,查询时向量召回。这两条路线争的压根不是同一个指标 —— 下一张图的表里摊开。原理拆解
| 路线 | 主张与代价 | 什么时候不该用 |
|---|---|---|
| 索引式 · 先切块做 embedding | 召回率:问答准确率平均高 12.5%(不同模型 6.5%–23.5%),千文件以上大仓代码留存率 +2.6%。代价:索引陈旧、代码要交出去做向量化 | 仓库高频变动、代码不能出网、只需要改一两个已知文件 |
| 代理式 · 模型自己 grep | 新鲜度:embedding 流水线跟不上活跃团队的提交速度,查到的是几小时甚至几周前的快照。代价:读取类操作占总 token 的 76.1%、跨语义召回差 | 大仓里做跨模块语义搜索、你自己也说不清关键词、成本敏感 |
上下文分四层,腐化速度不同:① 系统提示 + 工具定义(几乎不变,缓存的地基)② 规则文件(周级变化)③ 会话取回的内容(每次都变,你能调控的)④ 对话历史(单调增长,最脏)。故障里那十二万 token 全在第 3 层,正解是把「V2 才是在跑的那个」提到第 2 层。
静态在前,动态在后。打穿缓存的三个写法都长得人畜无害:静态前缀里放精确到秒的时间戳(命中率恒为 0)、工具定义顺序不确定、中途改工具参数。反直觉的是:改仓库里的文件不失效;中途改规则文件不失效但也不生效,得重开会话;worktree 之间互不命中缓存。
一、工具形态:三分法已经作废,换三根轴
2025 年流行的分法是「终端类 / IDE 类 / 云端类」。截至 2026-08 这个分法已经不成立——头部产品全部三态齐备,且官方明说共用同一套 agent harness:同一个引擎,套 CLI、套 IDE 插件、套云端会话,会话还能在本地与云之间来回推拉。
真正还有工程后果的,是下面三根轴:
轴 ① 会话在哪跑
本地进程 ── 厂商云 ── 自托管
↑ 决定:代码出不出你的网、合规怎么过、能不能接内网服务
轴 ② 能否异步离开
同步陪跑 ────────── 异步派活、回来收
↑ 决定:你必须先写下「做完的标准是什么」,否则回来收的是一堆无法判断的 diff
轴 ③ 编排单位
单会话 ── 子 agent ── agent 队伍 ── 平台级派活台
↑ 决定:成本量级。多会话协作的 token 消耗是线性叠加的,不是共享的这三根轴各自逼出一个必须由人回答的问题:合规边界、验收标准、预算。工具形态怎么变,这三个问题都在。
二、上下文从哪来:四层来源,优先级不同,腐化速度也不同
┌─ 第 1 层 系统提示 + 工具定义 全局共享,几乎不变 ← 缓存的地基 ├─ 第 2 层 规则文件(项目记忆) 项目内共享,周级变化 ├─ 第 3 层 会话取回的内容 本次任务相关,每次都变 ← 你真正能调控的 └─ 第 4 层 对话历史 单调增长,最脏
第 3 层是主战场。故障案例里的十二万 token 全在第 3 层;正确做法是把最关键的那句「V2 才是在跑的那个」上提到第 2 层写进规则文件,让它每次都在,而不是指望模型每次从代码里重新推断。
这里有一条容易被忽略的推论:规则文件是用来放「推不出来的事实」的,不是用来放「读一眼代码就知道的事实」的。官方给的检验方法很朴素:逐行问自己「删掉这行,模型会不会犯错?不会就删」。三家大厂给的长度上限数字不同(见下节表格),但都附了同一句警告:臃肿的规则文件会让模型忽略你真正的指令。
三、两条检索路线:不是谁对谁错,是两个不同的评价函数
索引式:预先 embedding 全仓 → 查询时向量召回 → 塞进上下文。 代理式:不建索引 → 模型自己 grep、读文件、顺引用爬。
两边的官方理由,2026 年都摆到台面上了,但它们根本没在同一个指标上争论:
| 索引式 | 代理式 | |
|---|---|---|
| 主张 | 召回率:语义检索比纯 grep 的问答准确率平均高 12.5%(不同模型 6.5%–23.5%);一千文件以上的大仓,代码留存率 +2.6%;关掉之后「不满意的追问」增加 2.2% | 新鲜度:embedding 流水线跟不上活跃团队的提交速度,开发者查询时拿到的是几小时甚至几周前的仓库快照 |
| 代价 | 索引陈旧、要把代码交出去做向量化、大仓索引与增量更新成本高 | token 烧得多(agent 工作流里读取类操作占总 token 的 76.1%)、跨语义召回差(找「处理超时的地方」这类没有共同关键词的需求很吃力) |
| 什么时候不该用 | 仓库高频变动、代码不能出网、只需要改一两个已知文件 | 大仓里做「跨模块语义搜索」、你自己也说不清关键词、成本敏感 |
没有第三方在同一 benchmark 上做过「纯 grep vs 纯 embedding」的公开对照实验,任何一方声称「被证明更好」都不成立。产品层面两条路线已在合流:代理式那边在做更快的 grep 原语,索引式那边配了只回摘要的探索子 agent。
四、提示缓存(prompt caching):静态在前,动态在后
编程 agent 每一轮都在重发同一个巨大前缀(系统提示 + 工具定义 + 规则文件 + 之前所有轮次),服务端把这段公共前缀缓存住就不用重算。所以命中率不是省钱技巧,是成本结构本身。原则一句话:
static content first ──────────────────► dynamic content last 系统提示 · 工具定义 规则文件 会话上下文 本轮消息 (全局共享) (项目内) (会话内) (每轮变)
打穿缓存的三个经典写法都长得人畜无害:静态系统提示里放精确到秒的时间戳(命中率恒为 0)、工具定义顺序不确定(比如从字典遍历生成)、中途改工具参数或接断外部工具服务。反过来,有几条「不失效」是反直觉的,也是最好的分水岭:改仓库里的文件不会失效(文件内容不在前缀里,是模型现读的);中途修改规则文件不会失效——但也不会生效,得等清空上下文或重启;回滚到之前的检查点不会失效(回到的是已缓存的前缀)。
还有一条几乎没人提:缓存作用域绑定机器和工作目录。系统提示里嵌了当前路径、平台、shell。这意味着用 git worktree 并行开三个会话,三个 worktree 之间互不命中缓存——并行省的是你的时间,花的是钱。
工程实践(截至 2026-08)
下表是本章时效性最强的部分,半年后需重核;正文的机制不受它影响。
| 产品 | 会话在哪跑 | 异步能力 | 编排单位 | 规则文件 |
|---|---|---|---|---|
| Claude Code | 本地 / 厂商云(可来回推拉) | 有(云会话、GitHub Action、代码审查预览版) | 单会话 → 子 agent(默认嵌套 3 层、并发上限 20)→ 实验性 agent 队伍 | CLAUDE.md(官方明说不读 AGENTS.md,靠 import 或软链兼容)、.claude/rules/ 路径级规则、自动记忆 |
| OpenAI Codex | 本地 / 云 | 有(桌面「指挥中心」形态,内置 worktree 并行) | 单线程一件事(官方建议) | AGENTS.md(合并上限 32 KiB,就近目录覆盖上级) |
| GitHub Copilot | 云为主 | 有(coding agent + 跨仓派活台) | 平台级派活 | AGENTS.md / CLAUDE.md / GEMINI.md 都读,另有 .github/copilot-instructions.md;优先级 个人 > 仓库 > 组织 |
| Cursor | 本地 IDE / 云 agent | 有 | 单会话 + 云端子 agent | .cursor/rules(四种触发模式),官方也把 AGENTS.md 列为一等选项 |
| Cline | 本地 | 有(无头 CI、定时任务) | 多 agent 团队 | AGENTS.md 系 |
生态变动(2026 上半年):AGENTS.md 已于 2025-12 与 MCP、goose 一并捐入 Linux 基金会新成立的 Agentic AI Foundation;Cursor 于 2026-08 完成被 SpaceX 收购;Gemini CLI 停服并迁往 Antigravity CLI;Windsurf 更名 Devin Desktop;Roo Code 归档停运。点名产品前,先确认它今天还叫这个名字。
参数经验值
| 项 | 经验值 | 依据 |
|---|---|---|
| 规则文件长度 | < 200 行;内容以「踩过的坑」为主,而非项目介绍 | Anthropic 官方成本文档;2026-07 官方博客要求「把大部分 token 花在 gotchas 上」 |
AGENTS.md 上限 |
32 KiB,超出截断,按目录分层 | OpenAI 官方 |
| 仓库指令 | 不超过 2 页,且不得任务特定 | GitHub 官方 |
| 单次任务给的上下文 | 先试几百 token 的精炼摘要,不行再加,而不是先给全量再删 | SWE Context Bench:217 token 摘要 34.34% > 25,633 token 全轨迹 27.27% |
| 可裁剪比例 | 典型 agent 会话可安全剪掉 23–38% 的 token,解决率掉不到 1pp | SWE-Pruner,成本降 26.8% |
| 成本量级 | 企业部署约 $13/人/活跃日、$150–250/人/月;多 agent 队伍约 7× token,官方建议 3–5 人 | Anthropic 官方文档 |
避坑清单
- 别把「全部」当成「重点」。先给三个文件加两百字现状说明,比先给三十个文件再让模型自己筛更快也更准。
- 把「推不出来的事实」写进规则文件:哪个实现在跑、哪个目录已废弃、哪个测试是不可信的。这类信息模型永远推不出来,而它一旦搞错,后面全错。
- 规则文件要定期删,不是定期加——只增不减是最常见的慢性病,臃肿到一定程度模型会忽略里面的真指令;而且它中途改不当场生效,要重开会话(很多人改完觉得没用,其实是没生效)。
- 别在静态前缀里放会变的东西:时间戳、当前分支名、动态生成的文件清单。
- worktree 并行不共享缓存,开并行会话前先算一下值不值。
- 探索类任务一定要限定范围。没有边界的「调研一下这块」会让 agent 读掉几百个文件撑爆上下文,正确做法是丢给独立上下文的子 agent 只回摘要。但子 agent 不是万金油——官方给的「不该用」边界是:需频繁往返迭代、需多阶段共享上下文、改动很小、在意延迟。
| 产品 | 三根轴上的位置 | 规则文件 |
|---|---|---|
| Claude Code | 本地 / 厂商云可来回推拉;有云会话、GitHub Action、代码审查预览版;单会话 → 子 agent(默认嵌套 3 层、并发上限 20)→ 实验性 agent 队伍 | CLAUDE.md,官方明说不读 AGENTS.md(靠 import 或软链兼容);另有 .claude/rules/ 路径级规则与自动记忆 |
| OpenAI Codex | 本地 / 云;桌面「指挥中心」形态,内置 worktree 并行;编排单位官方建议单线程一件事 | AGENTS.md,合并上限 32 KiB,就近目录覆盖上级 |
| GitHub Copilot | 云为主;coding agent + 跨仓派活台;编排单位是平台级派活 | AGENTS.md / CLAUDE.md / GEMINI.md 都读,另有 .github/copilot-instructions.md;优先级 个人 > 仓库 > 组织 |
| Cursor | 本地 IDE / 云 agent;有异步;单会话 + 云端子 agent | .cursor/rules(四种触发模式),官方也把 AGENTS.md 列为一等选项 |
| Cline | 本地;有异步(无头 CI、定时任务);多 agent 团队 | AGENTS.md 系 |
- 规则文件写什么
- 只放推不出来的事实:哪个实现在跑、哪个目录已废弃、哪个测试不可信 —— 而且要定期删,不是定期加
- 规则文件多长
- < 200 行(Anthropic);
AGENTS.md合并上限 32 KiB 超出截断(OpenAI);仓库指令不超过 2 页(GitHub) - 先给多少上下文
- 先试几百 token 的精炼摘要,不行再加,而不是先给全量再删;典型会话还能安全剪掉 23–38%,解决率掉不到 1pp
- 成本量级
- 企业部署约 $13/人/活跃日、$150–250/人/月;多 agent 队伍约 7× token,官方建议 3–5 人
- 探索类任务
- 必须限定范围,丢给独立上下文的子 agent 只回摘要;但需频繁往返、需多阶段共享上下文、改动很小、在意延迟时不该用
- 生态变动
AGENTS.md已捐入 Linux 基金会;Cursor 被 SpaceX 收购、Gemini CLI 停服 —— 点名前先确认它还叫这名字
面试视角
- 先给一个成功例子省了一天的那次,说清省在哪一步
- 再给一个翻车例子归因到机制,不是「模型不行」
- 补一条因此立的规矩证明你把它变成了纪律,不是运气
- 被往上压时答价值AI 交不出来的三样:判断哪个上下文是对的、定义「做完了」、为后果签字
- 按「终端类 / IDE 类 / 云端类」给工具分类
- 「上下文当然给越全越好」
- 被追问规则文件里有什么,答「项目介绍、技术栈、代码规范」
- 「索引式检索更先进」或反过来「grep 才是正道」
- 「并行开几个 worktree 就能提效」
- 按「会话在哪跑 / 能否异步 / 编排单位」分,知道三分法已合流
- 报得出 217 token 摘要 34.34% 打赢 25,633 token 全轨迹
- 答「哪个模块已废弃、哪个测试不可信、哪次事故的教训」
- 说得出两边争的不是同一个指标:召回率 vs 新鲜度,且无公开对照实验
- 知道 worktree 之间不共享缓存,多 agent 队伍是 7× token
面试官会怎么问
这一章在 2026 年几乎是一面开场必问,形式一般是「你平时怎么用 AI 写代码」。看起来是闲聊,实际上信息密度最高——你答的过程会自动暴露:用的是哪一代工作流、被它坑过没有、有没有形成纪律。后续往两个方向压:往下压细节(「精简到什么程度?依据呢?」),往上压判断(「那你的价值是什么?」)。
答题结构建议
「一个成功例子 + 一个翻车例子 + 一条你因此立下的规矩」——三段,两分钟。
翻车例子是这道题真正的分水岭。只讲成功例子的人,听起来像在念产品宣传页;能讲清楚一次翻车、并且归因到机制(而不是「模型不行」)的人,才是真在用。翻车例子要满足两个条件:它得是你会二次犯的错(说明有普遍性),你得说出你后来怎么改的流程(说明你把它变成了纪律)。
关于「你的价值是什么」,不要答成表忠心(「AI 只是工具,人才是主导」——这是空话)。可落地的回答方式是:指出 AI 交不出来的三样东西。
- 判断哪个上下文是对的。故障案例里模型不是不会写幂等,是不知道哪个 handler 在跑——这类「系统当前的真实状态」只存在于人的脑子和线上,不在代码里。
- 定义「做完了」的标准。异步派活的前提是有可判定的验收标准,写出它是人的活。
- 为后果签字。这条最硬:出了事,被复盘的是人。
分水岭信号
| 只读过 / 只用过 demo | 真做过 |
|---|---|
| 按「终端类 / IDE 类 / 云端类」分工具 | 按「会话在哪跑 / 能否异步 / 编排单位」分,并且知道三分法已经合流 |
| 「上下文当然给越全越好」 | 知道 217 token 摘要打得过 25,633 token 全轨迹;知道读取操作占 agent 总 token 的 76% |
| 「AI 写得不好就把提示词写详细点」 | 知道该提 effort 档位而不是加提示词;知道官方删掉了 80% 的系统提示而编码评测无损 |
| 「规则文件当然写得越全越好」 | 知道 200 行上限、知道臃肿会导致真指令被忽略、知道中途改不生效 |
| 「索引式检索更先进」/「grep 才是正道」 | 能说出两边争的根本不是同一个指标:一边是召回率,一边是新鲜度,而且没有公开对照实验 |
| 「并行开几个 worktree 就能提效」 | 知道 worktree 之间不共享缓存,多 agent 队伍是 7× token |
| 被追问「你的规则文件里现在有什么」,答「项目介绍、技术栈、代码规范」 | 答「哪个模块已废弃、哪个测试不可信、哪次事故的教训」——这些模型推不出来 |
小结与延伸
继续深入
本篇归属第 7 章「AI 编程协作」,去做这一章的题。