RAG:从原理到工程实现

25 阅读14分钟

ChatGPT Image 2026年5月6日 14_56_30.png

一、RAG 解决了什么问题?

在 RAG 出现之前,依赖纯大模型的应用常常面临以下问题:

1. 知识过时(无法实时更新)

大模型的知识完全来源于其训练数据集。一旦训练完成,模型的知识库就固化了。这意味着它不知道最新的新闻事件(例如今天刚发生的科技突破),不了解你公司内部的规章制度、产品文档或项目报告,也无法获取刚刚更新的 API 接口文档或软件版本说明

解决:为模型接入一个可实时更新的外部知识库。RAG 正是实现这一目标的桥梁。

2. 幻觉问题(Hallucination)

大模型有时会"自信地"编造出看似合理但完全错误或不存在的事实、引用或数据。这在需要高准确性的场景(如客服、医疗、法律咨询)中是致命的。

解决:强制模型在生成答案前,先"查阅"权威的外部资料,并基于这些资料进行回答,从而将"凭空编造"转变为"有据可依"。

3. 无法使用私有/专有数据

每个企业、团队乃至个人都拥有大量未公开的私有数据,例如企业内部的知识库和Wiki、客户通信记录和合同,以及个人的笔记、邮件和收藏。传统的大模型无法直接访问这些数据,因为它们不在训练集中。微调(Fine-tuning)虽然是一种方法,但成本高、流程复杂,且难以频繁更新。

解决:通过 RAG,可以安全、灵活地将这些私有数据作为检索源,让大模型在需要时从中获取信息,而无需改变模型本身。

4. 上下文窗口(Context Window)有限

即使是最先进的长上下文模型,其能处理的 Token 数量也有上限。试图将整个数据库或长篇文档全部塞进提示(Prompt)中是不现实的,不仅会触及长度限制,还会带来极高的计算成本和响应延迟。

解决:RAG只检索与当前问题最相关的信息片段,将其作为上下文提供给模型。

总结: RAG 本质上是为大模型外挂了一个动态、可扩展、可控制的外部记忆系统,增强了大模型的表现。就像运动员穿更好的装备,可以发挥出更高的运动水平。


二、RAG 是什么?

RAG = Retrieval(检索) + Augmented(增强) + Generation(生成)

Retrieval(检索) :当用户提出一个问题时,系统会从一个庞大的知识库(通常是向量数据库)中寻找与问题语义最相关的文档片段。

Augmented(增强) :将检索到的相关文档片段作为额外的"上下文",与用户的原始问题一起构造成一个新的、信息更丰富的提示词。

Generation(生成) :大模型接收这个被"增强"后的提示词,基于其中提供的上下文信息生成准确、相关且有针对性的答案。

核心思想

先查询外部知识库获取相关事实,再基于这些事实组织语言生成答案。

与纯 LLM 的对比:

模式工作机制优点缺点
纯大模型完全依赖训练时记忆的参数化知识。响应速度快,通用性强。知识陈旧,易产生幻觉,无法访问私有数据。
RAG"检索" + "生成"。先查找资料,再基于资料回答。信息实时、准确、可溯源,支持私有数据。流程稍复杂,结果依赖检索质量。

三、RAG 基本流程详解

RAG 的完整流程可以分为两个主要阶段:离线准备阶段在线查询阶段

【离线阶段】文档 → 分片 → 向量化 → 建索引 (存入向量数据库)
【在线阶段】问题 → 向量化 → 召回 → 重排 → 构造提示 → 生成答案

阶段一:离线准备(数据索引)

这个阶段的目标是将原始知识(文档)处理成易于快速检索的格式。通常只需在数据更新时执行一次。本质上就是把文本处理为向量,之后存入向量数据库。

1. 文档加载与预处理

从各种来源(PDF、Word、网页、数据库)加载文档,并进行基础清洗(去除无关字符、格式化等)。

2. 文档分片(Chunking)

