上下文组装与压缩:喂给模型的艺术
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。
一句话定义
上下文组装决定"哪些块、按什么顺序、以什么格式、带什么指令"进入 prompt:去重合并防重复、关键内容放首尾防"lost in the middle"、压缩降噪省 token,外加明确的引用与拒答指令——同样的检索结果,组装不同,答案质量可以差一个档次。
为什么重要
检索把原料送到了厨房,组装决定这道菜:塞 20 个块会触发模型的中部遗忘与注意力稀释,塞 2 个块可能漏证据,块顺序混乱会让模型引用错位。上下文工程(context engineering)已被公认为与 prompt 工程并列的核心技能——它直接决定 token 成本与答案质量。
前置知识
核心概念
- 块选择与预算:按窗口 token 预算(如总上下文的 50–70% 留给检索内容)决定装几块;宁缺毋滥,噪音块伤答率。
- 去重与合并:不同来源的块可能内容重叠(尤其有 overlap 时),需按父块/文档合并或语义去重,避免同一句话占两个名额。
- 顺序策略:Liu 等(2023)证实模型对上下文首尾内容利用率显著高于中部(lost in the middle)——最重要的块放最前与最后,次要放中间;或者干脆按"引用编号+精简"组织降低位置敏感度。
- 来源标记:每块前加
[1] 文档名·章节,指令要求答案标注引用编号——引用可核查的前提。 - 上下文压缩:过长候选用抽取式压缩(保留高信息密度句子)、或用小模型对每块做"与问题相关的摘要"(contextual compression),把 10 块 ×500 token 压成 10 ×150。
原理与机制
lost in the middle 的机制含义:注意力在超长上下文中呈"U 形"分布——开头(注意力初始化)与结尾(近因)被充分利用,中部信息检索利用率骤降。工程推论:① 首尾放关键证据;② 块数尽量少(3–5 块优于 15 块);③ 需要模型逐步引用的复杂问题,按证据顺序组织并显式编号。
压缩的两种路线:抽取式(extractive,从原文挑句子,零幻觉风险但压缩率有限)与摘要式(abstractive,小模型重写,压缩率高但引入压缩错误风险)。生产常用折中:对高分块原样保留、低分块摘要压缩——质量与预算动态平衡。
指令区与证据区分离:prompt 结构建议固定为"系统指令(角色/引用规则/拒答规则)→ 检索上下文(带编号来源)→ 问题"。指令混进证据中间会显著降低遵循率;模板要版本化管理并与评测绑定(kp-016)。
图示
[系统指令] 角色、只依据资料、引用格式[N]、不知道就说
[上下文]
[1] 员工手册·年假 (最重要, 放最前)
[2] OA操作指南
[3] HR FAQ 摘录 (次要, 放末尾)
[问题] 我年假有几天怎么申请?
↑ 关键证据占首尾, 总预算 ≤ 窗口 60%
实例或案例
- 客服机器人把引用格式从"自由生成"改为强制
[N]编号后,引用准确率显著上升且幻觉引用可被程序校验。 - 法律问答把"判决书原文块"放上下文首部、"程序性说明"放尾部,中间只留两块,长上下文模型下的答对率提升明显。
- 成本优化:候选块先过"相关句抽取"压缩,prompt token 降 60%,答案质量不降——压缩的 ROI 常高于换更大的上下文模型。
常见误区
- 误区一:"上下文窗口大就随便塞"。窗口大 ≠ 利用率高;塞满长上下文既慢又贵还激活中部遗忘,检索该做的事不能推给窗口。
- 误区二:"块顺序无所谓"。位置效应真实存在且可复现;至少做到"最重要放首位"。
- 误区三:"prompt 模板随手改"。模板是系统组件,改动必须跑评测集对比;无评测的模板调优是随机游走。
与其他知识点的关系
自测题
- 什么是 lost in the middle?工程上如何缓解?
答:模型对长上下文首尾利用率高、中部骤降的位置效应;缓解:关键证据放首尾、减少块数、压缩中部内容、显式编号引用。
- 抽取式与摘要式压缩怎么选?
答:高分关键块用抽取式(零失真风险),低分块用摘要式(高压缩率);风险敏感场景(法务医疗)避免摘要式引入的改写错误。
- 为什么引用编号要程序校验而不是信模型?
答:模型可能编造编号或张冠李戴(忠实性幻觉的引用版);程序校验(答案中的 [N] 必须存在于上下文)才能闭环保证可溯源。
延伸阅读
- Liu 等, "Lost in the Middle: How Language Models Use Long Contexts"(TACL 2023)。
- LangChain 文档:contextual compression / document transformers。
- Anthropic/OpenAI 官方长上下文使用指南(上下文布局建议)。