RAG (Retrieval-Augmented Generation)

在大模型(LLM)飞速发展的今天,我们经常会遇到模型“一本正经地胡说八道”(即幻觉),或者模型无法回答关于最新事件和企业内部私有数据的问题。为了解决这些痛点,RAG技术应运而生。


什么是 RAG?

RAG (Retrieval-Augmented Generation),中文译为“检索增强生成”。它是一种结合了信息检索系统大型语言模型(LLM)生成能力的先进 AI 架构。

如果把大模型比作一个博览群书但记忆停留在某一时刻的闭卷考试学生,那么 RAG 就是赋予了这个学生开卷考试的特权。当被问到不熟悉或最新的问题时,RAG 系统会先去外挂的“参考书”(知识库)里检索出相关的资料,然后把问题和查到的资料一起交给大模型,让它基于这些准确、新鲜的参考内容来总结并作答。

RAG 解决了什么痛点?(RAG vs 微调)

RAG 的出现主要解决了传统大语言模型在实际落地时面临的几个核心痛点。相较于高成本的模型微调(Fine-Tuning),RAG 提供了一条更轻量、高效的路径。

比较维度 传统大模型 (仅依赖预训练权重) 模型微调 (Fine-tuning) RAG (检索增强生成)
知识更新 很难,需重新训练模型 较慢,需要重新准备数据集并微调 极快,只需更新知识库文档即可
产生“幻觉” 容易凭空捏造答案 依然存在幻觉风险 显著降低,回答有事实依据可查
数据安全性 无法处理私有数据 数据融入模型权重,存在泄露风险 极高,私有数据隔离在本地数据库中
硬件与成本 无额外成本但效果受限 成本极高,需大量算力和时间 成本极低,仅需额外的存储和检索开销

RAG 的工作原理

RAG 的核心流程通常可以分为三个主要阶段:数据索引(Indexing)检索(Retrieval)生成(Generation)

我们可以通过以下的架构流程图来直观地理解其运作机制:

  graph TD
    classDef blue fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
    classDef green fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px;
    classDef orange fill:#fff3e0,stroke:#e65100,stroke-width:2px;
    
    subgraph Indexing ["阶段一:数据索引 (Data Indexing)"]
        A["各种格式文档<br>PDF/Word/网页"] -->|"1. 提取与清理"| B("文档分割 Chunking")
        B -->|"2. 向量化"| C("Embedding 模型")
        C -->|"3. 存储"| D[("向量数据库 Vector DB")]
    end
    class A,B,C,D blue;

    subgraph Retrieval ["阶段二:检索 (Retrieval)"]
        E["用户的实际提问<br>User Query"] -->|"4. 向量化"| F("查询向量")
        F -->|"5. 计算相似度"| G{"向量检索 Top-K"}
        D -.->|"提供数据检索"| G
        G -->|"6. 返回相关内容片段"| H["组装 Prompt 提示词<br>(问题 + 参考资料)"]
        E -->|"原始问题"| H
    end
    class E,F,G orange;

    subgraph Generation ["阶段三:生成 (Generation)"]
        H -->|"7. 推理"| I(("大语言模型 LLM"))
        I -->|"8. 输出"| J["最终精准回答"]
    end
    class H,I,J green;

