引言
检索增强生成(Retrieval-Augmented Generation, RAG)是当前大语言模型落地应用中最核心的技术之一。它通过将外部知识库与LLM的推理能力相结合,有效解决了模型知识截止、幻觉频发、领域知识不足等痛点。本文将从底层原理到生产部署,带你构建一个完整的RAG系统。
一、RAG的核心架构
一个完整的RAG系统由三个核心模块组成:
1.1 索引阶段(Indexing)
索引阶段的目标是将原始文档转换为可被高效检索的向量表示。整个流程包括:
- 文档加载:支持PDF、Word、HTML、Markdown、代码文件等多种格式
- 文本分块:将长文档切分为语义完整的chunk,常见策略有固定长度切分、递归切分、语义切分等
- 向量化嵌入:使用embedding模型将文本chunk映射为高维向量
- 存储入库:将向量及元数据写入向量数据库
1.2 检索阶段(Retrieval)
检索阶段的核心是根据用户query从知识库中找到最相关的文档片段:
- 查询预处理:query改写、关键词扩展、意图识别
- 向量检索:通过余弦相似度、内积或欧氏距离在向量空间中查找最近邻
- 混合检索:结合BM25等传统关键词检索与向量检索的优势
- 重排序:使用cross-encoder模型对初步检索结果进行精排
1.3 生成阶段(Generation)
生成阶段将检索结果喂给LLM生成最终回答:
- 上下文组装:将检索到的文档片段拼接为LLM的上下文
- 提示工程:设计system prompt引导模型基于上下文回答
- 引用溯源:输出时标注信息来源,增强可解释性
二、嵌入模型的选择与优化
2.1 主流Embedding模型对比
| 模型 | 维度 | 最大Token | 中文支持 | 特点 |
|---|---|---|---|---|
| BAAI/BGE-large-zh-v1.5 | 1024 | 512 | 优秀 | 开源中文首选 |
| text-embedding-3-large | 3072 | 8191 | 良好 | OpenAPI API调用 |
| m3e-base | 768 | 512 | 优秀 | 轻量高效 |
| gte-large-zh | 1024 | 512 | 优秀 | 阿里达摩院 |
2.2 嵌入模型微调
通用embedding模型在特定领域表现可能不佳,此时需要进行微调:
python
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
# 加载基础模型
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
# 准备领域训练数据
train_examples = [
InputExample(texts=['什么是RAG系统', '检索增强生成系统定义'], label=1.0),
InputExample(texts=['向量数据库原理', 'Redis缓存机制'], label=0.0),
]
# 微调训练
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
train_loss = losses.CosineSimilarityLoss(model)
model.fit(
train_objectives=[(train_dataloader, train_loss)],
epochs=3,
warmup_steps=100
)
三、向量数据库深度对比
3.1 主流向量数据库
Milvus:分布式架构,支持万亿级向量,适合大规模生产环境。支持多种索引类型(IVF_FLAT、HNSW、DISANN),内置标量过滤与混合检索能力。
Qdrant:Rust编写,性能优秀。支持过滤检索、payload索引、量化压缩。部署简单,适合中小规模场景。
Weaviate:内置向量化模块,支持多模态。提供GraphQL接口,模块化管理方便。
ChromaDB:轻量级嵌入式数据库,适合本地开发与小规模应用。API简洁,上手快速。
Pinecone:全托管云服务,免运维。自动索引优化,但对数据隐私有顾虑的团队需谨慎。
3.2 索引算法选择
HNSW (Hierarchical Navigable Small World)
├── 优点:查询速度快,召回率高
├── 缺点:内存占用大,索引构建慢
└── 适用:对召回率要求高的场景
IVF (Inverted File Index)
├── 优点:内存友好,支持动态更新
├── 缺点:需要训练,召回率依赖聚类质量
└── 适用:大规模数据集,内存受限场景
ScaNN (Google)
├── 优点:各向异性量化,极致压缩
├── 缺点:实现复杂
└── 适用:超大规模,延迟敏感
四、高级检索策略
4.1 混合检索(Hybrid Search)
单纯的向量检索可能在关键词精确匹配场景表现不佳,混合检索结合两者的优势:
python
from qdrant_client import QdrantClient
from qdrant_client.models import Filter, FieldCondition, MatchText
# 向量检索 + BM25 混合
results = client.search(
collection_name="knowledge_base",
query_vector=embedding_model.encode(user_query),
query_filter=Filter(
should=[
FieldCondition(key="category", match=MatchText(text="技术文档"))
]
),
search_params={"hnsw_ef": 128, "exact": False},
limit=10
)
4.2 重排序(Reranking)
使用cross-encoder对候选文档进行精排是提升RAG质量的关键步骤:
python
from FlagReranker import FlagReranker
reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True)
# 对检索结果重排序
pairs = [(query, doc.text) for doc in retrieved_docs]
scores = reranker.compute_score(pairs)
# 按分数排序
reranked = [doc for _, doc in sorted(zip(scores, retrieved_docs), reverse=True)]
4.3 查询改写策略
- HyDE(Hypothetical Document Embeddings):让LLM先生成假设性答案,再用该答案的embedding去检索
- Multi-Query:将复杂问题拆分为多个子查询,分别检索后合并结果
- Step-Back Prompting:将具体问题抽象为更宽泛的问题,获取更全面的上下文
五、文本分块策略详解
5.1 常见分块方法
| 方法 | Chunk大小 | 重叠 | 优势 |
|---|---|---|---|
| 固定长度 | 256-1024 tokens | 10-20% | 简单高效 |
| 递归字符 | 自适应 | 5-10% | 保持语义完整 |
| 语义分块 | 动态 | 无 | 语义边界准确 |
| 文档结构 | 按章节/段落 | 无 | 保留文档结构 |
5.2 最佳实践
chunk大小与重叠率需要根据具体场景调优。知识问答场景推荐512-768 tokens的chunk配合15-20%的重叠。法律、医疗等对精确性要求高的领域建议使用更小的chunk(200-400 tokens)以减少无关信息干扰。
六、生产级RAG系统架构
6.1 系统组件
用户请求 → API Gateway → 查询理解模块 → 检索引擎 → 重排序模块 → LLM生成 → 响应返回
↓ ↑
缓存层(Redis) 向量数据库(Milvus/Qdrant)
↓
文档处理流水线
6.2 性能优化要点
- 多级缓存:query结果缓存、embedding缓存、热门文档缓存
- 异步索引:文档更新走消息队列,不影响在线检索
- 批量推理:embedding计算和LLM推理都使用批处理提升吞吐
- 读写分离:检索节点与索引节点分开部署
6.3 质量评估体系
RAG系统的评估需要多维度考量:
- 检索质量:Recall@K、MRR、nDCG
- 生成质量:基于忠实度、相关性、完整性的人工/自动评估
- 端到端质量:回答准确率、用户满意度、引用正确率
七、常见坑与解决方案
7.1 检索不相关
问题:检索到的文档与query语义相关但实际回答不了问题。
解决:引入reranking,调整chunk大小,优化embedding模型。
7.2 上下文过长
问题:检索结果拼接后超出LLM上下文窗口。
解决:控制检索结果数量,使用滑动窗口策略,或改用map-reduce方式逐个处理。
7.3 多跳推理失败
问题:需要结合多个文档信息才能回答的问题表现差。
解决:使用multi-hop检索策略,或引入GraphRAG等图结构化检索方法。
7.4 更新延迟
问题:新增文档到可检索之间存在延迟。
解决:采用近实时索引方案,设置合理的refresh_interval,关键更新手动触发。
八、未来展望
RAG技术正在快速演进。GraphRAG将知识图谱引入检索链路,Agentic RAG让检索过程具备自主决策能力,而多模态RAG则将检索范围扩展到了图片、视频等非结构化数据。随着向量数据库性能持续提升和embedding模型不断完善,RAG将成为AI应用的标准基础设施。
结语
构建一个生产级RAG系统不是简单地拼接几个开源工具,而是需要在索引策略、检索算法、生成质量、性能优化等多个维度进行系统工程设计。希望本文提供的技术路线和实战经验,能帮助你在AI应用开发中更好地利用RAG技术。

发表评论 取消回复