项目名称:集成问答系统 (Integrated QA System)
项目路径:E:\pycharm\llm_edu\integrated_qa_system
项目定位:基于 MySQL + RAG(检索增强生成)的智能教育问答系统,面向 IT 教育场景,为学生提供多学科知识问答服务。
- MySQL QA(快速路径):基于 BM25 检索的精确匹配问答,适用于常见问题,响应速度快
- RAG QA(深度路径):基于向量检索 + 大语言模型的生成式问答,适用于复杂问题,答案更灵活
- 通过 BM25 检索结果置信度(threshold=0.85)自动判断是否需要 RAG
- 支持学科过滤(ai、java、test、ops、bigdata)
- 查询分类器(BERT)区分通用知识和专业咨询
- 直接检索:查询意图明确时直接检索
- 假设问题检索(HyDE):生成假设答案后检索,适用于抽象问题
- 子查询检索:将复杂查询拆分为多个子查询,分别检索后合并
- 回溯问题检索:将复杂查询简化为更基础的问题后检索
- 基于 session_id 维护多轮对话上下文
- MySQL 存储最近 5 轮对话历史
- 支持对话历史查询和清除
- WebSocket 和 SSE 两种流式输出方式
- 实时返回 LLM 生成的 token,提升用户体验
- FastAPI:异步 Web 框架,支持 RESTful API 和 WebSocket
- Uvicorn:ASGI 服务器
- MySQL:存储结构化问答数据、对话历史
- Redis:BM25 索引缓存、会话缓存
- Milvus:向量数据库,存储文档向量和稀疏向量
- DashScope/Qwen:通过 OpenAI 兼容接口调用通义千问模型(qwen-plus)
- BERT-base-chinese:查询分类、文档分割
- BGE-M3:多语言稠密+稀疏向量模型,支持混合检索
- BGE-Reranker-Large:Cross-Encoder 重排序模型
- LangChain:RAG 框架,文档处理、文本切分
- Transformers:BERT 模型加载和推理
- Sentence-Transformers:Cross-Encoder 重排序
- PyMuPDF:PDF 解析
- python-docx:Word 文档解析
- python-pptx:PPT 解析
- RapidOCR:图片 OCR 识别
┌─────────────────────────────────────────────────────────┐
│ 前端界面 │
│ (React/HTML + WebSocket) │
└────────────────────┬────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────┐
│ FastAPI 应用层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ REST API │ │ WebSocket │ │ SSE Stream │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└────────────────────┬────────────────────────────────────┘
│
┌────────────────────▼────────────────────────────────────┐
│ 集成问答系统 (IntegratedQASystem) │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ MySQL QA │ │ RAG QA │ │
│ │ ┌────────────┐ │ │ ┌────────────┐ │ │
│ │ │ BM25检索 │ │ │ │ 查询分类器 │ │ │
│ │ │ Redis缓存 │ │ │ │ 策略选择器 │ │ │
│ │ └────────────┘ │ │ │ 向量检索 │ │ │
│ └──────────────────┘ │ │ 重排序 │ │ │
│ │ │ LLM生成 │ │ │
│ │ └────────────┘ │ │
│ └──────────────────┘ │
└────────────────────┬────────────────────────────────────┘
│
┌────────────────┼────────────────┐
│ │ │
┌───▼────┐ ┌─────▼─────┐ ┌────▼─────┐
│ MySQL │ │ Redis │ │ Milvus │
│ │ │ │ │ │
└────────┘ └───────────┘ └──────────┘
- BM25Search:基于 BM25 算法的关键词检索
- MySQLClient:MySQL 数据库连接和查询
- RedisClient:Redis 缓存管理
- 数据预处理:文本清洗、分词处理
- VectorStore:Milvus 向量数据库封装,支持混合检索(稠密+稀疏)
- RAGSystem:RAG 核心逻辑,包含检索策略和答案生成
- QueryClassifier:BERT 查询分类器(通用知识 vs 专业咨询)
- StrategySelector:LLM 驱动的检索策略选择器
- DocumentProcessor:文档处理流水线(加载、切分、向量化)
- 文本切分器:中文递归切分、模型切分
- 文档加载器:PDF、DOCX、PPTX、图片 OCR
- IntegratedQASystem:统一入口,协调 MySQL QA 和 RAG QA
- 对话历史管理:MySQL 存储、查询、清除
- 流式输出:生成器模式,逐 token 返回
- app.py:FastAPI 主应用,支持 WebSocket 和 REST API
- api.py:SSE 流式 API
- 静态文件服务:前端页面托管
用户查询
│
├─→ 问候语检测 → 返回模板回复
│
├─→ BM25 检索(MySQL QA)
│ │
│ ├─→ 置信度 ≥ 0.85 → 返回 MySQL 答案
│ │
│ └─→ 置信度 < 0.85 → 进入 RAG QA
│
└─→ RAG QA 流程
│
├─→ 查询分类器(BERT)→ 通用知识/专业咨询
│
├─→ 策略选择器(LLM)→ 选择检索策略
│ │
│ ├─→ 直接检索
│ ├─→ 假设问题检索(HyDE)
│ ├─→ 子查询检索
│ └─→ 回溯问题检索
│
├─→ 向量检索(Milvus)
│ ├─→ 稠密向量检索(BGE-M3)
│ ├─→ 稀疏向量检索(BGE-M3)
│ └─→ 混合检索 + 重排序(BGE-Reranker)
│
├─→ 获取对话历史(最近 5 轮)
│
├─→ LLM 生成答案(流式输出)
│
└─→ 保存对话历史
原始文档(PDF/DOCX/PPTX/图片)
│
├─→ 文档加载器
│ ├─→ PDF 解析(PyMuPDF)
│ ├─→ Word 解析(python-docx)
│ ├─→ PPT 解析(python-pptx)
│ └─→ 图片 OCR(RapidOCR)
│
├─→ 文本切分
│ ├─→ 父块切分(1200 tokens)
│ └─→ 子块切分(300 tokens,重叠 50)
│
├─→ 向量化(BGE-M3)
│ ├─→ 稠密向量(1024 维)
│ └─→ 稀疏向量
│
└─→ 存储到 Milvus
├─→ 文档内容
├─→ 向量表示
├─→ 元数据(学科类别、时间戳、父块ID)
└─→ 索引构建(IVF_FLAT)
- 稠密向量检索:语义相似度匹配,适用于同义表达
- 稀疏向量检索:关键词匹配,适用于精确术语
- 加权融合:结合两种检索结果,提升召回率
- 使用 Cross-Encoder(BGE-Reranker-Large)对 Top-K 结果重排序
- 提升 Top-3 相关度,减少无关文档干扰
- LLM 驱动的策略选择,根据查询特点自动选择最佳检索策略
- 支持复杂查询的分解和简化
- 维护最近 5 轮对话历史
- LLM 生成时考虑历史上下文,提升多轮对话连贯性
- WebSocket 和 SSE 两种方式
- 实时返回 token,提升用户体验
[mysql]
host = your_Ip
port = 3306
user = root
password = password
database = subjects_kg
[redis]
host = your_Ip
port = 6379
password = 1234
db = 0
[milvus]
host = your_Ip
port = 19530
database_name = itcast
collection_name = edurag_final
[llm]
model = qwen-plus
dashscope_api_key = sk-xxx
dashscope_base_url = https://dashscope.aliyuncs.com/compatible-mode/v1
[retrieval]
parent_chunk_size = 1200
child_chunk_size = 300
chunk_overlap = 50
retrieval_k = 3
candidate_m = 2
[app]
valid_sources = ["ai", "java", "test", "ops", "bigdata"]主要依赖包(见 requirments.txt):
- FastAPI、Uvicorn(Web 框架)
- PyMySQL、Redis(数据存储)
- pymilvus、milvus-model(向量数据库)
- openai(DashScope API)
- langchain、langchain-community(RAG 框架)
- transformers、sentence-transformers(NLP 模型)
- torch(深度学习框架)
- PyMuPDF、python-docx、python-pptx(文档处理)
- RapidOCR(OCR 识别)
integrated_qa_system/
├── app.py # FastAPI 主应用(WebSocket + REST)
├── api.py # SSE 流式 API
├── new_main.py # 集成问答系统核心逻辑
├── config.ini # 配置文件
├── requirments.txt # 依赖包列表
│
├── base/ # 基础模块
│ ├── config.py # 配置管理
│ └── logger.py # 日志管理
│
├── mysql_qa/ # MySQL QA 模块
│ ├── main.py # MySQL QA 主入口
│ ├── db/
│ │ └── mysql_client.py # MySQL 客户端
│ ├── cache/
│ │ └── redis_client.py # Redis 客户端
│ ├── retrieval/
│ │ └── bm25_search.py # BM25 检索
│ └── utils/
│ └── preprocess.py # 数据预处理
│
├── rag_qa/ # RAG QA 模块
│ ├── rag_main.py # RAG 主入口
│ ├── core/
│ │ ├── rag_system.py # RAG 核心系统
│ │ ├── new_rag_system.py # 新版 RAG 系统(流式输出)
│ │ ├── vector_store.py # 向量存储封装
│ │ ├── query_classifier.py # 查询分类器
│ │ ├── strategy_selector.py # 策略选择器
│ │ ├── document_processor.py # 文档处理
│ │ └── prompts.py # 提示词模板
│ ├── edu_document_loaders/ # 教育文档加载器
│ │ ├── edu_pdfloader.py
│ │ ├── edu_docloader.py
│ │ ├── edu_pptloader.py
│ │ └── edu_ocr.py
│ ├── edu_text_spliter/ # 文本切分器
│ │ └── edu_chinese_recursive_text_splitter.py
│ ├── models/ # 预训练模型
│ │ ├── bert-base-chinese/
│ │ ├── bge-m3/
│ │ └── bge-reranker-large/
│ └── data/ # 数据目录
│
├── static/ # 前端静态文件
│ └── index.html
│
└── logs/ # 日志目录
└── app.log
# 方式1:使用 app.py(WebSocket + REST)
python app.py
# 方式2:使用 api.py(SSE)
python api.py
# 方式3:命令行交互
python new_main.pyPOST /api/query
{
"query": "什么是人工智能?",
"source_filter": "ai",
"session_id": "xxx-xxx-xxx"
}{
"query": "什么是人工智能?",
"source_filter": "ai",
"session_id": "xxx-xxx-xxx"
}POST /query
{
"query": "什么是人工智能?",
"source_filter": "ai",
"session_id": "xxx-xxx-xxx"
}# 处理文档并导入向量库
python rag_qa/rag_main.py --data-processing --data-dir ./rag_qa/data- 双路问答策略:MySQL QA 快速响应 + RAG QA 深度理解,兼顾速度和准确性
- 混合检索:稠密向量 + 稀疏向量,提升召回率和精确度
- 多策略自适应:LLM 驱动的策略选择,针对不同查询类型优化检索效果
- 流式输出:WebSocket 和 SSE 两种方式,实时返回答案,提升用户体验
- 对话历史管理:MySQL 存储,支持多轮对话上下文
- 查询分类:BERT 分类器区分通用知识和专业咨询
- 重排序优化:Cross-Encoder 重排序,提升 Top-K 相关度
- IT 教育问答:为学生提供 AI、Java、大数据等学科知识问答
- 智能客服:自动回答常见问题,降低人工客服成本
- 知识库检索:基于文档的语义检索和问答
- 多轮对话:支持上下文相关的连续问答
- 性能优化:向量检索缓存、LLM 响应缓存
- 准确性提升:更精细的文档切分、更好的重排序策略
- 功能扩展:支持更多文档格式、多模态问答
- 监控告警:添加性能监控、错误告警
- A/B 测试:不同策略和参数的效果对比
文档生成时间:2025年1月
项目版本:v1.0
维护者:NLP 算法工程师团队