混合检索
- 混合检索,能够同时兼容关键词以及语义的匹配
- 向量检索+关键词检索
关键词检索方案
- RAG 关键词检索更适合 FTS / BM25 类方案
PostgreSQL混合检索方案
短期:pgvector + pg_trgm + RRF
中期:pgvector + FTS + ts_rank + RRF
企业级:BM25 + pgvector + RRF
PostgreSQL全文关键词搜索
- PostgreSQL 的全文关键词搜索,核心就是 FTS(Full Text Search)
- 先把文本转换成一个可检索的“词条索引”,再查询
ts_rank是 PostgreSQL 自己的全文搜索排名算法,不是标准 BM25。ts_rank是 PostgreSQL FTS(全文搜索)里用于“相关性打分/排序”的函数- PostgreSQL 关键词全文搜索 = FTS 做匹配 + ts_rank做排序
向量检索和关键词检索并行处理
- 向量检索和关键词检索是并行检索处理的
- 并行检索得到的结果之后,进行候选文档合并,给到Rerank重排序
┌→ 向量检索 → Top 20 ─┐
用户 Query ─────────┤ ├→ 合并 → Reranker → Top N
└→ 关键词检索 → Top 20 ─┘
混合检索调用链
- Python 负责生成 embedding 和检索流程编排;
- Node 负责 PostgreSQL、pgvector 和 FTS 查询
- 向量检索与 FTS 关键词检索在通过
Promise.all并行执行 - RRF 等待两路结果完成后进行融合合并;
- Reranker 只能处理 RRF 返回的候选文档
- FTS 不需要单独生成向量,直接使用数据库中的
content字段和 GIN 索引。
模型配置解析
↓
Embedding 生成查询向量
↓
向量检索 ─┐
├─ RRF 混合融合
全文检索 ─┘
↓
Rerank
↓
LLM 生成回答