文章目录
- FastGPT 引申:混合检索完整实例
- 1. 各检索方式的初始结果
- 2. RRF合并过程
- 3. 合并后的结果
- 4. Rerank重排序后
- 5. 最终RRF合并
- 6. 内容总结
FastGPT 引申:混合检索完整实例
下边通过一个简单的例子说明不同检索方式的分值变化过程,假设我们有一个查询:“如何使用Python进行数据分析”
1. 各检索方式的初始结果
向量检索结果 (相似度分数0-1):
1. {
id: "doc1",
q: "Python数据分析基础教程",
score: 0.85,
type: "embedding"
}
2. {
id: "doc2",
q: "数据分析工具pandas使用",
score: 0.78,
type: "embedding"
}
全文检索结果 (BM25分数):
1. {
id: "doc2",
q: "数据分析工具pandas使用",
score: 8.5,
type: "fullText"
}
2. {
id: "doc3",
q: "Python编程基础",
score: 6.2,
type: "fullText"
}
2. RRF合并过程
使用公式: score = 1/(k + rank)
,这里 k=60
向量检索RRF分数:
doc1: 1/(60 + 1) = 0.0164
doc2: 1/(60 + 2) = 0.0161
全文检索RRF分数:
doc2: 1/(60 + 1) = 0.0164
doc3: 1/(60 + 2) = 0.0161
3. 合并后的结果
1. {
id: "doc2", // 出现在两个结果中
q: "数据分析工具pandas使用",
score: [
{type: "embedding", value: 0.78},
{type: "fullText", value: 8.5},
{type: "rrf", value: 0.0325} // 0.0161 + 0.0164
]
}
2. {
id: "doc1",
q: "Python数据分析基础教程",
score: [
{type: "embedding", value: 0.85},
{type: "rrf", value: 0.0164}
]
}
3. {
id: "doc3",
q: "Python编程基础",
score: [
{type: "fullText", value: 6.2},
{type: "rrf", value: 0.0161}
]
}
4. Rerank重排序后
假设重排序模型对这些文档评分:
1. {
id: "doc2",
q: "数据分析工具pandas使用",
score: [
{type: "embedding", value: 0.78},
{type: "fullText", value: 8.5},
{type: "rrf", value: 0.0325},
{type: "rerank", value: 0.92}
]
}
2. {
id: "doc1",
q: "Python数据分析基础教程",
score: [
{type: "embedding", value: 0.85},
{type: "rrf", value: 0.0164},
{type: "rerank", value: 0.88}
]
}
3. {
id: "doc3",
q: "Python编程基础",
score: [
{type: "fullText", value: 6.2},
{type: "rrf", value: 0.0161},
{type: "rerank", value: 0.75}
]
}
5. 最终RRF合并
将重排序结果作为第三个来源(k=58)进行最终 RRF 合并:
doc2: 0.0325 + 1/(58 + 1) = 0.0325 + 0.0169 = 0.0494
doc1: 0.0164 + 1/(58 + 2) = 0.0164 + 0.0167 = 0.0331
doc3: 0.0161 + 1/(58 + 3) = 0.0161 + 0.0164 = 0.0325
6. 内容总结
展示如下环节:
- 不同检索方式的分数范围不同
- RRF 如何将不同分数统一到相同尺度
- 多次出现的文档如何累加 RRF 分数
- 重排序如何提供额外的相关性评分
文档排序综合考虑:
- 语义相似度(向量检索)
- 关键词匹配(全文检索)
- 语义理解(重排序)
- 在不同搜索结果中的排名位置(RRF)