RAG Fusion是一种将多种检索策略(向量检索、关键词检索、语义检索等)的结果进行融合排序的技术,通过Reciprocal Rank Fusion (RRF)等算法,综合各路检索的优势,找到最相关的文档。
用户查询: "OpenClaw的MCP协议怎么配置?"
↓
┌────┴────┐
↓ ↓ ↓
向量检索 关键词检索 语义检索
[doc1,3,5] [doc2,3,5] [doc1,3,4]
↓ ↓ ↓
└────┬────┘
↓
RRF 融合排序
↓
[doc3, doc5, doc1, doc4, doc2]
↓
取Top-K作为上下文
// RAG Fusion实现
async function ragFusion(query, retrievers, topK = 5) {
// 并行执行多种检索
const results = await Promise.all(
retrievers.map(r => r.search(query, { topK: topK * 2 }))
);
// Reciprocal Rank Fusion
const scoreMap = new Map();
const k = 60; // RRF常数
results.forEach(retrieverResults => {
retrieverResults.forEach((doc, rank) => {
const score = 1 / (k + rank + 1);
scoreMap.set(doc.id, (scoreMap.get(doc.id) || 0) + score);
});
});
// 按融合分数排序
return Array.from(scoreMap.entries())
.sort((a, b) => b[1] - a[1])
.slice(0, topK)
.map(([id, score]) => ({ id, score }));
}