LLM Agent:RAG 召回信息密度与质量优化方案
在上一节讨论了召回多样性优化后,多路索引的召回方案可以提供更多的潜在候选内容。但候选越多,如何对这些内容进行筛选和排序就变得更加重要。本章重点讨论召回的信息密度和质量。参考经典搜索和推荐框架,这一章对应排序 + 重排环节。虽然排序中粗排和精排的区分主要是针对低延时的工程优化,这里不再进一步区分,统一算作排序模块。
排序与重排在 RAG 中的异同
让我们先对比下重排和排序模块在经典框架和 RAG 中的异同:
排序模块
- 经典框架:Pointwise 建模,局部单一 item 价值最大化。这里的价值可以是搜索推荐中的内容点击率,或者广告中的 eCPM,价值由后面使用的用户来决定。
- RAG:基本和经典框架相同,不过价值是大模型使用上文多大程度可以回答问题。价值的定义先由背后的大模型给出,再进一步才能触达用户。更具体的定义是,排序模块承担着最大化信息密度的功能,也就是在更少的 TopK 内筛选出尽可能多的高质量内容,并过滤噪声信息。
重排模块
- 经典框架:Listwise 建模,通过对 item 进行排列组合,使得全局价值最大化,进而使得用户多次行为带来的整体体验感更好。这里的整体可以是一个搜索列表页,一屏推荐信息流,也可以是更长的一整个 session 内用户体验的整体指标,以及背后的商业价值。常见的做法是打散,提高连续内容的多样性,以及前后内容的逻辑连贯性,不过打散只是手段,全局价值才是终极目标。
- RAG:概念相似,通过重排优化模型对整体上文的使用效率。优化模型对上文的使用,提升信息连贯性和多样性,最小化信息不一致性和冲突。不过当前大模型对话式的交互方式更难拿到用户体验的反馈信号,想要优化用户体验难度更高。
1. 排序模块实现方案
上一章提到使用 query 改写、多路索引(包括 BM25 离散索引、多种 Embedding 连续索引)进行多路内容召回。这种方案会提供更丰富的内容候选,但也显著增加了上文长度。很多论文都评估过,过长的上文,以及过长上文中更大比例的噪声信息,都会影响模型推理的效果。
因此如何从这些召回内容中排序筛选出更高质量的内容,过滤噪声信息就是排序模块需要做的。考虑不同索引之间对于相似度的计算打分相互不可比,更不可加,因此需要统一的打分维度来对候选内容进行排序。这里提供两个无监督的混合排序打分方案。
1.1 RRF 混排
Reciprocal Rank Fusion (RRF) 是多路召回混合排序较常见的方法。它把所有打分维度都转化成排名,每个文档的最终得分是多路打分的排名之和的倒数。通过排名来解决不同打分之间 scale 的差异性。
公式如下,其中 r(d) 是单一打分维度中的文档排名,K 是常数起到平滑的作用,微软实验后给的取值是 60。
$$ Score(d) = \sum_{i} \frac{1}{k + r_i(d)} $$
以下是微软搜索中使用 RRF 类合并文本检索和向量检索的一个示意图,使用 RRF 分别对文本检索和向量检索的多路召回内容进行混合排序。
1.2 信息熵打分
除了使用排名来对各路召回的内容质量进行归一化,当然也可以使用统一的模型打分来对内容质量进行衡量,比如可以使用 Bert Cross-Encoder 来对所有候选文档来进行打分排序,利用 cross 模型比 embedding 模型更精准的特点来进一步对召回内容进行过滤。
这里想聊聊除了相关性之外的另一个内容质量评估维度 - Information-Entropy。Information-Entropy 是从文本信息熵的角度对内容有效性和质量进行打分筛选,有以下几种不同的信息熵度量方式。
1.2.1 Selective-Context
Selective-Context 使用自信息对内容质量进行评估。熵值越低(不确定性越低),自信息越低的 token 带给语言模型的信息量就越低,例如停用词、同义词等。因此自信息更低的内容本身的价值更低。
不过自信息的计算是 token 粒度的,想要对短语、句子、段落进行计算可以近似采用 token 求和的方式,也就是假设 token 之间是相互独立。但是越大粒度的信息合并,简单求和的自信息误差越大,因为 token 并非真正独立。因此单纯使用内容自信息的计算方式更适合短语粒度的上文内容压缩,似乎不完全适合对 RAG 召回的段落内容进行打分。
1.2.2 LLMLingua
LLMLingua 同样是使用 token 熵值来对内容质量进行打分,不过进一步放松了 token 独立性的假设。计算公式如下,先把整个上文 context 分段,论文使用 100 个 token 为一段。以下 S_j,i 为第 j 个段落中第 i 个字,S_j' 是第 j 个段落前所有段落经过压缩后的内容。也就是在计算当前段落每个字的熵值时,会把之前已经压缩过的内容拼接在前面,使得对更大粒度的段落熵值估计更加准确。
1.2.3 LongLLMLingua
LongLLMLingua 进一步把完全基于内容的信息熵,优化成了基于内容回答问题的条件熵,更完美的适配 RAG 框架中排序模块对召回内容整体打分的要求。
以上 LLMLingua 和 Selective-Context 单纯对上文内容的熵值进行计算,但很有可能熵值高的内容虽然包含大量信息但都和问题无关,只是单纯的信息噪声。因此 LongLLMLingua 在熵值计算中引入了问题,那无非就是两种计算方案,要么给定问题计算内容的熵值,要么给定内容计算问题的熵值。论文考虑内容中可能是有效信息和噪声信息的混合,因此选用了后者。也就是给定每段召回内容,计算问题的熵值。
这里论文还在问题前加了一段指令,'Xrestrict=we can get the answer to this question in the given documents',通过增加内容到问题的关联程度,来优化条件熵的计算。
论文对比了不同打分排序方案,包括 BM25、各种向量 embedding,以及 LLMLingua,其中 LongLLMLingua 在 TopK 文档的召回率上显著更优。LongLLMLingua 在以上的段落打分之外,还加入了对段落内部 token 级别的内容压缩。也就是先筛选 TopN 段落,再在段落内筛选有效 Token。不过看论文效果感觉段落排序的重要性 >> 内容压缩,这部分就不再赘述。
2. 重排模块实现方案
针对排序模块筛选出的 TopK 上文候选,重排模块需要通过对内容进一步排列组合,最大化模型整体推理效果。和排序模块最大的差异在于它的整体性,不再针对每个 Doc 进行独立打分,而是优化整个 Context 上文的效果。主要有以下两个优化方向:一个是文档位置的优化,一个是文档之间关联性的优化。
2.1 文档位置优化
针对文档位置的最优化就是 Lost in the Middle。简单说就是大模型在使用上文推理时,倾向于使用最前面和最后面的内容,而对中间的内容爱搭不理。因此可以基于内容的质量,把重要的内容放在 Context 的前面和后面。
LongLLMLingua 也做了类似的尝试,并且认为前面的位置比后面更加重要,因此直接使用上面排序模块对段落的打分,对排序后保留的候选内容,进行重新排列,按照分数由高到低依次从前往后排列。
2.2 文档关联性优化
以上排序和重排的逻辑,都是考虑问题和召回内容之间的关联性,但都没有引入 Context 内部不同召回内容之间的关联性。
LangChain 的 LOTR (Merger Retriever) 实现了部分类似的功能,包括使用 embedding 对多路召回的内容进行消重,以及对内容进行聚类,每个聚类中筛选最靠近中心的一条内容。这一步可以放在排序中去做,也可以放在排序后的重排模块。
之前章节提到的微软的 MetaInsight 也引入了类似的打散逻辑。其中:
- 内容的整体价值 = 每条内容的价值之和 - 内容之间重合的价值
- 两两内容重合价值 = 两条内容打分的最小值 * 内容重合率
那放到 RAG 框架可能就可以使用以上的信息熵来作为打分,相似度来作为重合率。
在实际工程中,我们可以尝试以下策略:
- 信息连贯性:将内容相似的多个召回连续排列,可能会让模型更容易建立上下文依赖,相比散落在 Context 各处效果更好。
- 信息多样性:对召回内容进行聚类,把内容相似的多个召回进行消重,或者只使用每个 cluster 内距离类中心最近的一条或 TopN 条内容,这有助于提升推理效果,避免冗余。
- 信息一致性:观点或内容冲突的多个召回内容,对推理的影响较大。可以通过重排将冲突内容分散,或者在排序阶段降低冲突内容的权重。
3. 工程实践总结
在 RAG 系统的实际落地中,排序与重排的选择往往需要在延迟和效果之间做权衡。
- 延迟考量:Cross-Encoder 虽然精度高,但推理速度慢。如果系统对响应时间敏感,建议优先使用 RRF 或轻量级的 Entropy 方法(如 Selective-Context)。
- 效果验证:LongLLMLingua 在长上下文场景下表现优异,但计算开销较大。建议在离线评测中对比不同方案的准确率(Precision@K)和召回率(Recall@K)。
- 动态调整:可以根据 Query 的复杂度动态选择策略。简单查询使用 BM25+RRF,复杂推理任务使用 LongLLMLingua 进行深度压缩和排序。
综上所述,通过合理的排序与重排策略,可以显著提升 RAG 系统返回给大模型的上下文质量,减少噪声干扰,从而提升最终生成答案的准确性和可靠性。未来的研究方向可能集中在如何更高效地计算条件熵,以及如何结合强化学习来优化重排策略,以更好地适应多样化的用户意图。