Skip to content

上下文选择与压缩 ​

上下文选择与压缩发生在召回、重排之后,答案生成之前。选择负责从候选中保留回答所需的材料,压缩负责减少这些材料中与当前问题无关的内容。 目标是在上下文长度限制内,保留能够共同支持答案的证据及其必要条件。

例如,用户问:“2026 年境内出差结束后多久提交报销,审批后多久付款?”检索器找到了正确制度,但前五条结果都是“30 个自然日内提交”的转载,第六条才是付款期限。直接取前五条作为上下文,模型就只能回答一半。即使每个片段都很相关,整组选出的材料仍可能缺少一个必要事实。

这一阶段可以按下面的顺序处理:

text
检索候选
  → 去掉重复内容,选出覆盖问题的片段
  → 补齐片段依赖的条件、标题或相邻句
  → 抽取相关原文,必要时生成摘要
  → 检查长度,附上来源,交给模型回答

从“相关片段”选出“完整答案所需的材料” ​

假设已经找到以下候选,它们都来自适用于本次问题的 2026 版制度:

候选内容能回答什么
A境内出差结束后 30 个自然日内提交报销提交期限
B另一篇报销说明,同样介绍提交期限与 A 重复
C审批通过后 5 个工作日内支付付款期限
D整章差旅制度,包含以上条款和交通住宿细则两个期限,但有较多无关内容

问题包含“多久提交”和“多久付款”两个信息需求。A 与 C 已经覆盖这两项,加入 B 没有帮助;D 虽然也包含答案,但可以只保留其中的相关条款。

因此,选择上下文时要同时看相关性和新增信息。单独看相关性排名,容易选出一组彼此相似、却反复回答同一个子问题的片段。对于多项比较、步骤说明等问题,可以先列出回答需要的事实,再检查每项是否有材料支持。这里的“需要哪些事实”由问题决定,不能为了填满上下文临时增加话题。

先去掉重复内容 ​

同一制度可能同时有网页正文、打印页和 PDF。完全相同的文本可以通过内容哈希识别,高度相似的转载则需要进一步比较正文。合并后保留各来源地址即可,不必把相同段落重复交给模型。

近似去重需要核对数字和条件。“30 天内提交”和“60 天内提交”可能只差一个数字,但它们表达的是不同规则,不能合并。版本、适用范围也属于比较内容的一部分。

用 MMR 减少已选材料之间的重复 ​

MMR(Maximal Marginal Relevance,最大边际相关性)是一种逐条选择候选的方法。它在查询相关性之外,再扣除候选与已选材料的相似程度。设候选为 d,查询为 q,已选集合为 S:

text
MMR(d) = λ × sim(q, d) - (1 - λ) × max(sim(d, s), s ∈ S)

通常先选最相关的一条,再反复计算其余候选的 MMR 分数。λ 越大,越看重查询相关性;越小,越倾向于选择与已有材料不同的内容。

假设 A 已选中,两种相似度具有可比较的尺度,取 λ = 0.7:

text
B:查询相似度 0.92,与 A 相似度 0.98
C:查询相似度 0.85,与 A 相似度 0.25

MMR(B) = 0.7 × 0.92 - 0.3 × 0.98 = 0.350
MMR(C) = 0.7 × 0.85 - 0.3 × 0.25 = 0.520

尽管 B 与问题更相似,C 仍会优先入选,因为 B 与已有的 A 高度重复。

MMR 用相似度近似衡量内容多样性,并不知道“付款期限”是不是答案必须包含的事实。它可以缓解重复,不能替代覆盖检查。对于只问报销单号的单事实问题,过强的多样性惩罚还可能把不相关内容选进来。

压缩之前,先补齐句子依赖的条件 ​

拿到 A 和 C 后,还不能只保留其中的数字。切块可能把 C 拆成:

text
片段 C1:报销申请审批通过后,
片段 C2:财务应在 5 个工作日内完成支付。

如果检索只命中 C2,片段本身没有说明五个工作日从何时开始计算。缺少起算条件时,模型可能自行补成“提交后五个工作日支付”,改变原条款的含义。

此时应根据文档 ID 和原文位置取回 C1,合并成完整条款。标题中的适用范围、前一句定义的主体、紧接其后的例外,也可能需要一起恢复。Small-to-Big 介绍了通过父块和句子窗口扩展上下文的方法。

