RAG 工作机制详解
什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是 2024-2025 年大语言模型应用中最核心的架构模式之一。它的基本思想很简单:在 LLM 生成回答之前,先从外部知识库中检索相关信息,将检索结果注入上下文,再让模型基于这些信息生成答案。
为什么需要 RAG?大语言模型存在三个天然局限:知识截止日期(训练数据的时效边界)、幻觉问题(编造不存在的事实)、以及领域知识不足(缺乏企业内部或专业领域数据)。RAG 通过”先检索、再生成”的方式,绕过了模型的内部知识限制,让 LLM 能够引用最新、最准确的私有数据。
RAG 的核心工作流程
一个标准的 RAG 系统遵循以下流程:
文档库 → 文本切割(Chunking) → 向量化(Embedding) → 向量数据库存储
↓
用户提问 → 查询向量化 → 相似度检索 → 召回相关文档片段
↓
LLM 生成回答(基于检索结果 + 原始问题)
这个流程可以分解为两个阶段:离线索引阶段(文档处理入库)和在线查询阶段(实时检索生成)。
离线索引阶段
1. 文档解析与分块(Chunking)
原始文档(PDF、网页、数据库记录等)通常太长,不适合直接做向量检索。需要将它们切分成适当大小的”块”(Chunk)。
Chunking 策略直接影响检索质量。常见策略包括:
- 固定大小分块:按 token 数或字符数切割(如每块 512 tokens)
- 语义分块:按段落、章节等自然边界切割
- 递归分块:先用大的分隔符(章节标题),再逐级细化
- 重叠分块:相邻块之间保持一定重叠(如 10-20%),避免关键信息被切断
块的大小需要权衡:太小则语义不完整,太大则检索精度下降。
2. 向量化(Embedding)
文本被切块后,需要通过 Embedding 模型将每个文本块转换为固定维度的向量。这些向量是高维空间中的点,语义相近的文本在向量空间中距离也更近。
Embedding 模型的选择至关重要。目前主流的模型包括:
| 模型 | 维度 | Max Tokens | 性能特点 |
|---|---|---|---|
| text-embedding-3-large | 3072 | 8191 | OpenAI 推荐,性价比高 |
| text-embedding-3-small | 1536 | 8191 | 轻量级,速度快 |
| multilingual-e5-large | 1024 | 512 | 多语言支持好 |
| GTE-Qwen2-7B-instruct | 3584 | 32768 | 开源 SOTA,长文本 |
| BGE-M3 | 1024 | 8192 | 多语言+稀疏稠密混合 |
例如,一个用户的查询 “帝国大厦有多高?” 经过 Embedding 后,会变成一个形如 [1.0, 2.5, 3.7, 5.8, 2.8] 的稠密向量。
3. 向量数据库存储
向量化后的文档块被存入向量数据库(如 Pinecone、Weaviate、Milvus、Qdrant、Chroma 等)。向量数据库的核心能力是近似最近邻搜索(ANN),能在毫秒级从百万甚至亿级向量中找出最相似的 K 个结果。
在线查询阶段
1. 查询向量化
用户提问首先被同一个 Embedding 模型转换为向量。查询和文档必须使用相同的 Embedding 模型,否则它们分布在不同的向量空间中,相似度计算将失去意义。
2. 相似度检索
查询向量在向量数据库中执行相似度搜索。常用的相似度度量包括:
- 余弦相似度(Cosine Similarity):衡量两个向量方向的接近程度,值域 [-1, 1],不受向量长度影响
- 欧氏距离(Euclidean Distance):空间中的直线距离,值越小越相似
- 点积(Dot Product):适用于归一化后的向量
举例来说,假设文档块 A 的向量为 [1.3, 1.5, 3.3, 5.7, 4.9],查询向量为 [1.0, 2.5, 3.7, 5.8, 2.8],计算它们的余弦相似度约为 0.47。而另一个文档块 B 的向量 [4.8, 3.7, 1.5, 5.2, 6.0] 与同一查询的相似度约为 0.51——说明 B 与查询在语义上更接近,应该排在更前面。
3. 重排序(Re-ranking)
初步检索返回的结果(通常 Top 10-50)不一定都是最优的。重排序阶段使用更精确(但更慢)的模型对候选结果进行二次排序。
Cross-Encoder 是重排序的常用方法。与独立编码查询和文档的 Bi-Encoder 不同,Cross-Encoder 将查询和文档拼接后一起输入模型,能够捕捉两者之间更精细的交互关系,排序精度显著更高,只是计算成本也更大。
# Bi-Encoder(初检): 快但精度相对低
# 查询和文档独立编码
query_vec = embed(query)
doc_vec = embed(document)
similarity = cosine(query_vec, doc_vec)
# Cross-Encoder(重排): 慢但精度高
# 查询和文档拼接后联合编码
score = cross_encoder(query, document)
实际工程中通常采用两阶段检索:先用 Bi-Encoder 从海量候选中快速召回 Top-N,再用 Cross-Encoder 对 Top-N 精排,取 Top-K 送入 LLM。
RAG 效果评估
RAG 系统的质量可以从多个维度衡量:
检索质量指标:
- Recall@K:Top-K 结果中是否包含正确答案
- MRR(Mean Reciprocal Rank):第一个正确答案的平均排位倒数
- NDCG(Normalized Discounted Cumulative Gain):考虑排序位置的加权评分
生成质量指标:
- faithfulness(忠实度):生成内容是否忠实于检索到的上下文
- Answer Relevance(答案相关性):答案是否回答了问题
- Context Relevance(上下文相关性):检索到的内容是否与问题相关
目前常用 RAGAS(RAG Assessment)框架进行自动化评估,它在 MTEB(Massive Text Embedding Benchmark)等标准基准上提供了系统化的评分体系。
RAG 的高级模式
查询改写(Query Rewriting)
用户输入的原始问题往往不够精确。在检索前对查询进行改写——扩展同义词、补充上下文、分解复杂问题——能显著提升召回率。
混合检索(Hybrid Search)
将稠密检索(向量相似度)和稀疏检索(关键词匹配,如 BM25)的结果融合。稠密检索擅长语义匹配,稀疏检索擅长精确匹配,两者互补。
多跳检索(Multi-hop Retrieval)
对于需要多步推理的问题,可以在第一轮检索后,根据结果生成新的查询,进行第二轮甚至多轮检索,逐步逼近答案。
Self-RAG
让 LLM 在生成过程中自我判断是否需要检索、检索结果是否相关、生成内容是否有据可查,实现”按需检索”而非无差别检索。
总结
RAG 通过”检索 → 增强 → 生成”的架构,有效解决了 LLM 的知识时效性、幻觉控制和领域适配三大难题。一个生产级 RAG 系统涉及多个关键决策:Chunking 策略的选择、Embedding 模型的选型、向量数据库的配置、相似度度量的设计、以及重排序机制的引入。
随着长上下文模型的进步,有人会问”直接把所有文档塞进上下文不就行了?”但实践表明,RAG 的价值不仅在于”能塞多少”,更在于精准地找到最相关的那几段信息——检索质量决定了答案质量的上限。
本文基于视频《RAG 工作机制详解》整理而成,涵盖了 RAG 的定义、索引与查询两阶段流程、Embedding 与向量检索原理、Chunking 策略、重排序机制以及高级模式。