RAG基础
RAG 是一种结合 “检索” + “大语言模型生成” 的技术框架。它的核心思想是:
在回答用户问题前,先从大量文档中找出最相关的片段,再把这些片段喂给大模型,让它基于真实信息生成答案。
这样可以避免大模型“胡说八道”(幻觉),提高回答的准确性。
RAG 分为两个阶段:
- 离线阶段(Offline / Indexing Phase) —— 提前准备数据
- 在线阶段(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 维)。
向量能捕捉语义信息:语义越相近,向量在空间中越靠近。
工作原理(简化):
-
输入:一段文本(如 “猫喜欢抓老鼠”)
-
分词:拆成 token(如
["猫", "喜欢", "抓", "老鼠"]) -
神经网络编码:通过预训练的语言模型(如 BERT、Sentence-BERT、text-embedding-ada-002)计算上下文语义
-
输出:一个稠密向量(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 |