RAG 是一种结合 “检索” + “大语言模型生成” 的技术框架。它的核心思想是:

在回答用户问题前,先从大量文档中找出最相关的片段,再把这些片段喂给大模型,让它基于真实信息生成答案。

这样可以避免大模型“胡说八道”(幻觉),提高回答的准确性。

RAG 分为两个阶段:

  1. 离线阶段(Offline / Indexing Phase) —— 提前准备数据
  2. 在线阶段(Online / Inference Phase) —— 实时响应用户

离线阶段(Offline / Indexing Phase)

流程步骤:

步骤 名称 作用 输出
1 数据采集 从 PDF、网页、数据库等获取原始文档 原始文本集合
2 数据清洗 去除 HTML 标签、广告、乱码、重复内容等 干净文本
3 数据分块(Chunking) 将长文本切分为适合模型处理的小段(如 256~1024 tokens) 文本块列表(chunks)
4 向量化(Embedding) 用 Embedding 模型将每个文本块转为高维向量 向量列表(embeddings)
5 存入向量数据库 <文本块, 向量> 对存储到向量数据库(如 FAISS、Milvus、Pinecone) 可检索的向量索引

关键输出:一个向量数据库,里面存着所有知识的“数学表示”。

在线阶段(Online / Inference Phase)

流程步骤:

步骤 名称 作用
1 接收用户问题 如:“什么是 RAG?”
2 问题向量化 同一个 Embedding 模型将问题转为向量
3 向量检索(Similarity Search) 在向量数据库中找与问题向量最相似的 Top-K 文本块
4 构建 Prompt 将检索到的文本块 + 用户问题 组合成提示: “根据以下资料回答:[资料]… 问题:[用户问题]”
5 大模型生成答案 将 Prompt 输入 LLM(如 GPT、Llama),生成最终回答
6 返回结果给用户 展示自然语言答案

关键特点:整个过程通常在 1~3 秒内完成

Embedding 模型是怎么工作的

一段文字映射成一个固定长度的数字向量(如 768 维)。

向量能捕捉语义信息:语义越相近,向量在空间中越靠近。

工作原理(简化):

  1. 输入:一段文本(如 “猫喜欢抓老鼠”)

  2. 分词:拆成 token(如 ["猫", "喜欢", "抓", "老鼠"]

  3. 神经网络编码:通过预训练的语言模型(如 BERT、Sentence-BERT、text-embedding-ada-002)计算上下文语义

  4. 输出:一个稠密向量(dense vector),例如:

    [0.82, -0.34, 1.21, ..., 0.05]  # 长度 768
    

为什么能表示语义?

  • 模型在训练时学习了“哪些词经常一起出现”、“句子之间的逻辑关系”等。
  • 例如:
    • “狗” 和 “猫” 的向量距离很近(都是宠物)
    • “狗” 和 “汽车” 的向量距离较远

关键点必须用同一个 Embedding 模型处理“问题”和“知识库”,否则向量空间不一致,无法比较!

完整 RAG 流程图

         ┌──────────────────────┐
         │   离线阶段 (Offline) │
         └──────────┬───────────┘
                    ↓
      原始文档 → 清洗 → 分块 → Embedding → 存入向量数据库
                                          ↑
                                          │ (向量 + 原文)
                    ┌─────────────────────┴─────────────────────┐
                    │                                           │
         ┌──────────▼───────────┐                ┌─────────────▼─────────────┐
         │   在线阶段 (Online)  │                │     向量数据库 (e.g., FAISS) │
         └──────────┬───────────┘                └─────────────────────────────┘
                    ↓
           用户提问:“XXX?”
                    ↓
            问题 → Embedding
                    ↓
        向量检索 → Top-K 相关文本块
                    ↓
        构建 Prompt:[资料]+[问题]
                    ↓
          LLM 生成自然语言答案
                    ↓
               返回给用户 ✅

常见工具链

功能 工具示例
Embedding 模型 OpenAI text-embedding-ada-002, BGE, m3e, Sentence-BERT
向量数据库 FAISS(Meta)、Milvus、Pinecone、Weaviate、Qdrant
RAG 框架 LangChain, LlamaIndex, Haystack