RAG 技术详解:检索增强生成

返回

RAG(Retrieval-Augmented Generation,检索增强生成)是目前 AI 应用最热门的技术架构之一,也是面试中的高频考点。

一、通俗易懂版:RAG 是什么?

1.1 用一个比喻理解 RAG

想象你在参加一场开卷考试:

  • 没有 RAG 的 LLM = 闭卷考试

    • 模型只能靠训练时记住的知识回答问题
    • 训练数据之外的问题,容易”胡说八道”(幻觉)
    • 知识更新慢,训练完就固定了
  • 有 RAG 的 LLM = 开卷考试

    • 模型可以先翻书(检索外部知识库)
    • 找到相关资料后再组织答案(生成)
    • 答案有依据,可追溯,更准确

1.2 RAG 解决的核心问题

问题描述RAG 如何解决
幻觉问题模型编造不存在的事实检索真实文档作为依据
知识时效性训练数据有截止日期随时更新外部知识库
领域专业性通用模型不懂垂直领域注入企业/领域私有数据
答案可追溯无法验证答案来源返回引用来源和片段

1.3 RAG 的工作流程(三步走)

┌─────────────────────────────────────────────────────────────────┐
│                      RAG 工作流程                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  用户提问                                                        │
│     │                                                           │
│     ▼                                                           │
│  ┌─────────────┐      ┌─────────────┐      ┌─────────────┐     │
│  │   1. 检索    │ ────▶│   2. 增强    │ ────▶│   3. 生成    │     │
│  │  Retrieval  │      │ Augmentation│      │  Generation │     │
│  ├─────────────┤      ├─────────────┤      ├─────────────┤     │
│  │ • 向量化    │      │ • 拼接上下文 │      │ • LLM 回答   │     │
│  │ • 相似度搜索 │      │ • 添加提示词 │      │ • 返回答案   │     │
│  │ • 召回 TopK │      │ • 过滤噪声   │      │ • 附带引用   │     │
│  └─────────────┘      └─────────────┘      └─────────────┘     │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

步骤详解:

  1. 检索(Retrieval)

    • 把用户问题转换成向量(Embedding)
    • 在向量数据库中搜索最相似的文档片段
    • 召回 Top-K 个相关片段(通常 3-5 个)
  2. 增强(Augmentation)

    • 把检索到的片段拼接到 Prompt 中
    • 格式通常是:[背景知识] + [用户问题] + [回答要求]
    • 过滤掉不相关或低质量的片段
  3. 生成(Generation)

    • LLM 根据增强后的 Prompt 生成答案
    • 答案要基于提供的背景知识
    • 可选:标注引用来源

二、技术架构详解

2.1 RAG 系统核心组件

┌──────────────────────────────────────────────────────────────────┐
│                       RAG 系统架构                               │
│                                                                  │
│  ┌────────────┐    ┌────────────┐    ┌────────────┐             │
│  │  数据源     │    │  用户界面   │    │   LLM      │             │
│  │  (文档)    │    │  (提问)    │    │  (生成)    │             │
│  └─────┬──────┘    └─────┬──────┘    └─────┬──────┘             │
│        │                 │                 │                     │
│        ▼                 │                 │                     │
│  ┌────────────┐          │                 │                     │
│  │ 文档切片    │          │                 │                     │
│  │  Chunking  │          │                 │                     │
│  └─────┬──────┘          │                 │                     │
│        │                 │                 │                     │
│        ▼                 │                 │                     │
│  ┌────────────┐          │                 │                     │
│  │ Embedding  │          │                 │                     │
│  │   模型     │          │                 │                     │
│  └─────┬──────┘          │                 │                     │
│        │                 │                 │                     │
│        ▼                 │                 │                     │
│  ┌────────────┐    ┌─────┴──────┐    ┌─────┴──────┐             │
│  │ 向量数据库  │◀───│  检索器     │───▶│  Prompt    │             │
│  │  Vector DB │    │  Retriever │    │  组装器    │             │
│  └────────────┘    └────────────┘    └────────────┘             │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

2.2 关键组件技术选型(2026 年 3 月)

组件开源方案商业方案选择建议
Embedding 模型bge-m3, bge-large-zh-v1.5OpenAI text-embedding-3中文场景推荐 bge-m3(支持 8K 长度)
向量数据库Milvus 2.4.x, Qdrant 1.12.x, Chroma 0.5.xPinecone Serverless, Weaviate 1.25.x小规模用 Chroma,大规模用 Milvus/Qdrant
LLMQwen2.5-72B, DeepSeek-V3GPT-4o, Claude 3.7根据成本和效果权衡
编排框架LangChain 0.3.x, LlamaIndex 0.12.xDify 1.0.x, Flowise 2.0.x快速原型用 Dify,定制开发用 LangChain

2.3 文档切片(Chunking)策略

切片质量直接影响检索效果,常见策略:

# 策略 1:固定长度切片(最简单)
chunk_size = 500  # token 数
chunk_overlap = 50  # 重叠部分,保持上下文连贯

