Retriever
Retriever 是 RAG 管线中负责从知识库中检索相关文档的组件。它支持语义搜索、关键词搜索和混合检索。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
- 所属 MOC: RAG Engineering MOC
- 相关: Vector Database, Embedding Model, Hybrid Search
Retriever
一句话定义
Retriever 是 RAG 管线中负责从知识库中检索相关文档的组件。给定用户问题,返回最相关的 K 个文档块。
核心原理
检索方式
| 方式 | 原理 | 适用场景 |
|---|---|---|
| 语义搜索 | 向量相似度 | 自然语言查询 |
| 关键词搜索 | BM25/TF-IDF | 精确术语 |
| 混合搜索 | 两者加权 | 通用(推荐) |
Python 实现
class Retriever:
def __init__(self, vector_store, embedder, keyword_index=None):
self.vector_store = vector_store
self.embedder = embedder
self.keyword_index = keyword_index
async def retrieve(self, query: str, top_k: int = 10) -> list[Chunk]:
# 1. 语义搜索
query_embedding = await self.embedder.embed(query)
semantic_results = await self.vector_store.search(
query_embedding, top_k=top_k
)
# 2. 关键词搜索(可选)
if self.keyword_index:
keyword_results = await self.keyword_index.search(query, top_k=top_k)
# 合并结果
results = self.merge_results(semantic_results, keyword_results)
else:
results = semantic_results
return results[:top_k]
def merge_results(self, semantic, keyword, alpha=0.7) -> list[Chunk]:
"""混合排序:语义搜索权重 alpha,关键词搜索权重 1-alpha"""
scores = {}
for i, chunk in enumerate(semantic):
scores[chunk.id] = alpha * (1.0 / (i + 1))
for i, chunk in enumerate(keyword):
scores[chunk.id] = scores.get(chunk.id, 0) + (1 - alpha) * (1.0 / (i + 1))
sorted_ids = sorted(scores, key=scores.get, reverse=True)
return [next(c for c in semantic + keyword if c.id == id) for id in sorted_ids]
常见坑
- 只用语义搜索: 精确术语(如错误码)找不到
- top_k 太大: 检索太多不相关的文档浪费 token
- 不做查询改写: 用户问题模糊导致检索不准
- Embedding 模型不匹配: 索引和查询用不同的 Embedding 模型