· 王思腾 · 大模型工程 · 8 分钟阅读

RAG 原理详解:让大模型用上私有知识的检索增强生成

大模型知识冻结、会幻觉、不知道企业内部数据。RAG(检索增强生成)通过“先检索、再生成”把外部知识注入上下文,是当前落地最广的大模型应用范式。本文带你走通 RAG 的完整链路:分块、嵌入、检索与重排,以及工程上最常踩的坑。

大模型知识冻结、会幻觉、不知道企业内部数据。RAG(检索增强生成)通过“先检索、再生成”把外部知识注入上下文,是当前落地最广的大模型应用范式。本文带你走通 RAG 的完整链路:分块、嵌入、检索与重排,以及工程上最常踩的坑。

大模型有三个绕不开的短板:知识冻结(训练后不知道新信息)、幻觉(会一本正经地编造)、看不到私有数据(企业文档、数据库)。微调能灌入一些知识,但成本高、更新慢、还无法溯源。

RAG(Retrieval-Augmented Generation,检索增强生成) 给出了更轻的解法:先从知识库里检索出相关内容,再把它塞进提示词,让模型“看着资料回答”。 它是目前落地最广、性价比最高的大模型应用范式,也是 Agent 接入外部知识的基础能力。

一、RAG 的核心思想

一句话概括:把“模型记住所有知识”变成“模型会查资料”。

flowchart LR
    subgraph Traditional["传统方式"]
        T1["用户问题"] --> T2["LLM<br/>凭参数记忆回答"] --> T3["容易过时 / 幻觉"]
    end
    subgraph RAG["RAG 方式"]
        R1["用户问题"] --> R2["检索相关文档"] --> R3["连同问题给 LLM"] --> R4["基于资料回答<br/>可引用出处"]
    end

好处很直接:

  • 知识可更新:更新知识库即可,无需重新训练模型;
  • 减少幻觉:答案基于检索到的真实材料;
  • 可溯源:能给出引用来源,增强可信度;
  • 接入私有数据:企业文档、客服记录、代码库都能用。

二、RAG 的两个阶段

RAG 系统分离线索引和在线问答两条链路。

1. 离线索引(Indexing)

把原始文档处理成可检索的形式:

flowchart TB
    D0["原始文档<br/>PDF / 网页 / Markdown / 数据库"] --> D1["解析、清洗"]
    D1 --> D2["文本分块 Chunking<br/>切片段 + 重叠"]
    D2 --> D3["嵌入模型 Embedding"] --> Vec["向量"]
    Vec --> DB[("向量数据库<br/>向量 + 原文 + 元数据")]
  • 解析与清洗:提取正文、去噪(页眉页脚、表格特殊处理)。
  • 分块:把长文档切成 chunk(常见 300~800 token),块太小丢上下文、太大稀释相关性,通常块之间保留重叠(overlap)避免切断语义。
  • 嵌入:用 embedding 模型把每个 chunk 映射成一个高维向量(如 768/1536 维),语义相近的文本向量距离近。
  • 入库:向量连同原文、来源、元数据(标题、日期、权限)一起存入向量库。

2. 在线问答(Retrieval + Generation)

flowchart TB
    Q["用户提问"] --> QV["问题转成向量"]
    QV --> R1["向量检索<br/>相似度 Top-K 候选"]
    R1 --> RR["(可选)重排 Rerank<br/>精选最相关几块"]
    RR --> Prompt["组装 Prompt<br/>系统指令 + 检索上下文 + 问题"]
    Prompt --> LLM["LLM 生成答案<br/>带引用出处"]

模型被明确要求“仅根据提供的资料回答,资料不足就说明”,从而把生成锚定在真实内容上。

三、关键技术点

1. 分块策略(Chunking)

分块质量直接决定检索质量。常见做法:

  • 固定长度 + 重叠:按 token 切,相邻块重叠 10~20%;
  • 按结构切:按标题/段落/句子边界切,保留语义完整;
  • 父子分块:检索用小块(精准匹配),返回给模型用大块(完整上下文);
  • 上下文增强:给每个块附上文档标题、路径等元信息。

2. 嵌入(Embedding)

  • 选择与场景、语言匹配的 embedding 模型(中文场景选多语/中文优化模型);
  • 查询和文档要用同一个模型编码;
  • 维度越高表达力越强但存储/检索成本越高。

3. 向量检索

用相似度(余弦相似度等)在向量库中找最近邻(ANN,近似最近邻)。但纯向量检索不是万能:

  • 向量擅长语义匹配(“怎么退款”≈“退货流程”);
  • 关键词(BM25/全文检索)擅长精确匹配(产品型号、错误码、人名)。

