Skip to content

8.3.3 怎样通过排序、摘要、压缩、结构化拼接减轻这个问题? ​

先给结论:减轻 lost in the middle 的关键,不是简单缩短上下文,而是让真正关键的信息更突出、让整体结构更清晰。排序、摘要、压缩和结构化拼接,分别是在从不同角度做这件事。

要先明确一点:

  • 这不是一个靠单一技巧就能彻底解决的问题

更稳的思路通常是组合处理:

  • 先把关键证据排前
  • 再把重复和背景压下去
  • 必要时把长材料先提炼成结构化中间表示

一、先通过排序把关键证据前移 ​

这是最直接也最常见的一步。

如果关键证据本来就在长上下文中段,那么第一反应应该是:

  • 它能不能更早出现

这里常见的做法包括:

  • 用 Rerank 把直接证据提到更前
  • 最终上下文里优先放回答当前问题的块
  • 把背景说明和辅助材料往后放

排序不能解决所有问题,但它至少能先减少一种最明显的失焦:

  • 关键证据被大量次要材料埋住

二、通过摘要和提炼降低长材料负担 ​

有些场景里,问题不是候选不相关,而是:

  • 单条材料太长
  • 背景部分远多于真正关键句

这时可以考虑先做摘要或提炼,比如:

  • 从长段中抽出直接相关句
  • 先生成面向当前问题的小摘要
  • 对章节做更短的结构化概括

这样做的目标不是“让内容更短”本身,而是:

  • 让高价值信息在有限阅读预算里更显眼

三、通过压缩减少重复和边缘信息 ​

压缩和摘要相关,但不完全一样。

压缩更强调:

  • 删除冗余
  • 保留高密度信息

它常见适用于:

  • 相邻块高度重复
  • 多篇文档在重复表达同一事实
  • 背景说明远多于直接证据

如果这些内容不压缩,大窗口只会让重复问题被放大。

四、通过结构化拼接恢复“可读结构” ​

很多长上下文失败,不只是因为太长,还因为:

  • 拼接方式太平

把十几段材料简单往下堆,模型看到的是一个长文本流;但如果把这些材料组织成更清晰的结构,情况就会不一样。

常见做法包括:

  • 按主题分组
  • 按来源分组
  • 按问题子项分组
  • 给每组加小标题或标签
  • 把“直接证据”和“背景补充”明确分开

结构化拼接的作用在于:

  • 让模型更容易知道每段材料在整个回答任务里扮演什么角色

一个更现实的最小链路 ​

python
candidates = retrieve(query, top_k=30)
candidates = rerank(query, candidates)
candidates = deduplicate(candidates)
compressed = compress_redundant_parts(candidates)
structured_context = organize_by_priority_and_topic(compressed)
answer = llm(build_prompt(query, structured_context))

这段代码想说明的是:

  • 长上下文治理通常不是单一步骤,而是一串上下文整理动作

五、什么时候该优先做哪一种 ​

可以粗略按问题来源判断:

如果问题主要是关键证据埋得太后 ​

优先考虑:

  • 排序
  • 最终前置关键块

如果问题主要是单条材料太长 ​

优先考虑:

  • 摘要
  • 针对问题的局部提炼

如果问题主要是重复和噪声太多 ​

优先考虑:

  • 压缩
  • 去重

如果问题主要是长材料堆得太平、来源混乱 ​

优先考虑:

  • 结构化拼接
  • 分组与标签化

一个常见误区 ​

很多人面对 lost in the middle,会直接把策略理解成:

  • 那就尽量把所有关键句都塞到开头

这有时有效,但并不总是最稳。因为如果整体结构仍然混乱,模型只是更早遇到一些关键句,不代表它就能稳定地围绕这些句子展开回答。

更稳的办法通常是:

  • 前移关键证据
  • 同时减少噪声
  • 同时恢复结构

一句话总结 ​

减轻 lost in the middle,关键在于让高价值信息更突出、让上下文结构更清晰。排序是在前移关键证据,摘要是在提炼长材料,压缩是在减少重复噪声,结构化拼接是在恢复可读关系。这几类方法常常需要组合使用,而不是单独依赖某一项。