Retriever

Retriever 是 RAG 管线中负责从知识库中检索相关文档的组件。它支持语义搜索、关键词搜索和混合检索。

#type / concept #status / evergreen #tech / ai

[!info] related notes

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]

常见坑

  1. 只用语义搜索: 精确术语(如错误码)找不到
  2. top_k 太大: 检索太多不相关的文档浪费 token
  3. 不做查询改写: 用户问题模糊导致检索不准
  4. Embedding 模型不匹配: 索引和查询用不同的 Embedding 模型

参考资料

创建于 2026/6/30 更新于 2026/7/15