上一篇讲了 Vector Stores。这一篇讲第五段——Retrievers:检索。

检索是 RAG 五段的最后一段,也是决定「找到的资料质量」的关键。资料找得准不准,直接决定模型答得好不好。这一篇讲 Retriever 这个抽象,以及几种提升检索质量的进阶策略。

Retriever:检索的抽象

Retriever 是一个协议:给一个查询,返回一组文档。就这么简单。

retriever.invoke(查询) → [Document, Document, ...]

Retriever:给查询返回文档

为什么要有这个抽象?因为「检索」这件事,来源可能不止向量库:

  • 向量库的相似搜索(最常见)
  • 关键词搜索(BM25 等)
  • 混合检索(向量 + 关键词)
  • 别的数据源

不管来源是什么,对 RAG 链来说,它只想要「给我查询,还我文档」这个接口。Retriever 就是统一这个接口的抽象。

VectorStore 可以变成 Retriever

上一篇提过,VectorStore 有个 as_retriever() 方法,能把自己转成 Retriever。转完之后,它就完全融入 Runnable 体系,能进 LCEL 链:

retriever = vectorstore.as_retriever()
rag_chain = {"context": retriever, "question": ...} | prompt | model

这是个优雅的设计:VectorStore 是「存储+搜索」的实体,Retriever 是「给查询返回文档」的协议。VectorStore 实现了 Retriever 协议,于是存储层和应用层解耦。RAG 链只认 Retriever,不在乎背后是什么。

VectorStore 转 Retriever

基础检索的局限

最基础的检索就是「向量相似搜索」:问题转向量,找最近的几块。简单,但有局限:

  • 只看语义相似,不看关键词:有时用户用专业术语搜,纯向量可能错过精确匹配
  • 返回的块可能冗余:最相似的几块可能内容重复,浪费 prompt 空间
  • 不会判断「需不需要检索」:不管什么问题都检索,有时没必要

基础检索的局限

下面几种进阶策略,就是针对这些局限的。

进阶策略一:混合检索

纯向量检索抓住语义,但可能错过精确的关键词匹配。混合检索把向量检索和关键词检索(如 BM25)结合:两路各找一些,合并去重排序。

混合检索:向量 + 关键词

适合:专业领域(术语精确匹配重要)、用户经常用特定名词搜索的场景。

进阶策略二:重排序(Reranking)

先用向量检索快速召回一批候选(比如 20 块),再用一个更精细的模型对这批候选重新排序,取最好的几块(比如 5 块)。

重排序:先召回再精排

为什么要两步?因为向量检索快但粗,精细模型准但慢。两步结合:先粗筛(量大),再精排(量小)。这是工业界常用的「召回-排序」范式。

进阶策略三:上下文压缩

检索回来的文档块,可能只有一部分和问题相关。上下文压缩 retriever 会先检索,再对结果做压缩——只保留和问题相关的片段,去掉无关部分。

上下文压缩:只留相关部分

好处:塞进 prompt 的更精炼,省 token,模型更聚焦。

进阶策略四:自查询(Self-Query)

用户问题里常含结构化条件,比如「2024 年关于 RAG 的文章」。自查询 retriever 能从问题里同时抽出「语义查询」(关于 RAG)和「过滤条件」(年份=2024),检索时既比语义又按条件过滤。

自查询:抽语义 + 过滤条件

适合:文档有丰富 metadata(时间、类别、作者等),用户会按这些维度提问的场景。

选择策略的判断

这些策略不是越多越好,要按问题选:

策略 解决什么 何时用
基础向量检索 通用语义搜索 默认起点
混合检索 漏掉关键词匹配 专业术语多
重排序 召回粗、要精排 质量要求高
上下文压缩 块冗余、太长 文档块长、要省 token
自查询 要按结构化条件过滤 metadata 丰富

按问题选策略

务实做法:从基础向量检索起步,遇到具体问题再加对应策略。不要一开始就上全套,过度设计。

收束:检索质量决定 RAG 上限

这一篇讲了 Retrievers:

  • Retriever 是「给查询返回文档」的 Runnable 抽象,统一各种检索来源
  • VectorStore 能转成 Retriever,融入 LCEL 链
  • 基础向量检索有局限,有几种进阶策略
  • 混合检索、重排序、上下文压缩、自查询各有适用
  • 从基础起步,按问题加策略,别过度设计

下一篇是 Phase 4 收束——Agentic RAG:把固定 RAG 升级成「Agent 自己决定何时检索、检索什么」。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。

如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

十三Tech公众号二维码