在 RAG 系统中,检索环节输出的若干文本片段并非直接送到大模型就能得到理想效果。原始片段可能包含冗余、噪音、不相干信息,也可能因长度超过模型上下文窗口而造成截断。上下文优化就是在检索完成后、生成之前,对即将注入提示词的信息进行再处理,确保模型接收到的内容精炼、有序、便于吸收。
为什么要专门优化上下文
检索模块的设计目标通常是“高召回”,即宁可多返回一些相关片段,也不能漏掉关键信息。但这会带来两个常见问题:
- 信息噪音:多个片段中可能存在重复内容、彼此矛盾的描述、或者仅部分相关的大段文字,直接拼凑会分散模型注意力。
- 上下文窗口压力:大模型的输入长度有限,过于冗长的资料会挤占真正有效的生成空间,甚至被迫截断尾部重要内容。
上下文优化就像一次“过滤和整理”,帮助模型把有限的理解能力用在最重要的信息上。
常用优化策略
1. 重排序(Re‑ranking)
向量相似度检索速度快,但精度有限。重排序模型(如 cross‑encoder)会对每个召回的片段与问题进行更深度的语义匹配,给出新的相关性分数,然后按分数重新排序并截取前 N 个。这一步可以有效提升送入模型的资料质量。
实践建议:在检索返回 10-20 个候选片段后,使用轻量级重排序模型精排一遍,最终只保留 3-5 个最高质量的片段。这种两阶段策略兼顾了效率与准确。
2. 去重与融合
多个检索片段可能来自同一文档的不同切片,内容高度重叠。直接将相似片段全部放入上下文,相当于让模型反复看同一信息,既浪费窗口又无益于理解。可以通过计算文本间的 Jaccard 相似度或嵌入余弦相似度,去除内容高度重复的片段,或者将重叠部分融合成一段连贯文本。
真实场景:产品说明书的连续三页被分别召回,内容大量重复,只保留其中信息最完整的一段即可,其他舍去。
3. 上下文压缩与摘要
对于内容较长但有效信息稀疏的片段(如长篇政策文件中的某几个段落),可以在不丢失核心事实的前提下做压缩。方法包括:
- 使用轻量级模型对每个片段生成一句话摘要,替换原文送入 LLM;
- 直接截取与问题关键词相关的句子,舍弃背景描述。
注意:摘要可能引入新的偏差,只适用于片段本身信息冗余度高、且允许小幅语义折损的场景。对法律、金融等对措辞高度敏感的领域,建议慎用。
4. 结构化与标注
将多个来源、不同格式的片段堆在一起,会增加模型的理解难度。优化时可以做简单的格式化处理:
- 为每个片段添加清晰的来源标记,如“【来源:员工手册 v2.3,第 5 页】”;
- 对片段按逻辑顺序排列(例如按时间、按文档重要性权重);
- 删除 HTML 标签、表格破碎代码等无关格式,保留纯文本内容。
这些细节看似琐碎,却能显著降低模型的“阅读负担”。
5. 控制上下文长度
即使经过筛选和压缩,也要确保最终构建的提示词不超出模型上下文限制。实践中通常预留至少 20% 的长度给问题和生成方向,避免模型回答被截断。可以设定每个片段的最大字符数,或在拼接后计算总 token 数,动态增删片段直至符合窗口要求。
优化管线示例
一个典型的上下文优化流程可能像这样:
- 向量检索返回 15 个候选片段;
- 重排序模型评分,选取 top‑8;
- 过滤掉评分低于阈值的片段,剩 6 个;
- 去除内容相似度超过 0.85 的重复项,剩 5 个;
- 截取每个片段的前 400 字关键部分;
- 添加来源标记,拼成最终上下文。
经过这层处理,送进 LLM 的信息信息密度明显提高,生成回答的事实准确性和一致性都更稳定。
实践中的注意事项
- 验证优化效果:每次调整上下文策略后,建议用一组典型问题测试,对比优化前后回答的准确率、完整度和幻觉出现率。
- 保留原始来源信息:即使进行了压缩或摘要,也要在最终上下文中保留文档片段 ID,确保可溯源。
- 平衡性能开销:重排序和摘要都需额外计算,对于高并发场景,要考虑延迟和成本的增加。可以先从最有效的重排序开始,逐步加入其他优化。
上下文优化并不追求“完美信息”,而是在有限窗口内让模型看到最有助于回答的内容。经过精心调理的上下文,往往比单纯堆砌更多检索片段更能提升回答质量,这也是 RAG 系统从“能用”走向“好用”的关键一步。