一文带你了解RAG(检索增强生成) | 概念理论介绍+ 代码实操
一、LLMs 已经具备了较强能力了,为什么还需要 RAG(检索增强生成)?
别看现在的 LLM 已经能写诗、编代码、聊人生,但真要落地到实际业务里,下面这几个坑依然绕不过去:
- :LLM 本质上是个“高级概率生成器”,逐词猜出来的内容,看着头头是道,其实很可能是在一本正经地胡编乱造。这种“郑重其事的虚构陈述”在关键场景下是要命的。
幻觉问题
- :模型越大,训练越贵、周期越长。最新出的电影、刚发生的新闻,想塞进模型?等训练完黄花菜都凉了。所以问“推荐几部热映电影”这种问题,LLM 基本抓瞎。
时效性问题
- :通用的 LLM 压根不知道你企业内部的数据长啥样。企业想用 LLM 又怕泄露机密,最稳妥的办法就是把数据全搁本地,业务计算本地跑,只让在线模型做归纳总结——这就得靠 RAG 来搭桥了。
数据安全问题
说白了,LLM 很强,但光靠它自己还不够稳、不够新、不够安全。这时候就需要 RAG 上场补位。
二、介绍一下 RAG?
RAG(Retrieval Augmented Generation,检索增强生成)是一种技术框架。核心思路很简单:当 LLM 要回答问题或写东西时,先不急着开编,而是去一个大规模文档库里搜一搜,找出跟任务最相关的素材,然后照着这些素材来生成答案。这样出来的结果,准确性和可靠性都高出一大截。
RAG 技术架构图
三、RAG 主要包含哪些模块?
一个完整的 RAG 系统通常覆盖下面几个关键模块:
模块一:版面分析
- 本地知识文件读取(pdf、txt、html、doc、excel、png、jpg、语音等)
- 知识文件复原
模块二:知识库构建
- 知识文本分割,并构建 Doc 文本
- Doc 文本 embedding
- Doc 文本构建索引
模块三:大模型微调
模块四:基于 RAG 的知识问答
- 用户 query embedding
- query 召回
- query 排序
- 将 Top K 个相关的 Doc 进行拼接,构建 context
- 基于 query 和 context 构建 Prompt
- 将 prompt 喂给大模型生成答案
四、RAG 相较于直接使用 LLMs 进行问答有哪些优点?
RAG 最大的魅力在于:开发者不用为了每个新任务都重新训一遍大模型,只要连上外部知识库,就能给模型注入新鲜血液。这在高度依赖专业知识的场景下尤其好使。具体优点可以列一长串:
- :模型小、训练便宜,知识库扩容更新也简单。
可扩展性
- :引用信息来源,用户能自己查证答案靠不靠谱,信任感自然上来。
准确性
- :知识想更新?想定制?随时调。
可控性
- :模型预测时用了哪些检索条目,一目了然,透明度拉满。
可解释性
- :问答、摘要、对话……各种场景都能微调定制。
多功能性
- :检索方式能抓最新信息,比死磕训练数据的老模型强太多。
时效性
- :对接特定行业的数据集,提供“专业对口”的知识支持。
领域定制性
- :数据库层面做角色划分、权限管控,比微调模型那种糊里糊涂的数据管理安全得多。
安全性
五、对比一下 RAG 和 SFT,说一下两者有哪些区别?
前面提到的 LLM 那些毛病,SFT(有监督微调)其实是最常见、最基本的解决办法,也是 LLM 落地的关键一步。那两者到底有啥区别?下面从多个维度掰扯一下。当然,这两种方法不是非此即彼,最聪明的做法是把业务需求和两者的优点结合起来,合理搭配着用。
模块一:版面分析
为什么需要版面分析?
RAG 的核心确实是检索+生成,但在文档解析、智能写作、对话系统这些具体场景里,面对的是各种结构化或半结构化的信息。这类信息往往嵌在特定的排版里,要真搞懂它们,就得深入理解页面元素和相互关系。
尤其是当数据源五花八门——网页、PDF、富文本、Word、图片、语音、表格……单靠纯文本处理根本不够用。具备基本的版面分析能力,才能高效地吃进这些多模态内容,精准解析每个信息单元,最后揉成一个有意义的整体。
step 1:本地知识文件获取
q1:如何进行本地知识文件获取?
本地知识文件获取要处理多种数据源(.txt、.pdf、.html、.doc、.xlsx、.png、.jpg、音频等)。不同文件类型需要不同的访问和解析策略。下面分门别类说说获取方法和难点。
q2:如何获取富文本 txt 中内容?
- :富文本主要存在 txt 文件里,排版比较规整,获取方式也简单。
介绍
- :
实战技巧
- 【版面分析——富文本txt读取】
q3:如何获取 PDF 文档中内容?
- :PDF 里的数据比较复杂,文本、图片、表格混在一起,解析起来挺麻烦。
介绍
- :
实战技巧
- 【版面分析——PDF 解析神器 pdfplumber】
- 【版面分析——PDF 解析神器 PyMuPDF】
q4:如何获取 HTML 文档中内容?
- :HTML 文档同样包含文本、图片、表格等多种元素,解析难度不小。
介绍
- :
实战技巧
- 【版面分析——网页HTML解析 BeautifulSoup】
q5:如何获取 Doc 文档中内容?
- :Doc 文档(Word)结构复杂,文本、图片、表格都有,不好对付。
介绍
- :
实战技巧
- 【版面分析——Docx 解析神器 python-docx】
q6:如何使用 OCR 获取图片内容?
- :OCR(光学字符识别)就是把图片里的文字识别出来,以文本形式返回。简单说就是“让机器看懂图片里的字”。
介绍
- :
思路
- 文字检测:先找哪里有字,字在什么位置。
- 文字识别:再识别这些字是什么,转成字符。
- :Tesseract、PaddleOCR、EasyOCR、chineseocr、chineseocr_lite、TrWebOCR、cnocr、hn_ocr
目前开源的 OCR 项目
- :
理论学习
- 【版面分析——图片解析神器 OCR】
- :
实战技巧
- 【版面分析——OCR神器 tesseract】
- 【版面分析——OCR神器 PaddleOCR】
- 【版面分析——OCR神器 hn_ocr】
q7:如何使用 ASR 获取语音内容?
- :自动语音识别(Automatic Speech Recognition,ASR)
别称
- :把语音信号转成对应的文本,好比给机器装了个“听觉系统”,让机器听懂人话。
介绍
- :把人类语音中的词汇内容变成计算机可读的输入(比如按键、二进制编码或字符序列)。
目标
- :
思路
- 声学信号预处理:滤波、分帧,把有用信号提取出来。
- 特征提取:从时域转到频域,供声学模型使用。
- 声学模型:计算每个特征向量在声学上的得分。
- 语言模型:算一算可能的词组序列概率。
- 字典与解码:结合字典,最终得到文本。
- :
理论教程
- 【版面分析 之 语音识别】
- :
实战技巧
- 【版面分析 之 Speech-to-Text】
- 【版面分析 之 WeTextProcessing】
- 【版面分析——ASR神器 Wenet】
- 【版面分析 之 ASR神器训练】
step 2:知识文件复原
q1:为什么需要进行知识文件复原?
在读取各种源文件(txt、pdf、html、doc、excel、png、jpg、语音等)时,很多工具会把一个完整的段落拆成好几段,导致内容逻辑断裂。所以需要根据内容的逻辑重新把段落组织起来。
q2:如何对知识文件进行复原?
- 方法一:基于规则的知识文件复原
- 方法二:基于 Bert NSP 进行上下句拼接
step 3:版面分析——优化策略篇
- :
理论学习
- 【版面分析——优化策略篇】
step 4:Homework
- :使用上述方法对【SMP 2023 ChatGLM金融大模型挑战赛】的【ChatGLM评估挑战赛-金融赛道数据集】进行版面分析。
任务描述
- :分析各种方法的效果和性能。
任务效果
模块二:知识库构建
为什么需要知识库构建?
在 RAG 里构建知识库至关重要,原因如下:
- :大模型训练数据的覆盖范围有限,知识库能补充短板,让模型检索到最新、最准确的信息。
扩展模型能力
- :知识库可以随时更新,应对新闻、科技等时效性强的场景。
实时更新信息
- :检索+生成双保险,答案不依赖模型内部参数,还靠外部可靠来源。
提高准确性
- :引用确切证据,降低模型胡编乱造的风险。
减少过拟合与幻觉
- :答案能指出来源,透明又可信。
增强可解释性
- :企业或个人可以建专属知识库,让大模型更贴合特定场景。
支持个性化及私有化
总之,知识库是 RAG 实现精准检索+生成的核心底座,极大提升实际性能。
step 1:知识文本分块
为什么需要对文本分块?
- :直接对整个文档做 embedding,虽然能把握整体上下文,但可能忽略针对特定主题的重要信息。
信息丢失的风险
- :像 GPT-4 有 32K 的窗口限制,一开始就得考虑分块。
分块大小的限制
- :
主要考虑两个因素
- embedding 模型的 Tokens 限制情况。
- 语义完整性对检索效果的影响。
- :
实战技巧
- 【知识库构建——知识文本分块】
- 【知识库构建——文档切分优化策略篇】
step 2:Docs 向量化(Embedding)
q1:什么是 Docs 向量化(Embedding)?
Embedding 就是用密集的浮点数向量来表示文本的语义信息。向量空间中两个嵌入之间的距离,对应了原始文本的语义相似度。简单说,如果两个文本意思相近,它们的向量表示也应该挨得近;意思差得远,向量就离得远。
比如,两个文本相似,它们的向量表示也相似,这组数组描述了文本之间的细微语义差异。
Embedding 帮计算机理解“含义”,常用于搜索、推荐、分类、聚类等场景。