常见的分片策略包括:固定大小分片,即按固定Token数或字符数切割,这种方法简单但可能割裂语义完整的段落;基于分隔符分片,按段落、标题、句子等自然分隔符切割,能更好地保持语义完整性;滑动窗口分片,在固定大小分片的基础上让相邻分片有一定重叠,避免关键信息恰好被切在分片边缘;以及语义分片,使用模型判断语义边界进行切割,更智能但计算成本更高。

3. 向量化(Embedding)

使用 Embedding 模型(如 OpenAI 的 text-embedding-ada-002,或开源的 BGESentence Transformers)将每个文本分片转换为一个高维向量(例如,1536 维)。这个向量在数学空间中代表了该文本的语义

核心作用:将文本间的"语义相似度"比较,转化为向量间的距离计算(如余弦相似度、欧氏距离)。语义越相近的文本,其向量在空间中的距离就越近。

4. 存储与索引

将生成的向量及其对应的原始文本片段(以及元数据,如来源、标题、页码等)存储到向量数据库中。数据库会为这些向量建立高效的索引,以实现快速的近似最近邻搜索。常用的工具包括FAISS(Facebook)、Milvus、Pinecone(云服务)、Weaviate、Chroma(轻量级)等。

一个简化的向量数据库表示如下,其中每行左边是原始文本片段,右边是其对应的向量(此处为示意,实际向量维度很高):

原始文本片段对应向量(简化表示)
“RAG 通过检索外部知识来增强大模型的生成能力。”[0.23, -0.41, 0.89, -0.12, 0.05, ...]
“向量化(Embedding)将文本转换为高维空间中的点。”[-0.31, 0.77, 0.02, 0.45, -0.88, ...]
“检索时,系统计算查询向量与库中向量的相似度。”[0.12, -0.65, 0.33, 0.91, -0.27, ...]
“分片(Chunking)是将长文档切分为较小片段的过程。”[0.44, 0.18, -0.52, 0.07, 0.63, ...]

至此,知识库已经准备就绪,静待查询。

阶段二:在线查询(检索与生成)

这个阶段在用户每次提问时实时发生,目标是从已索引的知识中快速找到答案并生成回复

1. 查询向量化

将用户的自然语言问题(Query)使用与离线阶段相同的 Embedding 模型转换为一个查询向量。

2. 召回(Retrieval)

在向量数据库中进行相似性搜索。系统计算查询向量与数据库中所有存储向量之间的距离,返回距离最近(即语义最相似)的 Top-K 个文本分片。这就是初步的"候选集"。

3. 重排(Reranking)

初步召回基于向量相似度,这有时被称为"粗召回"。它可能因为语义匹配不够精确而引入一些相关性稍差的片段。 重排使用一个更精细的模型(通常是 Cross-Encoder,它能同时处理两个文本并直接输出相关性分数),对 Top-K 个候选片段进行重新打分和排序,筛选出最精准的 Top-N 个片段(通常 N < K)。可以理解为对召回的结果进行进一步筛选,找到最相关的片段。

4. 上下文构造与提示工程(Augment)

将重排后得到的最相关文本片段,与用户的原始问题结合起来,构造成一个给大模型的指令性提示(Prompt)。这是"增强"的具体体现。

一个经典的 Prompt 模板示例

你是一个专业的助手,请严格根据以下提供的上下文信息来回答问题。如果上下文中的信息不足以回答,请直接说明"根据已有信息无法回答该问题"。

上下文信息:
{片段1的文本内容}
{片段2的文本内容}
...
{片段N的文本内容}

用户问题:{用户原始问题}

请基于上述上下文信息回答:

5. 生成(Generation)

将构造好的提示发送给大模型(如 DeepSeek、GPT、Claude、本地部署的 Llama 等)。模型会基于你提供的上下文来生成答案,并在答案中引用或溯源这些上下文信息,从而极大地减少幻觉,提高可信度。

四、进阶方向与应用

RAG 本身是一个强大的范式,与其他技术结合可以产生更强大的应用:

混合搜索(Hybrid Search),结合稀疏检索(如基于关键词的BM25)和密集检索(向量检索),兼顾精确关键词匹配和深层语义匹配以提高召回率

多跳检索(Multi-hop Retrieval),对于复杂问题可能需要连续检索多个相关文档,像"侦探破案"一样逐步推理出最终答案

