RAG 从 0 到 1 · 第 1 篇

RAG 检索增强生成:从 0 到 1

为什么需要 RAG

大模型的知识被冻结在训练时刻,而且容易一本正经地胡说。RAG(Retrieval-Augmented Generation)的思路很朴素:先查资料,再回答问题

它把流程拆成两段:

  • 检索:从你的私有知识库里找出和问题最相关的片段
  • 生成:把这些片段塞进 Prompt,让 LLM 基于它们作答
💡
一句话理解

RAG = 开卷考试。LLM 是考生,向量库是课本,检索器是翻书的手。

整体链路

从用户提问到最终回答,数据依次流经五个环节。

RAG 处理流程 Mermaid

各阶段耗时占比

在一套典型配置下(Top-20 召回 + bge-reranker),实际耗时分布如下。

各阶段平均耗时(ms) ECharts
⚠️
性能瓶颈

LLM 生成占了 60%+ 的时间。想压延迟,优先换更小的生成模型或做流式输出,而不是优化检索。

召回质量随时间的变化

三种检索策略在不同数据规模下的召回率对比。

召回率对比(%) ECharts

最小可跑示例

用 LangChain + Chroma,十几行就能跑通:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

vectorstore = Chroma(
    collection_name="kb",
    embedding_function=OpenAIEmbeddings(),
)

retriever = vectorstore.as_retriever(
    search_kwargs={"k": 5}
)
docs = retriever.invoke("什么是 RAG")

三种检索策略对比

适合语义相近、表达多样的查询。缺点是长尾精确匹配(如错误码、函数名)容易漏。
混合检索,兼顾语义和关键词。实现成本略高,但召回提升明显,是当前主流方案。
两阶段检索:先召回 Top-50,再用 cross-encoder 精排。效果最好,但延迟增加 200–400ms。

常见坑

chunk 切分太大
chunk 超过 1000 token 后,语义会被稀释,检索精度掉得很快。建议 256–512 token,并保留 10–20% overlap。
只做向量检索,不做 rerank
向量召回 Top-1 经常不准。加一层 rerank 后,Top-1 命中率通常能从 55% 提升到 80%+。
把整个文档塞进上下文
token 爆炸,成本飙升,而且模型会「迷失在中间」。只塞最相关的 3–5 个片段即可。

演进时间线

2023 Q1
朴素 RAG
单路向量检索 + Prompt 拼接,召回率约 60%
2023 Q4
加入 Rerank
两阶段检索,召回率提升到 82%
2024 Q2
Hybrid Search
向量 + BM25 混合,长尾查询明显改善
2025 Q1
Agentic RAG
让模型自己决定检索几次、检索什么

召回能力雷达

三种策略能力对比 ECharts

知识图谱

知识图谱 可拖拽

相关概念

检索决定下限,重排决定上限,生成决定体验。

目录

图表