Appearance
Context 如何选:Selection Signals、Progressive Disclosure 与 JIT
用户一开始规定“不能改 public API”虽然不新,但它是当前任务的长期约束;刚刚产生的一大段无关 debug log 虽然最新,却不应该把这个约束挤出 Context。Context selection 的核心不是“留下更多”,而是在有限窗口里保住当前决策真正依赖的事实。
Context Selection
Selection 决定这一轮 Model Request 的 working set。它通常综合任务阶段、依赖、相关性、时效性、可信度和重建成本,而不是简单截取最近 N 条历史。全历史保留看似保守,实际上只是把筛选负担和噪音转嫁给模型。
工程上应让 selector 输出的不只是内容,还包括选择理由,例如:
text
item = api_constraint
selected_because = hard_dependency
source = user_requirement这样才能在 Context Evaluation 中回答“删掉哪类信息以后成功率下降”,而不是只比较 token 数。
Relevance / Recency / Importance / Dependency
这四类信号承担不同职责:
- Dependency:当前步骤缺了就无法正确执行的前置事实,例如接口约束、上一步 artifact identity;
- Importance:跨多轮仍应保留的长期规则,例如安全策略或用户明确限制;
- Relevance:与当前 query、plan node 或 tool decision 的直接关联;
- Recency:信息有多新,用于处理会变化的状态,但“新”本身不代表“有用”。
真正的 selector 通常是 policy,而不是一个固定排序公式。例如 hard dependency 可以先于所有 recency,冲突信息还需要结合 provenance/freshness 判定,而不是简单取最新一条。
Progressive Disclosure
Progressive Disclosure 解决的是一次暴露多少细节。先提供轻量的目录、metadata、摘要或 capability,让模型确认相关性后再展开正文。Coding Agent 的 glob → grep → read 就是典型路径:先缩小候选文件,再读取真正相关的行,而不是启动时把整个 repository 注入 Context。
这个策略成立的前提是系统保留稳定 reference,并且 Agent 有可靠的 search/read 能力;否则“以后再加载”只是把信息藏起来而无法恢复。
Just-in-Time Context
JIT 解决的是什么时候加载。信息直到某个决策点真正需要时才进入 working set,例如 Planner 选中数据库迁移步骤后才加载 schema,Tool discovery 判断需要 Git 能力后才暴露相关 tool definitions。
因此 Progressive Disclosure 偏向“粒度”,JIT 偏向“时机”。两者通常一起使用,但不是同一个概念。
Failure Mode
为了“信息完整”提前加载所有可能内容
症状: 首次调用就塞入整仓文件、全部 Tool schema、全部 Memory/RAG 候选。
为什么危险: context pollution、成本和 tool confusion 增加,真正相关信息反而被稀释。
处理: 保留 lightweight reference,通过 search/read/tool discovery 按需逐步展开。
源码对照(B 类)
system-prompt-assembly.ts / production-turn-input-projection.ts 可作为“Runtime source → model-visible projection”的源码练习。 - 源码导航:Grok Bot Source Map
自测
- 仓库有 500 个文件,但当前只在修认证逻辑。Progressive Disclosure 应先给模型什么,什么时候再加载更多内容?
- 一条信息很新但与当前步骤无关,另一条较旧却是未完成任务的依赖。relevance、recency、dependency 应如何权衡?