上下文选择与压缩
上下文选择与压缩发生在召回、重排之后,答案生成之前。选择负责从候选中保留回答所需的材料,压缩负责减少这些材料中与当前问题无关的内容。 目标是在上下文长度限制内,保留能够共同支持答案的证据及其必要条件。
例如,用户问:“2026 年境内出差结束后多久提交报销,审批后多久付款?”检索器找到了正确制度,但前五条结果都是“30 个自然日内提交”的转载,第六条才是付款期限。直接取前五条作为上下文,模型就只能回答一半。即使每个片段都很相关,整组选出的材料仍可能缺少一个必要事实。
这一阶段可以按下面的顺序处理:
检索候选
→ 去掉重复内容,选出覆盖问题的片段
→ 补齐片段依赖的条件、标题或相邻句
→ 抽取相关原文,必要时生成摘要
→ 检查长度,附上来源,交给模型回答从“相关片段”选出“完整答案所需的材料”
假设已经找到以下候选,它们都来自适用于本次问题的 2026 版制度:
| 候选 | 内容 | 能回答什么 |
|---|---|---|
| A | 境内出差结束后 30 个自然日内提交报销 | 提交期限 |
| B | 另一篇报销说明,同样介绍提交期限 | 与 A 重复 |
| C | 审批通过后 5 个工作日内支付 | 付款期限 |
| D | 整章差旅制度,包含以上条款和交通住宿细则 | 两个期限,但有较多无关内容 |
问题包含“多久提交”和“多久付款”两个信息需求。A 与 C 已经覆盖这两项,加入 B 没有帮助;D 虽然也包含答案,但可以只保留其中的相关条款。
因此,选择上下文时要同时看相关性和新增信息。单独看相关性排名,容易选出一组彼此相似、却反复回答同一个子问题的片段。对于多项比较、步骤说明等问题,可以先列出回答需要的事实,再检查每项是否有材料支持。这里的“需要哪些事实”由问题决定,不能为了填满上下文临时增加话题。
先去掉重复内容
同一制度可能同时有网页正文、打印页和 PDF。完全相同的文本可以通过内容哈希识别,高度相似的转载则需要进一步比较正文。合并后保留各来源地址即可,不必把相同段落重复交给模型。
近似去重需要核对数字和条件。“30 天内提交”和“60 天内提交”可能只差一个数字,但它们表达的是不同规则,不能合并。版本、适用范围也属于比较内容的一部分。
用 MMR 减少已选材料之间的重复
MMR(Maximal Marginal Relevance,最大边际相关性)是一种逐条选择候选的方法。它在查询相关性之外,再扣除候选与已选材料的相似程度。设候选为 d,查询为 q,已选集合为 S:
MMR(d) = λ × sim(q, d) - (1 - λ) × max(sim(d, s), s ∈ S)通常先选最相关的一条,再反复计算其余候选的 MMR 分数。λ 越大,越看重查询相关性;越小,越倾向于选择与已有材料不同的内容。
假设 A 已选中,两种相似度具有可比较的尺度,取 λ = 0.7:
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 拆成:
片段 C1:报销申请审批通过后,
片段 C2:财务应在 5 个工作日内完成支付。如果检索只命中 C2,片段本身没有说明五个工作日从何时开始计算。缺少起算条件时,模型可能自行补成“提交后五个工作日支付”,改变原条款的含义。
此时应根据文档 ID 和原文位置取回 C1,合并成完整条款。标题中的适用范围、前一句定义的主体、紧接其后的例外,也可能需要一起恢复。Small-to-Big 介绍了通过父块和句子窗口扩展上下文的方法。
恢复后的内容应来自同一文档的同一版本。重叠片段按原始区间合并,避免重复;补齐当前条款所需的条件即可,不必把整章重新放回来。
两种压缩方式:抽取原文与生成摘要
选择减少材料数量,压缩减少每份材料的长度。上例中的 D 包含交通、住宿、报销和付款等多项规定,当前问题只需要其中两条。
抽取式压缩
抽取式压缩从候选中保留相关的句子、段落或表格行,内容仍使用原文。例如从 D 中抽出:
境内出差应在结束后 30 个自然日内提交报销申请。
报销申请审批通过后,财务应在 5 个工作日内完成支付。抽取器可以用规则、句子级相关性模型或 LLM 选择原文区间。若由 LLM 选择,最好返回片段 ID 或能够在原文中校验的引用文本,再由程序取回对应内容,避免把改写后的句子当成原文。
对于期限、金额、否定和例外较多的资料,保留原句便于核对。但“抽到相关句”仍不等于条件完整:若条款下一句写着特殊情形,或者表格标题限定了适用地区,就需要一起保留。直接用 text[:200] 截断无法识别这种依赖。
生成式压缩
生成式压缩让模型重新组织材料,把多个段落合并为更短的摘要。例如:
境内出差结束后 30 个自然日内提交;审批通过后 5 个工作日内支付。
这种方式可以合并分散的表述、减少重复解释,但又引入了一次生成。如果摘要遗漏“审批通过后”,后续回答模型即使严格遵守摘要,也会答错。
生成摘要时应保留主体、适用范围、数字、单位、起算条件和例外,并为摘要中的事实记录原文出处。最终引用跳转到原始条款;遇到条件密集或无法确认的摘要,回读原文,或者直接使用抽取式结果。
在本例中,两条原文已经很短,继续生成摘要节省不了多少长度,直接抽取更合适。长报告中跨段落的重复说明,才更值得考虑生成式压缩。
在长度限制内保住必要信息
选出证据并压缩之后,再检查它们能否放入请求。模型窗口还要容纳系统指令、历史消息、用户问题、工具定义和输出:
证据预算 = 模型窗口 - 指令 - 历史消息 - 问题 - 工具定义 - 预留输出 - 余量余量用于包装字段和估算误差。应按目标模型的计数规则检查组装后的请求,不能固定把一个汉字当成一个 token。
假设证据预算为 900 token,A 连同适用说明占 400 token,C 占 300 token,两者共 700 token,可以完整保留。D 整章占 1800 token,则应先抽取相关条款。
若仍然超出预算,优先删去重复与无关内容,再缩短背景说明。不能为了保留更多高分片段,删掉决定结论的条件。按“相关性分数除以长度”排序就可能偏爱短句,把较长但必要的适用说明挤出去。确实无法在一次请求里处理完时,可以拆分问题分别处理,或改用能够容纳所需证据的上下文窗口。
把选好的内容交给回答模型
最终上下文既要包含可读文本,也要保留来源标识。例如:
问题:2026 年境内出差结束后多久提交报销,审批后多久付款?
[E1] 2026 版差旅制度,提交条款
境内出差应在结束后 30 个自然日内提交报销申请。
[E2] 2026 版差旅制度,付款条款
报销申请审批通过后,财务应在 5 个工作日内完成支付。
要求:分别回答两个期限,在对应事实后标注证据编号。应用需要把 E1、E2 映射到固定版本的原文位置。压缩后的内容要保留这层映射,生成答案时才能引用原始条款,而不是只引用一次性生成的摘要。
材料顺序也会影响使用效果。Lost in the Middle 在所测试的长上下文任务中观察到,模型利用中间位置的信息可能更困难。本例可以直接按问题顺序放置提交、付款条款,并把条件紧邻其对应事实;不能据此推导出所有模型都应采用固定的首尾排列。
选择范围应限定为已通过权限与适用范围检查的候选。压缩只能缩短已有材料,不能补出缺失事实;发现来源冲突或材料缺口时,需要进一步决定哪些结论仍有依据,见证据引用、冲突处理与拒答。