RAG-02索引召回-Sparse-Vector-Retrieval

本文属于 RAG 工程框架中的「2 索引与召回」环节,聚焦「Sparse Vector Retrieval」方法。可先阅读 RAG-00.方法概述 再进入本篇。

原理

Sparse 检索将文本编码为高维稀疏向量(词项或词项扩展权重),检索时做稀疏匹配(常配倒排索引)。

1
2
3
4
5
6
7
flowchart LR
D[文档] --> SD[Sparse 编码]
SD --> IDX[倒排/稀疏索引]
Q[查询] --> SQ[Sparse 编码]
SQ --> M[稀疏相似度匹配]
IDX --> M
M --> Top[Top-k 文档]

优势与局限

  • 优势:可解释性好;关键词可控;CPU 部署友好。
  • 局限:抽象语义泛化弱于 dense;长尾同义表达召回可能不足。

资源与时延

  • 索引开销:中(倒排结构成熟)。
  • 查询时延:低到中。
  • 工程复杂度:低于 ColBERT。

应用场景

  • 法规、医疗、金融术语检索。
  • 需要“为什么召回这条”的可解释系统。

统一合成数据示例

输入数据片段

1
2
3
4
{
"query": "差旅报销 上限 机票",
"query_sparse_terms": {"差旅": 1.2, "报销": 1.6, "上限": 2.0, "机票": 2.4}
}

中间结果(稀疏匹配)

1
2
3
4
[
{"doc_id": "D01", "term_overlap": ["报销", "上限", "机票"], "score": 8.9},
{"doc_id": "D08", "term_overlap": ["报销"], "score": 2.1}
]

最终生成示例(含引用)

1
2
3
4
{
"answer": "制度规定机票报销上限为 2000 元。",
"citations": [{"doc_id": "D01", "evidence_span": "机票报销上限 2000 元"}]
}

原始发表与工程实现

  • 代表性原始发表:SPLADE (Formal et al., 2021)。
  • 核心解决问题:解决可解释稀疏语义检索。
  • 成熟实现工具:splade, Pyserini, Elasticsearch。

详细原理拆解

  • 稀疏点积 score=sum_t w_q(t)*w_d(t),可解释哪些词项驱动召回。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
def splade_retrieve(query, sparse_encoder, inverted_index, top_k: int):
q_vec = sparse_encoder.encode_query(query) # 稀疏查询向量(少量非零维)
return inverted_index.topk_dot(q_vec, k=top_k) # 与文档稀疏向量点积

参数示例

1
2
3
4
sparse_model: splade-v3
top_k: 50
truncate_query_terms: 32
fusion_with_dense: optional

常见失败案例

  • 失败模式 1:领域词未在词表,稀疏激活为空,召回崩溃。
  • 失败模式 2:同义词多,IDF 权重被稀释,需与 dense 混合。
  • 失败模式 3:只看点积不看解释,忽略高权噪声词(如泛词「报销」)。

Demo 数据带入计算示例

1
2
3
q 与 d 的稀疏权重在「报销」「上限」「机票」三维上做点积:
score(q,d1)=1.6*1.1+2.0*1.7+2.4*2.0=9.96 > d2=5.21。
与 dense 不同:每一项可对应 **具体词项**,便于日志解释「为什么召回 d1」。
-------------本文结束感谢您的阅读-------------