RAG与智能体(Agent)结合,让智能体主动使用RAG作为其"记忆"或"知识查询"工具,完成更复杂的任务规划与执行

多模态RAG,检索源不仅限于文本,还可以是图像、音频、视频的嵌入向量,实现跨模态的知识问答

递归检索与摘要,先检索大型分片定位范围,再在更细粒度上检索,或对检索到的内容进行摘要后再喂给模型

权限感知的RAG,在企业场景下根据用户身份动态过滤检索内容,实现数据安全


五、技术方案与实现选型

在构建一个完整的 RAG 系统时,每个环节都有多种技术选项。下面我们将按照 RAG 的标准流程,逐一介绍每个部分可以使用的具体技术、工具以及依赖的模型从哪里获取。

1. 文档加载(Document Loading)

目标:从各种格式和来源(PDF、Word、Excel、PPT、HTML、Markdown、数据库、API 等)中提取文本内容。

常用工具

  • LangChain:提供了丰富的 Document Loaders,支持上百种文件格式和外部服务(如 Google Drive、Notion、GitHub 等)。
  • LlamaIndex:内置了多种数据连接器(Data Connectors),可以轻松接入本地文件、云存储、知识库等。
  • Apache Tika:一个强大的内容分析工具包,特别适合解析复杂的办公文档格式。
  • Unstructured:专注于从非结构化文档(如 PDF、图片中的文字)中提取文本和元数据。

此阶段通常不涉及深度学习模型,主要依赖解析库。如需 OCR(光学字符识别),可选用 TesseractPaddleOCR 或云服务(如百度 OCR、腾讯 OCR)。

2. 文本分割(Text Chunking)

目标:将长文档切分成语义连贯、大小适中的片段(Chunks),以便后续向量化和检索。

常用工具

  • LangChain Text Splitters:支持按字符、Token、句子、段落分割,并提供递归分割、重叠窗口等高级功能。
  • LlamaIndex Node Parsers:除了基本分割,还能保留文档的层次结构(如标题、段落关系)。
  • 语义分割库:如 semantic-text-splitter,利用句子嵌入的相似度变化来寻找自然边界。

分割策略

  • 固定大小分片:简单,但可能割裂语义。
  • 基于分隔符分片:按段落、标题等自然分隔符切割。
  • 滑动窗口分片:保留相邻分片的重叠,避免边缘信息丢失。
  • 语义分片:使用轻量级模型判断语义边界,效果最佳但计算开销稍大。

模型依赖:语义分割可能需要一个小型的句子嵌入模型(例如 sentence-transformers/all-MiniLM-L6-v2)来计算句子间的相似度。这类模型可从 Hugging Face Hub 直接下载。

3. 向量化(Embedding)

目标:将文本片段转换为高维向量(嵌入),使得语义相似的文本在向量空间中距离相近。

常用模型与服务

  • OpenAI Embedding APItext-embedding-3-smalltext-embedding-3-large 等,性能稳定,但需调用 API 并付费。
  • 开源 Sentence Transformers 模型
    • BGE (BAAI/bge-large-zh):中文社区表现优异的模型。
    • all-MiniLM-L6-v2:轻量级,英文通用场景。
    • multilingual-e5:支持多语言。
    • GTE (General Text Embeddings):在检索任务上表现突出。
  • Cohere Embed API:提供多语言嵌入服务。
  • 云端厂商的嵌入服务:阿里云、腾讯云、百度文心等均提供了嵌入模型 API。

如何获取

  • 开源模型可通过 Hugging Face Hub 直接下载并使用 sentence-transformers 库加载。
  • API 服务需注册相应平台并获取 API Key。

4. 向量存储(Vector Storage)

目标:存储向量和对应的原始文本及元数据,并提供高效的相似性搜索(近似最近邻,ANN)能力。

