RAG系统设计深入 - 从原型到生产级架构¶
适用场景:2028年AI系统设计面试中,RAG相关问题已成为出现频率最高的题型之一 前置知识:01-AI系统设计面试指南 中的RAG基础题
为什么RAG是面试高频题¶
RAG系统设计是考察候选人"AI系统工程化能力"的最佳载体: - 涉及数据处理、检索、生成、评估全链路 - 需要在准确性、延迟、成本之间做工程权衡 - 落地过程中有大量非直觉的坑(分块策略、检索质量、幻觉控制) - 几乎所有大厂都在部署RAG系统
1. 生产级RAG架构全景¶
1.1 完整架构(面试画图用)¶
Text Only
┌──────────────────── 离线索引流水线 ────────────────────┐
│ │
│ 数据源 → 文档解析 → 清洗/去重 → 分块 → Embedding │
│ (PDF/HTML/ (Unstructured/ (规则+ (多策略) (BGE/ │
│ DB/API) Docling) 模型去重) GTE) │
│ ↓ │
│ 向量库(Milvus) + 倒排索引(ES) + 图谱 │
│ │
└────────────────────────────────────────────────────────┘
┌──────────────────── 在线查询流水线 ────────────────────┐
│ │
│ 用户Query → Query理解 → Query改写/扩展 → 路由判断 │
│ (意图分类) (HyDE/多查询) (检索/直答) │
│ ↓ │
│ 混合检索(Dense + Sparse + 知识图谱) │
│ ↓ │
│ Rerank(Cross-Encoder / LLM-as-Judge) │
│ ↓ │
│ 上下文组装(压缩 + 排序 + Token预算管理) │
│ ↓ │
│ LLM生成(流式输出 + 引用标注) │
│ ↓ │
│ 后处理(幻觉检测 + 安全过滤 + 缓存) │
│ │
└────────────────────────────────────────────────────────┘
┌──────────────────── 持续优化闭环 ──────────────────────┐
│ 用户反馈 → 质量评估(自动+人工) → 数据飞轮 → 模型微调 │
└────────────────────────────────────────────────────────┘
1.2 各环节性能参考值¶
| 环节 | 延迟 | 说明 |
|---|---|---|
| Query改写 | 200-500ms | LLM调用,可与检索并行 |
| 向量检索(百万级) | 5-20ms | Milvus/FAISS,HNSW索引 |
| BM25检索(千万级) | 10-50ms | Elasticsearch |
| Cross-Encoder Rerank(Top-20) | 50-150ms | GPU推理 |
| LLM生成(首Token) | 200-800ms | TTFT,取决于模型和负载 |
| LLM生成(完整回答) | 2-8s | 取决于输出长度 |
| E2E总延迟 | 3-10s | 用户可接受范围 |
2. 关键设计决策(面试重点追问)¶
2.1 分块策略:影响检索质量的第一因素¶
Text Only
策略对比:
┌──────────────┬──────────────────┬─────────────────┬──────────────┐
│ 策略 │ 优点 │ 缺点 │ 适用场景 │
├──────────────┼──────────────────┼─────────────────┼──────────────┤
│ 固定大小 │ 实现简单 │ 可能切断语义 │ 快速原型 │
│ (512 tokens) │ │ │ │
├──────────────┼──────────────────┼─────────────────┼──────────────┤
│ 语义分块 │ 保持语义完整性 │ 块大小差异大 │ 长文档/报告 │
│ (按段落/标题) │ │ 实现复杂 │ │
├──────────────┼──────────────────┼─────────────────┼──────────────┤
│ 递归分块 │ 兼顾语义和大小 │ 需调优分割符 │ 通用场景 │
│ (LangChain) │ 有重叠保持上下文 │ │ (推荐默认) │
├──────────────┼──────────────────┼─────────────────┼──────────────┤
│ 父子分块 │ 检索精度高 │ 存储多份 │ 精度要求高 │
│ (小块检索 │ 返回上下文丰富 │ 索引复杂 │ 的企业场景 │
│ 大块返回) │ │ │ │
└──────────────┴──────────────────┴─────────────────┴──────────────┘
面试常见追问:"如果用户的问题跨越了多个块怎么办?" - 方案1: 分块时加适当重叠(overlap 10-20%) - 方案2: 检索后将相邻块合并 - 方案3: 多查询检索 — 把用户问题拆成多个子查询,各自检索后合并结果
2.2 检索策略:为什么混合检索是标配¶
Text Only
混合检索流程:
用户Query
│
├──→ Dense检索(语义相似度)
│ "如何办理退货" → 找到"退换货流程说明"
│
├──→ Sparse检索(关键词匹配)
│ "如何办理退货" → 精确匹配"退货"关键词
│
└──→ [可选] 知识图谱检索
"如何办理退货" → 图谱关联: 退货→退货政策→退款流程
│
↓
RRF融合(Reciprocal Rank Fusion)
score(d) = Σ 1/(k + rank_i(d)) k通常取60
│
↓
Cross-Encoder Rerank (Top-N → Top-K)
为什么不只用向量检索: 1. 向量检索擅长语义匹配,但对精确关键词(产品型号、法规编号)效果差 2. BM25擅长精确匹配,但对同义表述("退货" vs "退换")召回不足 3. 混合检索互补,RRF融合无需训练,效果稳定提升5-15%
2.3 Rerank的必要性¶
Text Only
无Rerank: 向量检索Top-10 → 直接送入LLM → 相关文档可能排在第7、8位
LLM受上下文位置影响(Lost in the Middle)
有Rerank: 向量检索Top-50 → Cross-Encoder重排 → 最相关的排到前5
LLM效果显著提升
Cross-Encoder vs Bi-Encoder对比:
| 维度 | Bi-Encoder(向量检索) | Cross-Encoder(Rerank) |
|---|---|---|
| 速度 | 快(ANN检索,毫秒级) | 慢(逐对打分,百毫秒级) |
| 精度 | 中 | 高(query和doc交叉注意力) |
| 用途 | 大规模召回 | 精排Top-N |
2.4 幻觉控制(面试核心追问)¶
Text Only
幻觉控制多层防线:
Layer 1: 检索质量保障
- 高质量分块 + 混合检索 + Rerank → 确保送入LLM的上下文相关
- 设置相关性阈值(cosine similarity < 0.5 则不检索)
Layer 2: Prompt约束
- "仅基于以下参考资料回答,如果资料中没有相关信息,请说'我没有找到相关信息'"
- 要求LLM输出引用标记 [1][2] 对应参考文档
Layer 3: 后处理验证
- NLI(自然语言推理)模型验证: 生成内容是否能从检索文档推导出
- 引用验证: 检查 [1] 标记的内容是否真的来自文档1
- 自一致性: 多次生成对比,不一致的部分标记低置信度
Layer 4: 人工反馈闭环
- 用户点踩 → 触发人工审核 → 标注bad case → 优化检索/Prompt
3. 高级RAG架构模式¶
3.1 Agentic RAG(2028面试热点)¶
传统RAG是单次"检索→生成",Agentic RAG引入自主决策循环:
Text Only
用户问题 → Agent判断:
├── 简单事实题 → 单次RAG足够
├── 复杂分析题 → 多步检索策略:
│ Step 1: 检索背景信息
│ Step 2: 基于Step1结果,细化查询
│ Step 3: 检索补充细节
│ Step 4: 综合生成答案
├── 多数据源题 → 路由到不同知识库(技术/财务/法规)
└── 需要计算/推理 → 使用工具(代码执行/API调用)后再生成
3.2 Graph RAG¶
场景:知识之间有强关联关系(组织架构、法规引用、技术依赖)
Text Only
文档 → 实体识别(NER) → 三元组抽取(LLM)
→ 知识图谱(Neo4j/NebulaGraph)
查询时:
用户Query → 实体识别 → 图谱子图检索
→ 子图 + 向量检索结果 → 合并上下文 → LLM生成
优势:能回答"关系型"问题("A部门负责人向谁汇报?""这个API依赖哪些下游服务?")
3.3 多模态RAG¶
场景:文档包含图表、公式、表格(技术文档、财报、医疗影像报告)
Text Only
文档 → 拆分:
├── 文本 → 文本Embedding(BGE-M3)
├── 表格 → 结构化解析 + 文本描述Embedding
├── 图片 → VLM描述生成(Qwen-VL) → 文本Embedding
│ + 原图CLIP向量 → 视觉索引
└── 公式 → LaTeX提取 → 语义解释Embedding
检索时:
文本Query → 多模态混合检索 → 返回文本+图片+表格
→ 多模态LLM生成(GPT-4o/Qwen-VL) → 带图表引用的回答
4. 生产环境关键问题¶
4.1 成本优化¶
Text Only
成本组成(典型RAG系统, 1000 QPS):
Embedding API: ~$500/月 (可替换为本地模型: BGE-M3)
向量数据库: ~$2000/月 (Milvus集群, 千万级文档)
LLM推理(核心): ~$15000/月 (GPT-4o级别)
Rerank模型: ~$1000/月 (GPU推理)
基础设施: ~$3000/月 (K8s集群)
────────────────────────────────
总计: ~$21500/月
优化策略:
1. 语义缓存: 相似Query复用之前的回答 → LLM调用减少30-50%
2. 级联模型: 简单问题→7B小模型(成本1/20),复杂→大模型
3. 本地Embedding: BGE-M3自建 vs API调用 → 成本降90%
4. 及时截断: 检索到高置信结果后停止额外检索
4.2 评估体系(面试必问)¶
Text Only
RAG评估维度:
1. 检索质量(Context)
- Recall@K: Top-K检索中包含正确答案的比例
- MRR: 正确答案在检索结果中的平均排名倒数
- Context Relevance: 检索内容与问题的相关度(LLM评判)
2. 生成质量(Answer)
- Faithfulness(忠实度): 回答是否能从检索内容推导出(最重要!)
- Answer Relevance: 回答是否针对问题
- Correctness: 与标准答案的匹配度
3. 端到端质量
- Answer Correctness: 最终答案的准确率
- 用户满意度: 点赞/点踩比例
评估工具: RAGAS / TruLens / DeepEval
自动化评估: LLM-as-Judge(GPT-4o评分) + 人工抽样校准
4.3 数据飞轮¶
Text Only
持续优化循环:
用户交互 → 日志收集(Query, 检索结果, 回答, 用户反馈)
↓
质量分析:
- 低分回答聚类 → 发现系统薄弱点
- 无检索结果的Query → 知识库缺口
- 高频Query → 缓存/预计算候选
↓
优化行动:
- 补充缺失知识到文档库
- 优化分块/检索策略
- 微调Embedding模型(Domain-specific)
- 调整Prompt模板
5. 面试模拟:设计企业知识管理RAG系统¶
面试官:"请设计一个面向大型企业(5万员工)的内部知识管理系统,支持跨部门文档检索和问答。"
需求澄清(5min)¶
- 文档规模:百万级文档(公告/制度/技术文档/会议纪要),持续增长
- 格式:PDF/Word/PPT/Confluence页面/企业微信消息
- 用户规模:5万员工,峰值QPS约500
- 安全要求:部门级权限隔离,涉密文档不能跨部门泄露
- 延迟要求:首Token 2秒内,完整回答10秒内
- 准确率要求:对制度/流程类问题准确率>95%
架构设计(10min)¶
Text Only
文档接入层:
Confluence/SharePoint/飞书 Webhook → 文档采集服务
→ 格式解析(Docling) → 元数据提取(部门/密级/分类/时间)
→ 权限标签注入 → 分块+Embedding → 索引写入
查询层:
用户(SSO登录, 携带部门/角色信息) → Query
→ 权限过滤(预过滤: Milvus Partition + ES Filter)
→ 混合检索(Dense + BM25, RRF融合) → Rerank → 权限二次校验
→ LLM生成(引用标注) → 安全审核 → 返回
特殊处理:
- 涉密文档: 独立Partition + 加密存储 + 审计日志
- 多语言: BGE-M3天然支持中英混合
- 时效性: 制度文档自动标注有效期,过期文档降权
关键决策(10min)¶
权限设计:这是企业RAG最核心的难点
Text Only
方案选择: 文档级ACL + 预过滤
文档入库时:
每个文档 → 提取ACL(允许的部门/角色列表) → 存入元数据
检索时:
用户Query + 用户权限信息
→ Milvus Partition By 部门 (粗粒度隔离)
→ + ES过滤条件 (细粒度ACL)
→ 结果只返回用户有权查看的文档
为什么不用后过滤?
后过滤: 先检索100条 → 过滤掉无权限的 → 可能只剩5条
预过滤: 在检索阶段直接限定权限范围 → 保证结果数量充足
最后更新:2026年2月