RAG 检索增强生成原理与实践
为什么需要 RAG
大语言模型有两个致命短板:
- 知识截止:训练数据是某个时间点之前抓取的,之后发生的事(新闻、新版本、公司内部文档)一概不知
- 幻觉:模型不知道答案时不会说”我不知道”,而是会一本正经地编造
RAG(Retrieval-Augmented Generation,检索增强生成)的思路很朴素:模型不知道,那就先查资料,把资料塞进上下文里,再让它基于资料回答。就像开卷考试——模型是考生,检索系统是它的笔记本。
RAG 整体流程
一个标准的 RAG 系统分两个阶段:
阶段一:离线索引(建库)
- 收集文档(PDF、网页、Markdown、数据库记录……)
- 清洗文本(去页眉页脚、去重、格式统一)
- 切分(Chunking):把长文档切成小块
- 向量化(Embedding):每块文本转成一个向量
- 存入向量数据库,建立索引(便于 ANN 近似最近邻检索)
阶段二:在线查询(问答)
- 用户提问
- 把问题向量化(用同一个 Embedding 模型)
- 在向量库里检索 top-k 最相似的文本块
- 把检索结果拼进 Prompt,与问题一起发给 LLM
- 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,你就掌握了让大模型”用上你数据”的核心能力。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!


