给 AI 编程工具喂上下文有什么讲究?为什么整仓塞进去反而更差?
谁在问:头部 AI 公司与大厂二面;面试官一般自己踩过「整仓塞进去」的坑,追问会很细
口语化问法
- 你给 AI 喂上下文的时候有什么讲究?
- 现在窗口都上百万 token 了,为什么不干脆把整个仓库塞进去?
- 一个四十万行的仓库,你怎么让它找到该改的地方?
考察意图
参考答案
60 分答案(及格线)
上下文窗口虽然大,但模型的注意力是有限的,塞得越多、无关内容越多,它越容易被干扰,这就是常说的 context rot——不是线性变笨,而是在某些位置上失效。所以我一般不整仓贴,而是给相关的几个文件,加上一段说明。另外整仓贴的 token 成本也很高,每轮都要重发。
到这一步是及格:说清了「容量 ≠ 有效」,也说清了成本。但它是一段常识陈述,没有可验证的东西,任何读过两篇博客的人都能说。
90 分答案(有生产经验的回答)
90 分要在四个地方长出细节:有数字、分了层、讲了检索路线、护住了缓存。
第一,这件事在编程场景已经有硬数字了。 2026 年的一项评测覆盖 1476 个真实修复任务、51 个仓库、9 种语言,结论很反直觉:给模型一份平均 217 token 的精炼摘要,解决率从 26.26% 升到 34.34%;给它平均 25,633 token 的完整探索轨迹,只有 27.27%;让它不受限地自由检索,26.26%——等于没提升,成本还多花 27.3%。另一项工作从反面印证:把 agent 会话的 token 剪掉 23%–38%,解决率掉不到 1 个百分点,成本降了约 27%,而且读取类操作占了 agent 总 token 的 76%。所以「整仓塞进去更差」不是感觉,是一百倍 token 换负收益。
第二,我把上下文分四层来管,因为它们的变化速度不一样:系统提示与工具定义(几乎不变)→ 项目规则文件(周级变化)→ 本次任务取回的内容(每次都变)→ 对话历史(单调增长)。真正能调控的是第三层,但优化的关键动作是把关键事实从第三层上提到第二层。举个具体的:我们仓里有新旧两套支付回调 handler,长得几乎一样,代码里没有任何一行写着哪个在跑;靠模型每次自己推断就是在掷骰子,把「V2 才是在跑的那个、V1 只在灰度 0% 兜底」写进规则文件,问题就消失了。规则文件是用来放推不出来的事实的,不是用来放读一眼代码就知道的事实的。
第三,大仓里怎么找。 两条路线:预先做全仓 embedding 索引,或者让模型自己 grep、读文件、顺引用爬。要注意的是两边争的根本不是同一个指标——索引派讲召回率(有厂商公布语义检索比纯 grep 的问答准确率平均高 12.5%,千文件以上大仓的代码留存率高 2.6%),代理派讲新鲜度(embedding 流水线跟不上活跃团队的提交,开发者查到的是几小时甚至几周前的快照)。而且没有第三方在同一 benchmark 上做过公开对照,所以谁也没证伪谁。实践里两条路线已经在合流:代理派在做更快的 grep 原语,索引派配了只回摘要的探索子 agent。
第四,别把缓存打穿。 编程 agent 每轮都在重发同一个巨大前缀,命中率不是省钱技巧、是成本结构本身。原则是静态在前、动态在后。
追问链
你说「精简」,精简到什么程度?有可操作的判据吗?
期望给方向不给绝对值:先给几百 token 摘要,不够再加,别先全量再删——前者失败是「它说信息不足」,成本约等于零;后者失败是「它自信地改错了」,成本是一次事故。规则文件有公开上限可引:200 行以内、合并后32 KiB硬截断、「不超过两页且不得任务特定」信号说得出「加法比减法安全」这个方向 → 真在用;只会答「按需给」→ 没有可操作方法规则文件里到底该写什么、不该写什么?
期望只写模型推不出来的事实:哪个实现在跑、哪个目录已废弃、哪个测试不可信、哪次事故的教训。技术栈、目录结构、代码规范读一眼代码就知道,交给 linter。检验法背官方原话:逐行问「删掉这行,模型会不会犯错?不会就删」——臃肿不等于保险,它会挤掉你真正的指令信号答「项目介绍、技术栈、代码规范」→ 写了但没用对;答「哪个模块废弃、哪个测试不可信」并说「要定期删」→ 真在维护大仓里到底该用索引还是 grep?给我一个选型判断。
期望三段式不站队:① 索引式买跨语义召回(「处理超时的地方」这类没有共同关键词的需求),代价是索引陈旧、代码要出网——高频变动、不能出网、只改一两个已知文件时不该用;② 代理式买新鲜度与零维护,代价是烧 token、跨语义召回弱;③ 实践混合:检索定位候选,代理式确认现状信号说得出「两边评价的根本不是同一个指标」→ 真读过双方材料;一句「XX 更先进」→ 站队你说要护住缓存,什么操作会打穿?有反直觉的吗?
期望三类打穿:静态前缀里放精确时间戳(命中率恒为 0)、工具定义顺序不确定、中途改工具参数;切模型、改推理档位同样失效。反直觉的才是分水岭:改仓库文件不失效(文件不在前缀里,是现读的);中途改规则文件不失效也不生效,得重开会话;缓存绑机器与工作目录,多个 worktree 互不共享信号只会说「前缀要固定」→ 背概念;能说出「中途改规则文件不生效」和「worktree 之间不共享缓存」→ 被这两件事坑过AI 编程的 token 账单一个月涨了三倍,怎么查?先砍哪一刀?
期望成本三刀:① 先切输入/输出侧——编程 agent 的账压倒性在输入侧(每轮重发前缀),输出侧异常则是任务变复杂或档位被调高;② 再切侧内:缓存命中率、并行度(队伍 token 约单会话 7 倍)、读取类操作(本就占四分之三);③ 最后才是单价,警惕新模型换了 tokenizer:单价降三成、token 数涨回来。顺序:修缓存 → 砍并行 → 最后动档位信号上来就「换便宜模型」→ 没算过账;主动提「先看缓存命中率」→ 真管过账单
评分要点
- 区分「窗口容量」与「有效注意力」,并说明 context rot 是非均匀衰减而非线性变笨
- 引得出编程场景的具体数字(摘要 vs 完整轨迹的解决率对比,或可裁剪比例)
- 能把上下文分层,并说出优化的关键是把关键事实上提到规则文件
- 说得清规则文件该放「推不出来的事实」,且知道它要定期删
- 谈索引 vs 代理式检索时给三段式(解决什么 / 代价 / 什么时候不该用),不站队
- 知道两条路线争的是不同指标,且没有公开对照实验
- 说得出至少三种打穿缓存的操作,含一条反直觉的
- 成本追问时按成本三刀展开,且先修不影响正确性的那一刀