# 策略 2:按语义切片(效果更好)
# - 按段落/章节边界切
# - 按句子完整性切
# - 保持代码块/表格完整

# 策略 3:递归切片(推荐)
# 先按大结构切(章节),再按小结构切(段落)
# 保持层次结构信息

切片大小建议:

文档类型推荐 chunk_size说明
普通文本300-500 tokens平衡检索精度和上下文完整性
技术文档500-800 tokens代码块需要更大上下文
对话记录200-300 tokens单轮对话较短
表格数据按行/按块保持表格结构完整

三、实战:从零搭建 RAG 系统

3.1 最小可行方案(100 行代码,2026 版)

from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA

# 1. 加载文档
loader = TextLoader("docs.txt", encoding='utf-8')
documents = loader.load()

# 2. 切片
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)

# 3. 创建向量存储(2026 推荐:bge-m3)
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-m3")
vectorstore = Chroma.from_documents(chunks, embeddings)

# 4. 创建检索链
llm = ChatOpenAI(model="gpt-4o", temperature=0.3)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)

# 5. 提问
response = qa_chain.run("你的问题是什么?")
print(response)

3.2 生产环境优化点

优化方向具体措施效果提升
检索质量混合检索(向量 + 关键词)+15-20% 准确率
响应速度向量索引优化、缓存降低 50% 延迟
答案质量Re-Rank 重排序、Prompt 优化+10-15% 满意度
成本控制小模型检索 + 大模型生成降低 60% 成本

四、RAG 进阶技术

结合向量检索和关键词检索的优势:

向量检索:语义相似,但可能漏掉关键词匹配
关键词检索:精确匹配,但不懂语义

混合检索 = 向量相似度 × 0.7 + 关键词匹配度 × 0.3

4.2 RAG-Fusion

一种改进的检索策略:

  1. 用 LLM 生成多个相关问题
  2. 对每个问题进行检索
  3. 合并结果并去重
  4. 用 RRF(倒数排名融合)重新排序

4.3 高级 RAG 模式

模式描述适用场景
Naive RAG基础检索 + 生成快速原型
Advanced RAG检索前优化 + 检索后优化生产环境
Modular RAG可插拔模块,灵活组合复杂场景
Graph RAG结合知识图谱需要推理的场景

🎯 面试回答版本

面试官问:“请介绍一下 RAG 技术” 或 “你如何理解检索增强生成?“

标准回答框架(2-3 分钟)

RAG 是 Retrieval-Augmented Generation 的缩写,中文叫"检索增强生成"。
它主要解决大语言模型的两个核心问题:幻觉和知识时效性。

【工作原理】
RAG 的工作流程分三步:
1. 检索:把用户问题向量化,在知识库里搜索相关文档
2. 增强:把检索到的文档片段拼接到 Prompt 里作为背景知识
3. 生成:LLM 根据背景知识生成有依据的答案

【核心价值】
- 让模型能访问外部知识,不局限于训练数据
- 答案可追溯,可以标注引用来源
- 知识库可以随时更新,不需要重新训练模型

【技术要点】
关键组件包括:Embedding 模型、向量数据库、检索器、LLM。
我比较熟悉的技术栈是:bge-large-zh 做 Embedding,
Chroma/Milvus 做向量存储,LangChain 做编排。

【实际应用】
我在 [项目名] 中用 RAG 实现了 [功能],
遇到的主要挑战是 [切片策略/检索精度/响应速度],
通过 [具体方案] 解决了这个问题。

高频追问及应对

追问参考回答
”RAG 和 Fine-tuning 有什么区别?“RAG 是外挂知识库,成本低、更新快;Fine-tuning 是改模型权重,成本高、效果好但更新慢。通常优先 RAG,效果不够再考虑微调。
“如何提升 RAG 的检索精度?“三个方向:1) 优化切片策略 2) 混合检索(向量 + 关键词)3) 加 Re-Rank 重排序
”向量数据库选型考虑什么?“数据规模(百万级以下 Chroma 够用)、查询 QPS、是否需分布式、运维成本
”RAG 的延迟怎么优化?“1) 向量索引优化(HNSW)2) 缓存热门查询 3) 异步检索 4) 小模型 Embedding
”如何处理长文档?“分层切片 + 层次化检索,先检索章节再检索段落,或者用 Map-Reduce 方式

加分项

  • 能说出具体数值指标(如”检索准确率从 70% 提升到 85%”)
  • 能对比不同方案优劣(如”Chroma 适合原型,Milvus 适合生产”)
  • 提到成本意识(如”用小模型做 Embedding 降低 60% 成本”)

避坑指南

❌ 不要说:

  • “RAG 就是调 LangChain API”(太浅)
  • “没实际用过,只看过文档”(减分)

✅ 要说:

  • “我在 XX 场景用过,遇到 XX 问题,用 XX 方案解决”
  • “了解原理,也动手实现过 demo”

相关阅读: