1. 为什么RAG系统的召回结果总是不尽如人意?
在构建RAG(检索增强生成)系统时,很多开发者都会遇到一个令人头疼的问题:明明检索到的文档看起来与问题相关,但最终生成的回答却常常偏离主题。这种现象背后隐藏着一个关键认知误区——我们往往过于关注"是否检索到相关文档",而忽视了"如何对检索结果进行合理排序"。
想象一下图书馆管理员的日常工作。一个好的管理员不仅要知道哪些书可能与读者的问题相关,更重要的是能够从这些书中挑选出最匹配的那几本。如果管理员只是简单地把所有可能相关的书堆在读者面前,读者反而更难找到真正需要的答案。RAG系统面临的挑战与此类似。
1.1 召回与排序的本质区别
在LangChain4j框架中,ContentRetriever负责召回可能的候选文档,这相当于图书馆的检索系统。但真正决定最终回答质量的,是ContentAggregator对召回结果的聚合和排序能力。当前默认的DefaultContentAggregator采用了两阶段RRF(倒数排名融合)算法,而更高级的ReRankingContentAggregator则可以进行语义重排。
常见的问题场景包括:
- 向量检索Top5中只有1-2条真正有用的文档
- 简单问题因召回偏差导致模型"一本正经地胡说八道"
- 想引入重排又担心系统复杂度和成本飙升
这些问题的根源在于:我们给大模型提供的上下文质量,直接影响着生成结果的质量。就像你不能指望一个厨师用变质的食材做出美味佳肴一样,我们也不能指望大模型从低质量的上下文中生成准确的回答。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. RRF:朴素但强大的多路召回融合算法
2.1 RRF的核心原理
RRF(Reciprocal Rank Fusion,倒数排名融合)是一种简单却异常有效的算法。它的核心思想是:不依赖不同检索系统的绝对分数,而是通过文档在各路召回结果中的相对排名来进行融合。
RRF的典型计算公式如下:
code复制RRF_score(d) = Σ(1/(k + rank_i(d)))
其中:
d表示某篇文档rank_i(d)表示该文档在第i个召回列表中的排名k是平滑参数(通常取60)
这个公式的巧妙之处在于:
- 它给予高排名文档更大的权重(倒数关系)
- 通过平滑参数k避免