生产系统常用混合检索(Hybrid Search):向量 + 关键词两路召回,再合并,兼顾语义和精确。

4. 重排(Reranking)

初检用便宜的向量检索召回较多候选(如 Top-50),再用更精准但更慢的 reranker 模型(交叉编码器)对“问题-文档”对逐一打分,精排出最相关的少数几块(如 Top-5)。这一步往往对准确率提升最明显。

5. 生成与引用

把精排后的上下文拼进 prompt,并要求模型标注引用。上下文要控制长度(相关、少而精优于多而杂),避免噪声干扰。

四、常见工程坑

问题表现对策
分块不合理检索不到或上下文残缺按结构切、加重叠、父子分块
只靠向量检索专有名词/编号匹配差混合检索(向量+关键词)
召回不精塞了无关内容、答案跑偏加 rerank、控制 Top-K
知识过时答案引用旧文档增量索引、版本与时效管理
权限越界检索到无权访问的文档检索时带权限过滤(元数据)
缺乏评估改了不知道变好没建问答评测集,衡量召回率/命中率/答案正确性

五、进阶方向

  • 查询改写:把口语问题改写成更利于检索的形式;多轮对话先做“指代消解”;
  • 多路召回与融合:向量、关键词、知识图谱、结构化查询结合;
  • Agentic RAG:由 Agent 自主决定“要不要检索、检索几次、结果够不够”,甚至做多轮检索、查询分解(对应本系列 Agent 文章中的工具调用循环);
  • 评测闭环:用真实问答持续度量检索命中率和答案质量,驱动分块/模型/参数迭代。

六、小结

RAG 的本质是给大模型装上“开卷考试”的能力:

  1. 离线把知识分块、嵌入、存入向量库;
  2. 在线把问题向量化、检索、重排,再连同上下文交给模型生成;
  3. 工程关键在分块、混合检索、重排、权限与评估;
  4. 它既是独立的知识库问答方案,也是 Agent 获取外部信息的核心工具。

下一篇我们深入它的存储底座——向量数据库,看看海量向量如何被高效地组织和检索。

本文由 AI 辅助创作,所有内容仅供交流与参考。
分享:
返回博客
大模型应用架构进阶:从 Prompt、工作流、RAG 到 Agent 的选型与演进

大模型应用架构进阶:从 Prompt、工作流、RAG 到 Agent 的选型与演进

“Prompt、RAG、Agent 三选一”是个过于粗糙的说法。真实系统是一条从“全确定”到“全自主”的连续光谱,RAG 本质是给模型接知识的能力,Agent 也分固定编排和自主循环。这篇往深里聊:工作流模式、RAG 的三个深浅层级、什么时候才该让模型自主决策,以及成本、延迟和失败模式这些入门文章很少算的账。

Spring AI 介绍与实践:用 Java 生态的方式接入大模型

Spring AI 介绍与实践:用 Java 生态的方式接入大模型

Java 团队想接大模型,不必硬套 Python 的 LangChain。Spring AI 把 ChatClient、Prompt 模板、结构化输出、RAG(向量库)、函数调用、对话记忆这些能力做成了 Spring 风格的抽象和 Starter,配几行 yml、写几行链式调用就能跑。这篇从核心抽象讲起,带你用 Spring Boot 一步步实现聊天、结构化映射、RAG 知识库和工具调用,并聊聊生产里要注意的事。

LLM 推理优化:大模型为什么慢,以及如何提速降本

LLM 推理优化:大模型为什么慢,以及如何提速降本

大模型推理是自回归逐 token 生成,显存带宽是瓶颈。本文讲清 Prefill/Decode 两阶段、KV Cache 的作用与开销,再逐个聊连续批处理、PagedAttention(vLLM)、量化(INT8/INT4)、投机解码、FlashAttention 与并行策略,以及延迟与吞吐怎么权衡。

动手实战:从零搭一个 RAG 知识库问答系统(含代码与生产化清单)

动手实战:从零搭一个 RAG 知识库问答系统(含代码与生产化清单)

原理篇讲了 RAG 是什么,这篇带你亲手搭一个能跑的。从文档切分、向量化入库,到检索、重排、拼上下文、生成答案,给出最小可运行代码;然后把 Demo 推向生产:混合检索、Rerank、查询改写、相似度兜底、引用溯源、评测集和增量更新,附一份逐项可落地的调优清单。