常用数据库

  • 本地/自托管
    • FAISS(Facebook):高性能向量检索库,适合单机或小规模部署。
    • Chroma:轻量级,易于使用,内置简单的持久化和查询接口。
    • Qdrant:支持丰富的数据类型和过滤条件,性能优秀。
    • Milvus:专为大规模向量搜索设计,支持分布式部署和丰富的索引算法。
    • Weaviate:兼具向量搜索和图数据库能力,支持模块化扩展。
  • 云托管服务
    • Pinecone:全托管向量数据库,无需运维,弹性伸缩。
    • Zilliz Cloud(基于 Milvus):提供云原生的 Milvus 服务。
    • 阿里云 OpenSearch腾讯云 VectorDB:国内云厂商的向量检索服务。

选择建议:根据数据规模、性能要求、运维能力和预算进行选择。

5. 检索(Retrieval)

目标:给定查询向量,从向量数据库中快速找出最相似的 Top-K 个文本片段。

技术实现

  • 相似度度量:余弦相似度(最常用)、内积、欧氏距离。
  • 索引算法:HNSW(Hierarchical Navigable Small World)、IVF(Inverted File Index)、PQ(Product Quantization)等,这些已在向量数据库内部实现。
  • 混合检索(Hybrid Search):结合密集检索(向量相似度)和稀疏检索(如 BM25 关键词匹配),可显著提升召回率。工具如 rank_bm25Elasticsearch

工具集成:大多数向量数据库已内置高效的 ANN 检索接口。LangChain 和 LlamaIndex 也提供了统一的检索器抽象,方便切换后端。

6. 重排(Reranking)

目标:对初步召回的 Top-K 个结果进行精细化排序,筛选出最相关的 Top-N 个片段(N<K),提升最终答案的准确性。

常用模型

  • Cross-Encoder:一种能够同时编码两个文本并直接输出相关性分数的模型,比双塔式 Embedding 模型更精准。
    • MS-MARCO 系列:如 cross-encoder/ms-marco-MiniLM-L-6-v2,在英文检索数据集上训练。
    • BGE Reranker:BAAI 发布的专门用于重排的模型,支持中英文。
    • Cohere Rerank API:云服务,简单易用。
  • 其他方法:也可使用更强大的 LLM(如 GPT)对候选片段进行相关性评估,但成本较高。

如何获取:Cross-Encoder 模型同样可从 Hugging Face Hub 下载,并使用 sentence-transformers 库加载。

7. 生成(Generation)

目标:基于检索和重排得到的上下文,生成自然、准确、符合要求的答案。

常用模型

  • 云端大模型 API
    • OpenAI GPT 系列
    • DeepSeek API(DeepSeek-V4-pro)
    • Claude API(Claude Sonnet,Claude Opus)
    • 百度文心一言阿里通义千问腾讯混元等国内大模型
  • 开源大模型(本地部署)
    • Llama 系列(Llama 4等)
    • ChatGLM(智谱 AI)
    • Qwen(通义千问开源版)
    • Yi(零一万物)
    • Mistral 系列

提示词工程:构造清晰的 Prompt 模板,指示模型严格依据上下文回答,并注明引用来源。这是 RAG 生成质量的关键。

8. 模型来源与依赖汇总

组件主要模型/工具来源/获取方式
文档加载LangChain, LlamaIndex, Apache TikaGitHub, 官方文档,包管理器(pip, npm)
文本分割LangChain Text Splitters, 语义分割器同上,Hugging Face Hub(用于语义分割模型)
向量化OpenAI Embedding, Sentence Transformers (BGE, all-MiniLM)Hugging Face Hub, OpenAI API, 各云平台
向量存储FAISS, Chroma, Milvus, PineconeGitHub, 官方文档,云控制台
检索向量数据库内置索引,BM25同上
重排Cross-Encoder, BGE RerankerHugging Face Hub, Cohere API
生成GPT-4, Claude, Llama, DeepSeek各大模型平台 API,Hugging Face Hub(开源模型)

部署建议

  • 快速原型:使用 LangChain/LlamaIndex + OpenAI API + Chroma,几行代码即可搭建。
  • 生产级、注重成本与数据安全:采用开源模型(如 BGE + Llama)本地部署,搭配 Milvus 或 Qdrant 作为向量数据库。
  • 企业级、需要高可用与弹性:选择云托管服务(Pinecone、Zilliz Cloud)结合云厂商的大模型 API。