RAG 系统设计与优化
RAG 深入解析
1. RAG 完整架构
【离线阶段 - 知识库构建】
原始文档 → 预处理(清洗/去重)→ 分块(Chunking)
→ Embedding 模型向量化 → 存入向量数据库
【在线阶段 - 检索生成】
用户问题 → Query 改写/增强 → 向量化
→ 向量检索(Top-K)→ 可选:Re-ranking
→ 拼接 Prompt → LLM 生成 → 后处理 → 输出
2. Chunking 策略
| 策略 | 特点 | 适用场景 |
|---|---|---|
| 固定大小 | 简单,可能截断语义 | 通用场景 |
| 递归字符分割 | 按段落/句子/词分割 | 结构化文本 |
| 语义分割 | 按语义边界分块 | 质量要求高 |
| 文档结构感知 | 利用 Markdown/HTML 标题 | 有结构的文档 |
| Small-to-Big | 存小块,检索后返回大块 | 平衡精度和上下文 |
关键参数
chunk_size:通常 512-1024 tokenschunk_overlap:通常 50-200 tokens,避免边界信息丢失
3. 检索优化
混合检索
稠密检索(向量相似度)
+
稀疏检索(BM25 关键词)
→ RRF(倒数排名融合)合并结果
Query 增强
- HyDE(假设文档嵌入):让 LLM 先生成假设答案,用假设答案检索
- Multi-Query:生成多个角度的查询并集检索
- Step-Back Prompting:将具体问题泛化为更高层次的问题
Re-ranking
- Cross-Encoder 模型(如 BGE-Reranker)对 query+doc 联合编码评分
- 比双塔 Embedding 更准确,但速度慢(仅用于 Top-K 精排)
4. 向量数据库选型
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| Pinecone | 全托管,简单 | 快速原型 |
| Qdrant | 开源,Rust 实现,高性能 | 自托管生产 |
| Weaviate | 内置混合检索 | 需混合搜索 |
| Chroma | 轻量,本地优先 | 开发调试 |
| Milvus | 大规模,功能全 | 企业级 |
| pgvector | PostgreSQL 扩展 | 已有 PG 的项目 |
5. 评估体系
RAGAS 评估框架:
- Faithfulness(忠实性):答案是否基于检索到的上下文
- Answer Relevancy(相关性):答案是否回答了问题
- Context Recall(上下文召回):检索的文档是否包含答案所需信息
- Context Precision(上下文精确):检索的文档是否都有用
6. 常见问题与优化
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 检索不到相关内容 | Chunk 太大/太小,Embedding 弱 | 调整分块,换更好的 Embedding 模型 |
| 检索到但答错 | LLM 忽略上下文 | 优化 Prompt,强调「只根据以下内容回答」 |
| 多跳推理失败 | 信息分散在多个文档 | Graph RAG,建立实体关系图 |
| 长文档理解差 | 超出上下文窗口 | 层次化索引(先摘要,再详细) |
7. 高频面试题
- RAG 和 Fine-tuning 如何选择? 知识需要实时更新用 RAG;需要改变模型风格/能力用 Fine-tuning;两者可结合
- 如何提升 RAG 的准确率? 改善 Chunking 策略、升级 Embedding 模型、加 Re-ranking、优化 Prompt
- 向量相似度搜索原理? 计算 Query 向量与文档向量的余弦相似度或内积,用 HNSW/IVF 近似最近邻加速
- Graph RAG 是什么? 将文档解析为知识图谱,结合图遍历和向量检索,适合复杂推理