跳到主要内容

双通道检索获得结果后的后续处理(RRF 融合)

还是回到 RagRetrievalEngine#retrieveSingleSubQuestion 这个方法,我们之前已经讲解了它的前半部分:根据子问题和可用通道列表,发起多通道并发检索,并对每个通道设置了独立的超时隔离。

现在我们继续看它的后半部分。

等待所有通道完成并过滤空结果

if (futures.isEmpty()) {
// 如果没有任何通道支持当前计划,直接返回空证据,并写入提示说明。
notes.add("子问题" + subQuestionIndex + "没有可用的检索通道。");
return new SubQuestionEvidence(subQuestionIndex, subQuestion, List.of(), new ArrayList<>(), List.of(), 0, 0, 0);
}

// 原始结果保留的是通道直接召回的候选,用于后续观测记录和过滤前后对比。
List<RetrievalChannelResult> rawChannelResults = futures.stream()
.map(CompletableFuture::join)
.filter(result -> result.getDocuments() != null)
.toList();

这里先检查是否有可用的通道。如果没有,直接返回空证据。

然后等待所有通道完成(CompletableFuture::join),并过滤掉空结果。这里保留的是原始结果,也就是通道直接召回的候选,还没有经过任何过滤。

应用证据闸门过滤

// 对不同通道应用对应的证据闸门,过滤掉分数过低的候选文档。
List<RetrievalChannelResult> channelResults = rawChannelResults.stream()
.map(this::applyEvidenceGate)
.toList();

这里调用 applyEvidenceGate 方法,对每个通道的结果应用证据闸门。我们来看这个方法的实现:

/**
* 对单个通道结果应用证据闸门。
* 不同通道采用不同过滤策略,例如向量通道基于最小相似度,关键词通道基于相对分数下限。
*
* @param result 通道原始结果
* @return 过滤后的通道结果
*/
private RetrievalChannelResult applyEvidenceGate(RetrievalChannelResult result) {
if (result == null || result.getDocuments() == null || result.getDocuments().isEmpty()) {
return result;
}

// 按通道类型选择不同的过滤策略,避免不同分数体系混用同一阈值。
List<Document> documents = switch (result.getChannelName()) {
case "vector" -> filterVectorCandidates(result.getDocuments());
case "keyword" -> filterKeywordCandidates(result.getDocuments());
default -> result.getDocuments();
};
return new RetrievalChannelResult(result.getChannelName(), documents);
}

什么是证据闸门?

证据闸门(Evidence Gate)是一个过滤机制,用于过滤掉分数过低的候选文档。不同通道使用不同的过滤策略:

付费内容提示

该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放

加入星球后,你可以获得:

  • 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
  • 讲解文档:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的详细文档
  • 讲解视频:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
  • 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
  • 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
  • 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
  • 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
  • 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
  • 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
知识星球二维码

1. 打开微信 -> 扫描左侧二维码 -> 加入「JavaUp项目实战&技术讲解」知识星球

2. 查看星球使用指导,获取完整项目讲解资料索引

👉 点击解锁全部付费内容
🎁优惠