RAG 检索增强生成原理与实践

1788 字
9 分钟
RAG 检索增强生成原理与实践

为什么需要 RAG#

大语言模型有两个致命短板:

  1. 知识截止:训练数据是某个时间点之前抓取的,之后发生的事(新闻、新版本、公司内部文档)一概不知
  2. 幻觉:模型不知道答案时不会说”我不知道”,而是会一本正经地编造

RAG(Retrieval-Augmented Generation,检索增强生成)的思路很朴素:模型不知道,那就先查资料,把资料塞进上下文里,再让它基于资料回答。就像开卷考试——模型是考生,检索系统是它的笔记本。

RAG 整体流程#

一个标准的 RAG 系统分两个阶段:

RAG 完整流程:离线索引 + 在线查询
RAG 完整流程:离线索引 + 在线查询

阶段一:离线索引(建库)#

  1. 收集文档(PDF、网页、Markdown、数据库记录……)
  2. 清洗文本(去页眉页脚、去重、格式统一)
  3. 切分(Chunking):把长文档切成小块
  4. 向量化(Embedding):每块文本转成一个向量
  5. 存入向量数据库,建立索引(便于 ANN 近似最近邻检索)

阶段二:在线查询(问答)#

  1. 用户提问
  2. 把问题向量化(用同一个 Embedding 模型)
  3. 在向量库里检索 top-k 最相似的文本块
  4. 把检索结果拼进 Prompt,与问题一起发给 LLM
  5. LLM 基于检索内容生成回答

核心一:Embedding(文本向量化)#

什么是 Embedding#

Embedding 是把一段文本映射成一个固定维度的稠密向量(如 768 维、1536 维),使得语义相近的文本在向量空间里距离更近

“猫”和”猫咪”的向量距离很近,“猫”和”汽车”的向量距离很远——这就是语义向量化的威力。

Embedding 模型怎么训练的#

常见的训练思路是对比学习(Contrastive Learning)

  • 构造正样本对(语义相同的文本,如问题和答案、原文和改写)
  • 构造负样本对(语义无关的文本)
  • 训练目标:拉近正样本对的向量距离,推远负样本对的向量距离

损失函数常用 InfoNCE 或 Triplet Loss。训练好的模型对任意输入文本输出一个向量。

Embedding 的注意点#

  • 查询和文档必须用同一个模型,否则向量空间不一致,检索失效
  • 中文场景要选中文优化过的模型(如 BGE、text2vec、m3e),英文模型对中文效果差
  • 向量维度越高,信息越丰富但存储和计算开销越大

核心二:Chunking(文本切分)#

切分质量直接影响检索效果。切太大,噪音多、浪费上下文;切太小,语义不完整。

常见策略:

策略说明适用场景
固定长度切分按字符数硬切,可加重叠通用兜底
按段落/标题切分尊重文档结构Markdown、结构化文档
语义切分用模型判断语义边界高质量索引
父子块(Parent-Child)小块检索、大块喂给模型平衡精度与上下文

工程上常用重叠窗口(overlap)避免把语义割裂在边界上。

核心三:向量检索#

相似度度量#

向量检索的本质是算相似度,常用三种:

  • 余弦相似度:cos(q, d) = q·d / (|q|·|d|),只关心方向,最常用
  • 内积:q·d,未归一化,速度快
  • 欧氏距离:越小越相似,与余弦在归一化后等价

精确检索 vs 近似检索#

  • 暴力检索:和库里每个向量算相似度,取 top-k。数据量小(万级)没问题
  • ANN 近似检索:数据量百万级以上,用索引结构加速,牺牲少量精度换取速度

主流的 ANN 算法:

  • HNSW(分层可导航小世界图):图结构,召回率高,内存占用大
  • IVF(倒排文件):先聚类再在桶内检索
  • PQ(乘积量化):把向量压缩存储

向量数据库(Milvus、Qdrant、Weaviate、Chroma、pgvector)就是把这些算法封装成可直接使用的服务。

混合检索#

纯向量检索对关键词精确匹配(如型号 “A100”、代码片段)不敏感。工程上常用混合检索:向量检索 + BM25 关键词检索,再用 RRF(Reciprocal Rank Fusion)融合排序。这是生产级 RAG 的标配。

核心四:重排序(Rerank)#

向量检索的第一轮召回是”粗筛”,top-k 里可能混入语义相似但不直接相关的段落。重排序模型(如 BGE-Reranker、Cohere Rerank)对”问题-段落”对做精细的相关性打分,重新排序后只保留前 3~5 条喂给 LLM。

流程:

问题 → 向量检索召回 50 条 → Rerank 重排 → 取前 5 条 → 拼 Prompt → LLM 生成

重排序能显著提升答案质量,代价是多一次模型推理。

核心五:Prompt 拼接与生成#

检索到的文本块要拼成结构化的上下文,示例:

你是一个严谨的助手,请仅根据以下参考资料回答问题。
如果参考资料中没有答案,请明确说"资料中未找到相关信息"。
参考资料:
[1] <chunk1>
[2] <chunk2>
[3] <chunk3>
问题:<user_question>
回答:

要点:

  • 给资料编号,让模型在回答中引用来源
  • 明确”没有就直说”,降低幻觉
  • 控制总长度,避免超出模型上下文窗口
  • 可加系统提示词约束回答风格

RAG 的进阶形态#

1. Query 改写(Query Rewriting)#

用户的原始问题往往检索效果差,先用 LLM 把问题改写得更适合检索:拆解多跳问题、补全指代、生成子问题。

2. 多路召回#

不同来源(向量库、SQL 数据库、API、搜索引擎)并行检索,结果融合。这就是 GraphRAG(结合知识图谱)的思想。

3. Agentic RAG#

检索不再是”一次性的”:让 Agent 判断是否需要检索、需要检索什么、检索结果不够就换个方式再查,甚至自主调用多个工具。这就是 RAG 与 Agent 的融合。

4. 评估与优化#

RAG 系统要用指标持续迭代:召回率(Recall)、精确率、忠实度(Faithfulness,回答是否忠于检索内容)、答案相关性(Answer Relevancy)。配合 RAGAS 等评估框架做回归测试。

RAG 的常见问题与排查#

症状可能原因排查方向
答非所问检索结果与问题无关检查 Embedding 模型、Chunk 质量
答案有幻觉检索结果不够/Prompt 约束弱加 Rerank、加”不知道就说不知道”
回答太泛喂给模型的上下文太短增大 top-k、用父子块
检索慢数据量大换 ANN 索引、加缓存
中文效果差Embedding 模型不适配换中文 Embedding 模型

小结#

RAG 的完整链路:

文档 → 切分 → Embedding → 向量库
问题 → Embedding → 检索 → Rerank → Prompt → LLM → 带引用的答案

它解决了大模型的知识时效性幻觉两大问题,是落地知识库问答(企业文档、客服、法律、医疗)最主流的技术方案。掌握了 RAG,你就掌握了让大模型”用上你数据”的核心能力。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
RAG 检索增强生成原理与实践
https://nanxiaoxiong.com/posts/rag-principles/
作者
小熊
发布于
2026-08-16
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
小熊
Hello, I'm xiaoxiong.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
4
分类
1
标签
9
总字数
8,596
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录