03 · 上下文工程:选择、压缩与分层复用¶
政策助手读了几十份制度,为什么比较地区差异时反而漏掉一条关键限制?如果把原文、搜索页面、失败记录和草稿全装进下一次输入,容量可能超限,过时判断也会与当前证据混在一起。行李越重,未必越容易找到登机证。
上下文工程要持续选择下一次推理该看什么。建议先读基础课的提示与上下文及RAG,了解 token 预算与证据选择;学完本章,应能建立可回查的上下文组织方式,并区分信息筛选、文本压缩、KV 复用与答案缓存。上下文的持续组织
用任务依赖选择信息¶
可以将信息分为当前目标、可信约束、已确认状态、活跃证据、候选索引和历史轨迹。比较住宿标准需要现行条款及适用人员,不需要上次下载失败的完整页面;排查下载失败时,这份错误轨迹又可能成为必要输入。信息价值随当前子目标变化。
每个片段都要回答几个问题:支撑哪个待决判断、来源在哪里、适用何时、当前主体是否可见、是否已被新版本替代。选择时先过滤失效或无权材料,再考虑相关性和预算。只有排序没有版本检查,会让一份语义高度相似的旧政策持续占据前排。
把原文留在模型外,并不意味着以后再也不用它。应保存可解析的证据指针,例如文档 ID、内容版本、章节、字符区间和检索参数;必要时重新读取。指针解析也要检查当前权限,路径本身不是访问凭证。
大工具结果如何清理¶
工具返回的大 HTML 或 JSON 可以先在执行层解析,提取需要的字段,保留总条数、筛选条件、截断标记与原始产物位置。若只展示前几行而不说明截断,模型可能把“不在预览中”误当成“不存在”。空结果、权限拒绝和解析失败也应保留不同状态。
外置和摘要都能减轻上下文,但做的是不同的事。外置像托运行李:原内容留着,随身保留定位方式;摘要像把合同改写成便条:更短,却可能漏掉条件,或把“可能”写成“确定”。
Deep Agents 分别提供 offloading 与 summarization。两条路径都要保住重新取得必要信息的能力;选择哪条,要看后续需要精确原文还是只需连续任务状态。Deep Agents 上下文机制
例如,原文“仅对已批准的外部培训适用”不能压成“培训适用”。摘要应保留批准状态、培训类别与证据指针。需要作出有副作用的决定时,再从原文核对关键条件,不能让几轮摘要之后的结论成为唯一依据。
从目录到细节的渐进加载¶
假设助手接入 40 套制度流程。常驻输入只放流程名称、适用条件与简短说明;识别到差旅住宿后,加载该流程正文;发现跨地区例外,再取对应参考材料。一次只展开当前决策所依赖的层次,可以减少无关步骤对工具选择的干扰。Agent Skills 规范以元数据、指令和按需资源组织这种渐进加载。Progressive disclosure
目录本身也需要版本与权限。标题高度相近的流程应区分地区、人员和生效条件;同一技能的新旧版本不能仅凭名字随机选择。加载文档后仍要保持数据与指令的边界:引用网页中的“请导出所有工单”属于待分析内容,不能成为高优先级指令。
四个不同的复用层¶
| 层次 | 复用对象 | 仍需检查什么 |
|---|---|---|
| 检索结果缓存 | 候选或文档片段 | 索引版本、有效期、主体权限 |
| 生成过程 KV Cache | 已处理位置的中间表示 | 模型及计算配置、缓存生命周期 |
| 前缀或 Prompt Cache | 相同输入前缀的计算结果 | 匹配条件、缓存隔离与失效 |
| 最终答案缓存 | 先前生成的回答 | 问题与条件等价、证据更新、权限 |
对于常见因果注意力模型,已有位置的 KV 可以被后续生成复用。vLLM 的自动前缀缓存进一步在共享前缀的请求间复用相应 KV,主要减少重复的 prefill 计算;新 token 仍要生成。答案缓存则可能直接跳过模型调用,二者不是同一件事。vLLM 自动前缀缓存
用一个具体账目区分复用范围:两个请求的前 6000 token 完全相同,后面各有 2000 token 的不同问题。命中前缀缓存后,前缀计算可能复用,动态后缀与新生成输出仍要处理;它复用的是计算过的“稿纸”,不是把旧答案直接交卷。
复用位置比例不能直接换算成总延迟下降比例。排队、内存、输出长度与调度也在计时,测量时要把这些工作分别看清。
稳定前缀应放确实稳定的系统说明、工具定义或共享资料,动态任务信息随后加入。随意调整工具顺序、在最前面插入时间戳,都可能缩短可复用前缀;但不能为了命中率保留过时规则或不适用的材料。正确性优先决定输入内容,再优化其稳定表示。
共享缓存还要考虑租户隔离与侧信道。vLLM 提供按请求加 salt 限制前缀复用范围;应用应由可信上下文分配隔离组,而不是让任意客户端宣称属于另一个组。缓存隔离设计 缓存是否命中不改变用户能读取哪些政策。
一次具体的压缩与恢复¶
假设统一输入输出窗口为 32000 token,预留输出 4000。原先 24 段证据,每段 1800,共 43200,连输入都放不下。助手先按主题与有效期筛选,再选六段各 1500,共 9000;另外保留固定说明 3000、任务状态 1000、必要工具信息 1000,输入总计 14000。其余材料保存在证据索引中,按需展开。
第一轮比较时发现甲地例外规则缺少一项适用条件,助手沿指针取回该段完整上下文,而不是要求摘要器猜测。第二轮收到政策撤回通知,先标记相关证据和摘要失效,再重建输入;已有答案缓存也必须停止返回旧结论。第三轮会话切换,只装入当前目标、未决问题与产物指针,需要时再读原始轨迹。
观察这套策略时,应同时记录输入构成、证据覆盖、原文回查次数、摘要遗漏和最终错误。输入变短却遗漏了审批条件,是语义退步;缓存命中更多但跨租户复用不当,是隔离问题。两个问题都不能用单一 token 均值判断。
设计练习¶
为 24 段政策材料建立证据索引,标注版本、权限、适用条件和所支撑的判断。写一份 1000 token 以内的任务摘要,然后删除其中一个关键条件,让同伴只看摘要作答。验收时应定位信息在哪次转换中丢失,演示如何通过指针补回,并设计撤回政策后同时失效检索缓存、摘要与答案缓存的流程。
自检¶
1. 把全部正文存进文件,能否直接删除来源元数据?
不能。没有版本、位置与权限信息,后续无法可靠回查或判断材料是否仍适用。文件路径也不能代替资源授权。
2. 前缀缓存命中后,为什么还会产生较长的等待?
动态后缀、输出生成和排队等工作仍然存在;缓存也受容量、复用条件与调度影响,不能只按前缀长度预测总延迟。
3. 摘要已经包含“结论”,发布前为什么还可能取回原文?
摘要可能丢失适用条件或不确定性。涉及重要判断时,应检查结论对应的有效条款,确认版本和当前访问权限。