q2:Embedding 是如何工作的?
举个例子,这三句话:
- “The cat chases the mouse”(猫追逐老鼠)
- “The kitten hunts rodents”(小猫捕猎老鼠)
- “I like ham sandwiches”(我喜欢火腿三明治)
人类一眼就能看出前两句意思差不多,第三句完全无关。但计算机看英文原文,前两句只有“The”相同,它怎么知道意思相近?Embedding 会把离散的单词压缩成连续数值向量,然后画在图上,结果前两句靠得很近,第三句远远地待着。如果再来一句“Sally 吃了瑞士奶酪”,它可能落在第三句(奶酪放三明治上)和第一句(老鼠爱瑞士奶酪)之间。

q3:Embedding 的语义检索对比关键词检索的优势?
- :捕捉词汇间的语义关系,而关键词检索只关心字面匹配。
语义理解
- :能处理拼写错误、同义词、近义词,关键词检索就弱了。
容错性
- :用中文搜英文内容都行,关键词检索很难做到。
多语言支持
- :一词多义时,Embedding 能根据上下文给不同向量,关键词检索分不清。
语境理解
q4:Embedding 检索存在哪些限制?
- :即使用了 Embedding,Top-K 阈值依然会漏掉一些信息。
输入词数限制
- :现在的 GPT-3.5 等还不支持图像理解,而很多关键信息(如论文示意图、财务图表)需要图文结合才能搞懂。
仅支持文本数据
- :检索到的资料不够用时,模型可能会“即兴创作”,在有限信息上瞎猜。
大模型的胡编乱造
- :
理论学习
- 【知识库构建—Doc 向量化】
- :
实战技巧
- 【Docs向量化——腾讯词向量】
- 【Docs向量化——sbert】
- 【Docs向量化——SimCSE】
- 【Docs向量化——text2vec】
- 【Docs向量化——SGPT】
- 【Docs向量化——BGE —— 智源开源最强语义向量模型】
- 【Docs向量化——M3E:一种大规模混合embedding】
step 3:Docs 构建索引
- :
介绍
- :
实战技巧
- 【Docs构建索引——Faiss】
- 【Docs构建索引——milvus】
- 【Docs构建索引—— Elasticsearch】
模块三:大模型微调
为什么需要大模型微调?
微调大模型,通常有这几个理由:
- :大模型参数量巨大,每家公司都从头训练一个,性价比太低。
成本
- :Prompt Engineering 虽然好上手,但会把输入搞得很长。越长的 Prompt,推理成本越高(跟长度平方成正比),还可能被截断导致输出质量打折。个人用用还行,但对提供服务的企业来说,推理成本是不得不算的账,微调反而更优。
Prompt 太长
- :Prompt Engineering 效果达不到要求,而企业有优质自有数据,微调能更好地提升特定领域能力。
效果不够
- :要为每个用户定制服务时,微调一个轻量级模型是个好方案。
个性化
- :数据不能传给第三方大模型,就得自己搭开源模型,再用自有数据微调才能满足业务。
数据安全
如何对大模型进行微调?
q1:大模型的微调技术路线问题
从参数规模看,微调有两条路线:
- :对所有参数进行全量训练。
全量微调 FFT(Full Fine Tuning)
- :只训练部分参数。
参数高效微调 PEFT(Parameter-Efficient Fine Tuning)
q2:大模型的全量微调 FFT 技术存在哪些问题?
- :微调的参数量和预训练一样多。
训练成本高
- :用特定数据微调后,这个领域表现好了,但原来擅长的其他领域可能变差。
灾难性遗忘(Catastrophic Forgetting)
q3:大模型的 PEFT 解决哪些问题?
PEFT 主要就是为了解决 FFT 的两个痛点,也是目前的主流方案。从训练数据和训练方法的角度,微调有以下几条路线:
- :用人工标注数据,做监督学习。
SFT(Supervised Fine Tuning)
- :把人类反馈引入强化学习,让模型输出更符合人类期望。
RLHF(Reinforcement Learning with Human Feedback)
- :原理和 RLHF 类似,但反馈来自 AI,目的是降低收集人类反馈的成本、提高效率。
RLAIF(Reinforcement Learning with AI Feedback)
不同的分类只是侧重点不同,微调不局限于单一方案,可以多个方案一起上。最终目标是在可控成本下,尽可能提升大模型在特定领域的能力。
大模型 LLM 进行 SFT 操作的时候在学习什么?
- → 在大量无监督数据上预训练,得到基础模型,作为 SFT 和 RLHF 的起点。
预训练
- → 在有监督数据集上训练,利用上下文信息等监督信号进一步优化,作为 RLHF 的起点。
SFT
- → 利用人类反馈强化学习,优化模型以适应人类意图,最后评估调整。
RLHF
step 1:大模型微调训练数据构建
- :如何构建训练数据?
介绍
- :
实战技巧
- 【大模型(LLMs)LLM生成SFT数据方法篇】
step 2:大模型指令微调篇
- :如何构建训练数据?
介绍
- :
实战技巧
- 【大模型(LLMs)继续预训练篇】
- 【大模型(LLMs)指令微调篇】
- 【大模型(LLMs)奖励模型训练篇】
- 【大模型(LLMs)强化学习——PPO训练篇】
- 【大模型(LLMs)强化学习——DPO训练篇】
模块四:文档检索
为什么需要文档检索?
文档检索是 RAG 的核心,效果直接影响下游任务。虽然可以用向量召回从文档库里捞相关片段,再喂给 LLM 提高回答质量,但用户的问题常常口语化、模糊不清,这就会拉低召回质量,拖累模型回答。本章主要介绍文档检索过程中的常见问题和对策。
step 1:文档检索负样本样本挖掘
- :要训练高质量的检索模型,需要从大量候选样本中挑出高质量的负例,配合正例一起训练。
介绍
- :
实战技巧
- 【文档检索——负样本样本挖掘篇】
step 2:文档检索优化策略
- :优化策略。
介绍
- :
实战技巧
- 【文档检索——文档检索优化策略篇】
模块五:Reranker
为什么需要 Reranker?
基础 RAG 应用有四个关键部件:Embedding 模型、向量数据库、提示词工程、LLM。这套架构能解决幻觉问题,但企业客户对相关性和准确度要求更高,一个流行做法就是集成 Reranker。
什么是 Reranker?
Reranker 是信息检索里用来给搜索结果重新排序的组件。在 RAG 里,拿到向量检索(ANN)的结果后,用 Reranker 能更精准地判断文档和查询之间的语义相关性,从而提高最终搜索质量。
step 1:Reranker 篇
- :
理论学习
- 【RAG文档检索——Reranker 篇】
- :
实战技巧
- 【Reranker——bge-reranker篇】
模块六:RAG 评测面
为什么需要对 RAG 进行评测?
在探索和优化 RAG 的过程中,有效评估其性能是关键问题。
step 1:RAG 评测篇
- :
理论学习
- 【RAG评测篇】
模块七:RAG 开源项目推荐学习
为什么需要推荐学习 RAG 开源项目?
前面已经带你走完了 RAG 的全流程,下面推荐几个热门开源项目,方便大家消化和实践。
RAG 开源项目推荐 —— RAGFlow 篇
- :RAGFlow 是一款基于深度文档理解的开源 RAG 引擎,适合各种规模的企业和个人。它提供了一套精简的 RAG 工作流,结合大语言模型,能针对复杂格式数据给出可靠问答,并附带引用来源。
介绍
- :
项目学习
- 【RAG 项目推荐——RagFlow 篇(一)——RagFlow docker 部署】
- 【RAG 项目推荐——RagFlow 篇(二)——RagFlow 知识库构建】
- 【RAG 项目推荐——RagFlow 篇(三)——RagFlow 模型供应商选择】
- 【RAG 项目推荐——RagFlow 篇(四)——RagFlow 对话】
- 【RAG 项目推荐——RagFlow 篇(五)——RAGFlow Api 接入(以 ollama 为例)】
- 【RAG 项目推荐——RagFlow 篇(六)——RAGFlow 源码学习】
RAG 开源项目推荐 —— QAnything 篇
- :QAnything(Question and Answer based on Anything)是一个本地知识库问答系统,支持多种文件格式和数据库,可离线安装使用。只需把各种格式的文件丢进去,就能获得准确、快速、可靠的答案。支持的格式包括 PDF、Word、PPT、Excel、Markdown、Email、TXT、Image、CSV、网页链接等。
介绍
- :
项目学习
- 【RAG 开源项目推荐 —— QAnything 篇】
RAG 开源项目推荐 —— ElasticSearch-Langchain 篇
- :受 Langchain-ChatGLM 启发,由于 Elasticsearch 支持文本和向量混合查询,且在业务中使用广泛,本项目用 Elasticsearch 替代 Faiss 作为知识存储库,利用 Langchain+Chatglm2 实现基于私有知识库的智能问答。
介绍
- :
项目学习
- 【【LLMs 入门实战】基于 本地知识库 的高效 ElasticSearch-Langchain-Chatglm2】
RAG 开源项目推荐 —— Langchain-Chatchat 篇
- :Langchain-Chatchat(原名 Langchain-ChatGLM)基于 Langchain 与 ChatGLM 等语言模型,实现本地知识库问答。
介绍
- :
项目学习
- 【【LLMs 入门实战】基于 本地知识库 的高效 Langchain-Chatchat】
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名