智能问答系统设计:BM25、Milvus 与 RAG 核心技术汇总

一文读懂 EduRAG 三层问答架构、FQA 系统、Milvus 向量库、BGE-M3 混合检索、Query 改写与多 Agent 协作

本文是 EduRAG 系列 11 篇文章的精华浓缩,按"架构→检索→生成→进阶"的顺序,帮你用最短时间掌握企业级 RAG 系统的完整知识体系。

候选标题(5 选 1)

  1. 《EduRAG 精华:从 BM25 到混合检索的智能问答系统全解析》(当前使用)
  2. 《一文读懂 EduRAG:三层架构与 RAG 全链路实战精华》
  3. 《智能问答系统设计:从 FQA 到 RAG 的完整进化路径》
  4. 《EduRAG 全流程精要:检索、改写、向量存储与多 Agent 协作》
  5. 《构建企业级教育问答系统: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 编码
.pdf 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_idparent_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 的精髓:

  1. 三层架构:问候→BM25→RAG,能快则快、不能快则准
  2. 父子分块:小块检、大块用,兼顾精度与上下文
  3. 混合检索:BGE-M3 稠密+稀疏 + BGE-Reranker 精排
  4. Query 改写:6 种策略应对千奇百怪的用户提问
  5. 动态策略:LLM 根据查询特点选择检索路径
  6. 多 Agent 协作:Function Call + MCP + A2A 应对复杂场景