






















一、为什么要压缩 & 过滤
检索器一次拉回 top-k 篇文档,其中 80% 的 token 与问题无关 →
浪费 LLM 上下文窗口
无关内容引入幻觉
目标:在“送进 LLM 之前”就把无用段落/句子/ token 丢掉或压成更短的表示。
二、整体两阶段流水线
query
│
▼
[1. 检索] ─► 原始文档集合 D=[d1,…,dk]
│
▼
[2. 压缩+过滤] ─► 精炼文档集合 D̂=[d̂1,…,d̂m] (m≤k, |d̂i|≤|di|)
│
▼
[3. 生成] ──► 答案
三、四种常用压缩/过滤策略
A. FILTER – 保留与 query 相关的句子,其余扔掉
B. SUMMARY – 把长文做抽取/生成式摘要
C. PRECISION– 对结构化字段截断小数位、只保留关键键值
D. HYBRID – 先 A→再 B→必要时 C,兼顾精度与压缩率
四、伪代码实现(单文件即可跑通思路)
Python
复制
# 1. 基础数据结构
@dataclass
class Document:
content: str
score: float = 0.0
五、关键技巧小结
句子级过滤:用 embedding 相似度或 cross-encoder 重排,速度快。
摘要失败兜底:摘要模型可能输出空,直接退回到原文截断或关键字段抽取。
压缩率计算:真实压缩比 = 原始总 token 数 / 精炼后 token 数,可在 _compress_all 里顺手统计。
并行化:map-reduce 思路,把长文档先切小块,过滤后再合并,能线性加速 。
训练式压缩:如果数据足,可参考 FlexRAG 用“可学习的摘要向量”做端到端压缩
。
把上面伪代码 copy 下来,把 Retriever 和 Generator 换成你的实际实现,即可得到一个带“上下文压缩 + 过滤”的 RAG 原型。祝玩得开心!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。