RAG-03重排组装-Context-Compression-RAG

本文属于 RAG 工程框架中的「3 重排与证据组装」环节,聚焦「Context Compression(上下文压缩)」方法。可先阅读 RAG-00.方法概述 再进入本篇。

原理

从候选文档提取与问题强相关的证据片段,压缩无关内容后再送入生成(Generation)。

关键技术/实现路径

  • 句级/段级相关性筛选。
  • 证据片段抽取(span extraction)。
  • 长文裁剪与去冗余。

优缺点

  • 优点:减少 token 成本,提升答案聚焦。
  • 缺点:压缩过度会丢关键限定语。

性能与资源

  • 轻量模型可在线部署,成本可控。

应用场景

  • 长文档问答与多文档汇总。

统一合成数据示例

输入数据片段

1
{"query":"机票报销限制","candidate_doc":"...机票上限2000元,30天内提交,其他..."}

中间结果(压缩后)

1
{"compressed_spans":["机票上限2000元","30天内提交"]}

最终生成示例(含引用)

1
{"answer":"机票上限2000元,需30天内提交。","citations":[{"doc_id":"D01","evidence_span":"机票上限2000元;30天内提交"}]}

原始发表与工程实现

  • 代表性原始发表:LongLLMLingua (2023)。
  • 核心解决问题:解决长上下文噪声和成本。
  • 成熟实现工具:llmlingua, context compressor。

详细原理拆解

  • 在 token 预算约束下选择高相关片段:maximize relevance(span,q) s.t. budget。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
4
5
def compress_for_prompt(query, ranked_chunks, scorer, budget_tokens: int):
spans = sentence_split(ranked_chunks)
scored = [(s, scorer.relevance(query, s)) for s in spans]
picked = knapsack_by_score(scored, budget_tokens) # 或贪心按分数截断
return "\n".join(picked)

参数示例

1
2
3
4
compression: llmlingua2
target_token_budget: 420
preserve_numbers: true
min_sentences_per_doc: 1

常见失败案例

  • 失败模式 1:压缩掉 条件从句(「除非…」),答案与制度矛盾。
  • 失败模式 2:仅按 token 数截断,跨段指代(「上述标准」)丢失。
  • 失败模式 3:压缩器与生成模型 语言不一致,术语被改写。

Demo 数据带入计算示例

1
2
3
原始 1800 tokens,按句相关性保留 420 tokens,压缩率 76.7%;
若 faithfulness 从 0.81→0.86,说明去掉的主要是噪声;若数字句被误删,faithfulness 会跌——
需对 **数值/否定** 加保护规则。
-------------本文结束感谢您的阅读-------------