恢复后的内容应来自同一文档的同一版本。重叠片段按原始区间合并,避免重复;补齐当前条款所需的条件即可,不必把整章重新放回来。

两种压缩方式:抽取原文与生成摘要 ​

选择减少材料数量,压缩减少每份材料的长度。上例中的 D 包含交通、住宿、报销和付款等多项规定,当前问题只需要其中两条。

抽取式压缩 ​

抽取式压缩从候选中保留相关的句子、段落或表格行,内容仍使用原文。例如从 D 中抽出:

text
境内出差应在结束后 30 个自然日内提交报销申请。
报销申请审批通过后,财务应在 5 个工作日内完成支付。

抽取器可以用规则、句子级相关性模型或 LLM 选择原文区间。若由 LLM 选择,最好返回片段 ID 或能够在原文中校验的引用文本,再由程序取回对应内容,避免把改写后的句子当成原文。

对于期限、金额、否定和例外较多的资料,保留原句便于核对。但“抽到相关句”仍不等于条件完整:若条款下一句写着特殊情形,或者表格标题限定了适用地区,就需要一起保留。直接用 text[:200] 截断无法识别这种依赖。

生成式压缩 ​

生成式压缩让模型重新组织材料,把多个段落合并为更短的摘要。例如:

境内出差结束后 30 个自然日内提交;审批通过后 5 个工作日内支付。

这种方式可以合并分散的表述、减少重复解释,但又引入了一次生成。如果摘要遗漏“审批通过后”,后续回答模型即使严格遵守摘要,也会答错。

生成摘要时应保留主体、适用范围、数字、单位、起算条件和例外,并为摘要中的事实记录原文出处。最终引用跳转到原始条款;遇到条件密集或无法确认的摘要,回读原文,或者直接使用抽取式结果。

在本例中,两条原文已经很短,继续生成摘要节省不了多少长度,直接抽取更合适。长报告中跨段落的重复说明,才更值得考虑生成式压缩。

在长度限制内保住必要信息 ​

选出证据并压缩之后,再检查它们能否放入请求。模型窗口还要容纳系统指令、历史消息、用户问题、工具定义和输出:

text
证据预算 = 模型窗口 - 指令 - 历史消息 - 问题 - 工具定义 - 预留输出 - 余量

余量用于包装字段和估算误差。应按目标模型的计数规则检查组装后的请求,不能固定把一个汉字当成一个 token。

假设证据预算为 900 token,A 连同适用说明占 400 token,C 占 300 token,两者共 700 token,可以完整保留。D 整章占 1800 token,则应先抽取相关条款。

若仍然超出预算,优先删去重复与无关内容,再缩短背景说明。不能为了保留更多高分片段,删掉决定结论的条件。按“相关性分数除以长度”排序就可能偏爱短句,把较长但必要的适用说明挤出去。确实无法在一次请求里处理完时,可以拆分问题分别处理,或改用能够容纳所需证据的上下文窗口。

把选好的内容交给回答模型 ​

最终上下文既要包含可读文本,也要保留来源标识。例如:

text
问题:2026 年境内出差结束后多久提交报销,审批后多久付款?

[E1] 2026 版差旅制度,提交条款
境内出差应在结束后 30 个自然日内提交报销申请。

[E2] 2026 版差旅制度,付款条款
报销申请审批通过后,财务应在 5 个工作日内完成支付。

要求:分别回答两个期限,在对应事实后标注证据编号。

应用需要把 E1、E2 映射到固定版本的原文位置。压缩后的内容要保留这层映射,生成答案时才能引用原始条款,而不是只引用一次性生成的摘要。

材料顺序也会影响使用效果。Lost in the Middle 在所测试的长上下文任务中观察到,模型利用中间位置的信息可能更困难。本例可以直接按问题顺序放置提交、付款条款,并把条件紧邻其对应事实;不能据此推导出所有模型都应采用固定的首尾排列。

选择范围应限定为已通过权限与适用范围检查的候选。压缩只能缩短已有材料,不能补出缺失事实;发现来源冲突或材料缺口时,需要进一步决定哪些结论仍有依据,见证据引用、冲突处理与拒答。

持续学习,持续实践。