上下文组装与压缩:喂给模型的艺术

03-重排与上下文工程 核心 约 20 分钟 #上下文工程#lost in the middle#上下文压缩#prompt 组装 更新 2026-10-02
当前状态:未学
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。

一句话定义

上下文组装决定"哪些块、按什么顺序、以什么格式、带什么指令"进入 prompt:去重合并防重复、关键内容放首尾防"lost in the middle"、压缩降噪省 token,外加明确的引用与拒答指令——同样的检索结果,组装不同,答案质量可以差一个档次。

为什么重要

检索把原料送到了厨房,组装决定这道菜:塞 20 个块会触发模型的中部遗忘与注意力稀释,塞 2 个块可能漏证据,块顺序混乱会让模型引用错位。上下文工程(context engineering)已被公认为与 prompt 工程并列的核心技能——它直接决定 token 成本与答案质量。

前置知识

kp-013(重排输出)、kp-003(注意力与忠实性)。

核心概念

  • 块选择与预算:按窗口 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 模板随手改"。模板是系统组件,改动必须跑评测集对比;无评测的模板调优是随机游走。

与其他知识点的关系

  • kp-003:上下文质量决定忠实性下限。
  • kp-004/013:块从哪来、好不好在前面已定。
  • kp-015:引用与拒答指令在组装层落地。
  • kp-031:压缩与块裁剪是成本优化的主杠杆。

自测题

  1. 什么是 lost in the middle?工程上如何缓解?

答:模型对长上下文首尾利用率高、中部骤降的位置效应;缓解:关键证据放首尾、减少块数、压缩中部内容、显式编号引用。

  1. 抽取式与摘要式压缩怎么选?

答:高分关键块用抽取式(零失真风险),低分块用摘要式(高压缩率);风险敏感场景(法务医疗)避免摘要式引入的改写错误。

  1. 为什么引用编号要程序校验而不是信模型?

答:模型可能编造编号或张冠李戴(忠实性幻觉的引用版);程序校验(答案中的 [N] 必须存在于上下文)才能闭环保证可溯源。

延伸阅读

  • Liu 等, "Lost in the Middle: How Language Models Use Long Contexts"(TACL 2023)。
  • LangChain 文档:contextual compression / document transformers。
  • Anthropic/OpenAI 官方长上下文使用指南(上下文布局建议)。