本文是 EduRAG 系列 11 篇文章的精华浓缩,按"架构→检索→生成→进阶"的顺序,帮你用最短时间掌握企业级 RAG 系统的完整知识体系。
候选标题(5 选 1)
- 《EduRAG 精华:从 BM25 到混合检索的智能问答系统全解析》(当前使用)
- 《一文读懂 EduRAG:三层架构与 RAG 全链路实战精华》
- 《智能问答系统设计:从 FQA 到 RAG 的完整进化路径》
- 《EduRAG 全流程精要:检索、改写、向量存储与多 Agent 协作》
- 《构建企业级教育问答系统:BM25、Milvus 与 RAG 核心技术汇总》
一、为什么需要 RAG?
大模型虽强,但有四大痛点:知识时效性差、易产生幻觉、领域适应性弱、数据不可控。RAG(检索增强生成) 通过外挂知识库 + 检索 + 生成的方式,把这些问题一一化解,同时提升可解释性、降低成本。
EduRAG 就是面向 IT 教育咨询场景的 RAG 完整实现:支持多模态文档、流式问答、多轮对话、学科过滤、效果评估,是教学和生产双重价值的范例。
二、三层问答架构总览
EduRAG 采用三层递进架构,按优先级逐层兜底,兼顾速度与准确性:
用户提问
│
▼
第一层:问候识别(正则模板)→ 命中直接返回
│ 未命中
▼
第二层:BM25 + Redis/MySQL 精确匹配 → 相似度≥0.85 返回
│ 未找到可靠答案
▼
第三层:RAG 系统
1. BERT 意图分类(通用知识 / 专业咨询)
2. LLM 策略选择(直接 / HyDE / 子查询 / 回溯)
3. BGE-M3 混合检索 → BGE-Reranker 重排序
4. 组装 Prompt → LLM 流式生成
设计哲学:能快则快(缓存/精确匹配),不能快则准(RAG 检索),最后兜底(LLM 通用知识)。
三、第一层:BM25 + MySQL/Redis 的 FQA 系统
3.1 BM25 算法原理
BM25 是信息检索领域的经典排名算法,改进自 TF-IDF,引入文档长度归一化和词频饱和机制:
$$\text{BM25}(D, Q) = \sum_{i=1}^{n} \frac{(k_1 + 1) \cdot f_i}{f_i + k_1 \cdot (1 - b + b \cdot \frac{|D|}{\text{avgdl}})} \cdot \log\left(\frac{N - n_i + 0.5}{n_i + 0.5}\right)$$- $f_i$:词项在文档中的出现次数(TF)
- $|D|$ / avgdl:文档长度 / 平均文档长度
- $k_1=1.2$、$b=0.75$:饱和度与长度归一化参数
3.2 FQA 系统流程
MySQL 存问答对 → jieba 分词 → BM25 计算相似度 → Softmax 归一化
→ 阈值 0.85 判定 → 命中则 Redis 缓存并返回 / 否则转 RAG
关键点:
- Redis 双重缓存:缓存分词结果(避免重复切词)+ 缓存高置信答案(加速热点查询)
- Softmax 归一化:把 BM25 原始分转为概率分布,便于跨查询比较
- 阈值 0.85:可靠性闸门,低于阈值视为"无可靠答案"
四、第二层基础:Milvus 向量数据库
4.1 核心概念
| 概念 | 类比 MySQL | 说明 |
|---|---|---|
| Collection | 表 | 组织数据的基本单位 |
| Field | 字段 | 含标量字段与向量字段 |
| Entity | 行记录 | 一条数据 |
| Partition | 分区 | 数据物理分片 |
一个 Collection 最多支持 4 个向量字段,主键只能有一个。
4.2 索引类型选型
| 索引 | 原理 | 适用场景 |
|---|---|---|
| FLAT | 暴力搜索 | 百万级小数据,要求 100% 精度 |
| IVF_FLAT | 倒排+聚类 | 精度与速度平衡(常用) |
| IVF_SQ8 | IVF + 标量量化 | 内存受限场景 |
| IVF_PQ | 倒排 + 乘积量化 | 大规模高维数据 |
| HNSW | 图索引 | 对查询效率要求高 |
4.3 相似度度量
- L2(欧氏距离):越小越相似
- IP(内积):越大越相似
- COSINE(余弦相似度):方向相似性
4.4 混合检索与重排策略
Milvus 支持多路 ANN 搜索结果融合:
- WeightedRanker(0.7, 1.0):加权融合,强调某一路检索结果
- RRFRanker(k=60):基于排名倒数融合,无偏好时使用,公式:$\text{score}(d) = \sum_{i=1}^{N} \frac{1}{k + \text{rank}_i(d)}$
五、文档处理与父子分块
5.1 多格式加载
支持 7 种格式,每种都有专用加载器:
| 格式 | 加载器 | 特点 |
|---|---|---|
| .txt | TextLoader | UTF-8 编码 |
| OCRPDFLoader | PyMuPDF + RapidOCR | |
| .docx | OCRDOCLoader | python-docx + OCR |
| .ppt/.pptx | OCRPPTLoader | python-pptx |
| .jpg/.png | OCRIMGLoader | RapidOCR |
| .md | UnstructuredMarkdownLoader | 保留结构 |
5.2 父子分块策略
核心思想:小块检索、大块提供上下文。
原始文档
│
▼ 父块切分(如 1200 字)
父块(提供丰富上下文)
│
▼ 子块切分(如 300 字)
子块(用于精准检索)
- 子块:语义聚焦,检索精度高
- 父块:上下文丰富,喂给 LLM 生成更优
- 元数据:每个子块携带
parent_id和parent_content,命中子块即取父块
分块越小,语义越清晰;命中子块后返回父块,兼顾精度与上下文完整性。
六、BGE-M3 与 BGE-Reranker:混合检索的基石
6.1 BGE-M3 三种编码方式
BGE-M3 是支持多语言、多粒度的嵌入模型,一次编码同时产出三种向量:
| 编码方式 | 维度 | 原理 | 作用 |
|---|---|---|---|
| 稠密向量 | 1024 | [CLS] 全局语义向量 |
语义检索主力 |
| 稀疏向量 | 高维稀疏 | 类似 BM25 的 token 重要性 | 关键词精确匹配 |
| 多向量 | 多维矩阵 | 可学习矩阵 $W_{mul}$ 编码 | 精细匹配(ColBERT) |
混合检索公式:稠密向量负责"语义相近",稀疏向量负责"关键词命中",两者融合兼顾召回率与准确率。
6.2 BGE-Reranker 重排序
基于 CrossEncoder 架构(XLM-RoBERTa),把 query 和 document 拼接输入,输出相关性分数。
为什么需要重排序?
- 双塔嵌入(BGE-M3)速度快但精度有限
- CrossEncoder 精度高但速度慢
- 折中方案:BGE-M3 召回 Top-K → BGE-Reranker 精排 Top-M
七、Query 改写:6 种策略提升召回
用户提问常有"信息不完整"或"含噪声"问题,Query 改写是 RAG 鲁棒性的关键。
| 改写策略 | 适用场景 | 示例 |
|---|---|---|
| 历史会话改写 | 多轮对话缺上下文 | “摄像头改进了什么” → “meta70 相比 meta60 摄像头有哪些改进” |
| 关键词扩写 | 输入太短 | “机器学习 实践” → “机器学习实际应用案例、工具方法” |
| 伪答案改写(HyDE) | 抽象问题 | “如何提高竞争力” → 加入假设性答案增强语义 |
| 缩写词改写 | 缩写与文档不匹配 | “VR” → “虚拟现实(Virtual Reality)” |
| 去噪改写(回溯) | 含大量背景冗余 | 剥离"我感觉很懵"等,保留核心意图 |
| 子查询改写 | 对比类多实体查询 | “C++ vs Go 系统编程” → 拆成两个独立子查询 |
EduRAG 由 LLM 根据查询特点动态选择改写策略,而非固定规则。
八、RAG 核心流程:从分类到生成
8.1 查询意图分类
用 BERT 微调二分类模型(bert-base-chinese)判断查询类型:
- 通用知识(如"什么是机器学习")→ 直接调 LLM,跳过检索
- 专业咨询(如"A I 学科学费")→ 进入 RAG 检索流程
分类前置可以大幅节省检索成本,避免无意义召回。
8.2 四种检索策略
| 策略 | 描述 | 适用场景 |
|---|---|---|
| 直接检索 | 原文直接查 | 意图明确、特定信息 |
| HyDE 假设问题检索 | LLM 生成假设答案后检索 | 抽象问题 |
| 子查询检索 | 拆分为多个子查询分别检索 | 多实体对比 |
| 回溯问题检索 | 简化为更基础问题后检索 | 复杂问题需简化 |
8.3 完整流程
用户查询
│
▼
1. BERT 意图分类
├─ 通用知识 → 直接 LLM 回答
└─ 专业咨询 ↓
2. LLM 选择检索策略(直接 / HyDE / 子查询 / 回溯)
3. BGE-M3 编码 → Milvus 混合检索(稠密 + 稀疏)
4. 召回子块 → 去重父块 → BGE-Reranker 重排序
5. 取 Top-M 父块作为上下文
6. 组装 Prompt(上下文 + 历史 + 问题)→ LLM 流式生成
8.4 关键参数速查
| 参数 | 默认值 | 说明 |
|---|---|---|
| BM25 相似度阈值 | 0.85 | Softmax 后低于此值视为不可靠 |
| 父块大小 | 1200 字符 | 提供上下文 |
| 子块大小 | 300 字符 | 用于检索 |
| 块重叠 | 50 字符 | 防止语义断裂 |
| retrieval_k | 3 | 混合检索 Top-K |
| candidate_m | 2 | 重排序后最终上下文数 |
| 对话历史轮数 | 5 | MySQL 持久化最近 5 轮 |
九、进阶:EduMentor 多 Agent 协作
EduRAG 是单 Agent 系统,进阶版 EduMentor 采用多 Agent 协作架构,解决更复杂的教育场景。
9.1 三层技术架构
- Function Call 决策层:LLM 智能决策,工具选择与调用
- MCP 工具服务层:标准化封装教育专用工具
- A2A 协作层:多 Agent 协议,支持任务分解与协作
9.2 五大核心 Agent
| Agent | 职责 |
|---|---|
| 智能答疑 Agent | RAG 知识检索 + 多模态输入 + 多轮对话 |
| 作业批改 Agent | 多题型识别 + 手写 OCR + 个性化分析 |
| 错题分析 Agent | 知识图谱定位 + 错题聚类 + 变式练习 |
| 练习生成 Agent | 难度自适应 + 认知负荷控制 + 个性化推荐 |
| 学习推送 Agent | 遗忘曲线 + 多渠道触达 + 效果反馈 |
9.3 关键优化点
- 二级缓存:本地 LRU + Redis,关键 API 响应 <500ms
- 异步批处理:Celery 队列 + 动态扩缩容,峰值 500 份/分钟
- 多模态融合:PaddleOCR + Mathpix + 语义校验,批改准确率 92%
- 置信度分级:>95% 自动通过,80-95% 教师复核,<80% 转人工
十、核心知识图谱总结
EduRAG 全链路:
文档加载 → 父子分块 → BGE-M3 编码 → Milvus 存储
↓
用户提问 → BM25 精确匹配 → BERT 意图分类 → LLM 策略选择
↓
Query 改写 → 混合检索 → 重排序 → LLM 生成
| 模块 | 核心技术 | 一句话要点 |
|---|---|---|
| FQA 精确匹配 | BM25 + Softmax + Redis | 高频问答秒级响应 |
| 向量数据库 | Milvus + IVF_FLAT/IP | 万亿级向量高效检索 |
| 嵌入模型 | BGE-M3(稠密+稀疏+多向量) | 一次编码三路召回 |
| 重排序 | BGE-Reranker CrossEncoder | 召回快、精排准 |
| 文档处理 | 父子分块 + 多模态 OCR | 小块检、大块用 |
| Query 改写 | 6 种策略动态选择 | 提升召回鲁棒性 |
| 检索策略 | 直接 / HyDE / 子查询 / 回溯 | 因题制宜 |
| 意图分类 | BERT 二分类 | 通用直答、专业走 RAG |
| 多 Agent | Function Call + MCP + A2A | 任务分解协作 |
十一、技术栈速览
| 类别 | 技术 |
|---|---|
| Web 框架 | FastAPI + WebSocket |
| LLM | 通义千问 Qwen 系列(DashScope) |
| 向量库 | Milvus 2.4 |
| 嵌入模型 | BGE-M3(1024 维) |
| 重排序 | BGE-Reranker-Large |
| 意图分类 | BERT(bert-base-chinese 微调) |
| 文档分割 | nlp_bert_document-segmentation_chinese-base |
| OCR | RapidOCR |
| 关系库 | MySQL(问答 + 对话历史) |
| 缓存 | Redis |
| 评估 | RAGAS |
| 压测 | Locust |
结语
EduRAG 系统揭示了一个高质量 RAG 项目的完整骨架:不是简单地"检索+生成",而是分层兜底、多路召回、动态策略、工程优化的系统工程。
掌握以下六点,你就握住了 EduRAG 的精髓:
- 三层架构:问候→BM25→RAG,能快则快、不能快则准
- 父子分块:小块检、大块用,兼顾精度与上下文
- 混合检索:BGE-M3 稠密+稀疏 + BGE-Reranker 精排
- Query 改写:6 种策略应对千奇百怪的用户提问
- 动态策略:LLM 根据查询特点选择检索路径
- 多 Agent 协作:Function Call + MCP + A2A 应对复杂场景