深入解析三大阶段:

  1. 阶段一:数据索引 (Indexing) - “建立私人图书馆”

    • 文档解析与提取: 企业的原始数据格式繁多(如 PDF、Word、PPT、HTML、Markdown 甚至扫描图片)。通常需要使用 Unstructured.ioPyMuPDF 等解析库或 OCR 技术,将这些异构数据提取、清洗为大模型更易理解的纯文本(Plain Text)或 Markdown 格式
    • 文档分割 (Chunking): 由于大模型有输入长度限制,我们需要将长文本切分成大小合适的小块(Chunks)。如果块太大,检索不到精准细节;如果太小,又丢失了上下文语义。
      • 主流切块工具: 开发者通常直接调用 LangChain(例如其极其常用的 RecursiveCharacterTextSplitter)或 LlamaIndex 框架中内置的文档分割器,或者使用 OpenAI 提供的 tiktoken 库按 Token 数量精确切分。
      • 切块策略: 最经典的做法是设置一个重叠率(Chunk Overlap)(比如每块 500 字,相邻两块保留 50 字的重叠片段),以防止一句话恰好在分界处被生硬切断。
    • 向量化 (Embedding): 这一步是让计算机“理解语义”的关键魔法。由于计算机不认识我们人类的字符,只懂数值计算,因此 Embedding 模型的作用就是把切分好的文本块,转换成一个包含数百或数千个浮点数的数组,我们称之为向量 (Vector)
      • 具体是如何转换的?
        1. 分词 (Tokenization): 首先将这段文本切分为更小的单位“词元 (Token)”,并根据词表将每个词元转换为对应的数字 ID。
        2. 前向传播 (神经网络计算): 将这些数字 ID 送入一个预先经过海量文本训练的深度神经网络(通常是基于 Transformer 的架构,如 BERT)。
        3. 提取特征特征 (Pooling层输出): 神经网络在逐层理解文本上下文后,会提取这段话的核心语义特征,最终在最后一层压缩并输出为一个固定长度(比如 768 维或 1536 维)的浮点数数组。这个不可读的数组,就是这段文本的“语义指纹”。
      • 原理解释: 你可以把这个过程想象成在一个极其复杂的“多维空间地图”里,为每一段文本寻找一个精准的坐标点。在这个高维空间中,语义越相近的句子,它们的空间距离就越近
      • 生动举例: “苹果很好吃”和“香蕉很甜”这两个句子都在描述水果口感,它们的向量距离会很近;而“苹果刚发布了新款手机”虽然也带有“苹果”二字,但在空间里会远离前者,靠近“科技模型”等坐标。这正是基于语义的向量搜索比传统的“关键字匹配”更聪明的地方。
      • 主流模型代表: OpenAI 的 text-embedding-3 系列、开源界表现优异的 BGE 系列(如智源 bge-m3)、通义千问 Qwen-Embedding 等。
    • 向量与 Chunk 的映射存储 (向量数据库): 算出了向量,怎么在检索时找回原来的文字呢?我们需要专门的向量数据库(如 Milvus, Pinecone, Qdrant, Chroma)来进行映射和存储。在数据库中,数据记录通常包含以下几个核心部分以建立它们之间的关联:
      • 唯一标识 (ID): 为每个被切分好的 Chunk 分配一个全局唯一的 ID。
      • 向量字段 (Vector): 存放 Embedding 模型算出来的一长串浮点数数组,作为该对象在数据库里的“数学坐标”,引擎专看此字段计算相似度。
      • 负载 / 元数据 (Payload/Metadata): 这是至关重要的一环。这里不仅要原封不动地存入原始的 Chunk 文本(检索到后最终要原样送给大模型阅读),通常还会存入该文本的各种属性与来源信息(文档名称、PDF 页码、作者、更新时间等)。
      • 关联回溯过程: 检索时,引擎只会拿用户问题的“向量”去数据库里和那堆“向量字段”比对距离。一旦发现几个靠得很近的向量,就会拿它们的 ID,顺藤摸瓜地提取出绑定在同一记录里的 Payload(它对应的原始文字和出处),从而实现了从“抽象的数学数组”重新回退关联到“人类阅读的具体段落”。
  2. 阶段二:检索 (Retrieval) - “寻找解题线索”

    • 用户提出问题后,系统先将问题同样进行向量化
    • 接着在向量数据库中进行距离计算(如余弦相似度),召回排名最靠前的(Top-K)几个相关内容片段。
  3. 阶段三:生成 (Generation) - “提炼并撰写答案”

    • 系统将用户的原始问题与检索出的 Top-K 个内容片段拼接成一个庞大且信息丰富的 Prompt(提示词)。
    • 提示词示例:“请你作为一个 AI 助手,仅基于以下提供的上下文资料来回答用户问题。上下文资料:[检索到的片段1, 片段2…]。用户问题:[XXX]”
    • 将 Prompt 交给 LLM(如 GPT-4),大模型就会化身为一台强大的“阅读理解器”,给出一份有理有据的答卷。

进阶:什么是 Advanced RAG?

随着技术演进,为了应对复杂问题,基础的 Naive RAG 正在向 Advanced RAG (高级 RAG) 演变,主要加入了以下技术提升效果:

  • Query Rewrite(查询重写): 用户的提问往往过于简短或有语病,先用小模型把用户问题扩写或纠错,以提高检索命中率。
  • Re-ranking(重排序): 向量检索找回来的 Top-10 片段,可能并非对生成回答最有用。加入一个排序模型(如 BGE-Reranker),对这 10 个片段进行一次精细打分排序,把最关键的送给大模型。
  • Multi-Agent RAG(多智能体检索): 遇到极复杂问题时,让不同的 Agent 负责不同的知识库检索(比如一个查财务报表数据库,一个查新闻网页),最后汇总作答。

RAG 的典型应用场景

  • 🏢 企业内部大脑(知识问答助理): 过去新员工培训需要手翻各类员工手册,现在直接向 RAG 机器人提问“出差报销流程是什么?最高额度多少?”,它会立刻根据最新财务制度给出含引用来源的答复。
  • 🎧 智能客服与售后引擎: 结合海量历史工单和产品说明手册,打造能处理复杂长尾问题的售后客服系统,显著降低人工成本。
  • ⚖️ 司法与医疗垂类应用: 律师可以利用 RAG 系统从浩如烟海的过往卷宗和法律条文中快速查找司法判例;医生也可以通过检索最新医学文献库来辅助疑难杂症的诊断。
  • 🔍 新一代搜索引擎: 像 Perplexity、知乎直答等产品,改变了搜索引擎以往只给出一堆蓝色链接的习惯,直接将搜到的多篇相关网页丢进 RAG 处理,直接为你输出一篇有引用的解答小短文。

总结

RAG 为大模型赋予了“开卷考试”的能力,是目前让通用大语言模型落地到垂直行业、处理企业私有知识最有效、性价比最高的工业界标准方案。随着向量检索技术、Context Window(上下文窗口)扩展以及多模态技术的发展,RAG 必将在更多复杂的应用场景下大放异彩。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计