Skip to content

xiaoxiaoshu123456/Smart-Chat

Repository files navigation

项目概述.md

集成问答系统 (Integrated QA System) 项目概述

一、项目简介

项目名称:集成问答系统 (Integrated QA System)
项目路径E:\pycharm\llm_edu\integrated_qa_system
项目定位:基于 MySQL + RAG(检索增强生成)的智能教育问答系统,面向 IT 教育场景,为学生提供多学科知识问答服务。

二、核心功能

2.1 双路问答策略

  • MySQL QA(快速路径):基于 BM25 检索的精确匹配问答,适用于常见问题,响应速度快
  • RAG QA(深度路径):基于向量检索 + 大语言模型的生成式问答,适用于复杂问题,答案更灵活

2.2 智能路由机制

  • 通过 BM25 检索结果置信度(threshold=0.85)自动判断是否需要 RAG
  • 支持学科过滤(ai、java、test、ops、bigdata)
  • 查询分类器(BERT)区分通用知识和专业咨询

2.3 多策略检索增强

  • 直接检索:查询意图明确时直接检索
  • 假设问题检索(HyDE):生成假设答案后检索,适用于抽象问题
  • 子查询检索:将复杂查询拆分为多个子查询,分别检索后合并
  • 回溯问题检索:将复杂查询简化为更基础的问题后检索

2.4 对话历史管理

  • 基于 session_id 维护多轮对话上下文
  • MySQL 存储最近 5 轮对话历史
  • 支持对话历史查询和清除

2.5 流式输出

  • WebSocket 和 SSE 两种流式输出方式
  • 实时返回 LLM 生成的 token,提升用户体验

三、技术架构

3.1 技术栈

后端框架

  • 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 重排序模型

NLP 工具链

  • LangChain:RAG 框架,文档处理、文本切分
  • Transformers:BERT 模型加载和推理
  • Sentence-Transformers:Cross-Encoder 重排序

文档处理

  • PyMuPDF:PDF 解析
  • python-docx:Word 文档解析
  • python-pptx:PPT 解析
  • RapidOCR:图片 OCR 识别

3.2 系统架构

┌─────────────────────────────────────────────────────────┐
│                     前端界面                              │
│              (React/HTML + WebSocket)                   │
└────────────────────┬────────────────────────────────────┘
                     │
┌────────────────────▼────────────────────────────────────┐
│                  FastAPI 应用层                           │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │
│  │  REST API    │  │  WebSocket   │  │  SSE Stream  │  │
│  └──────────────┘  └──────────────┘  └──────────────┘  │
└────────────────────┬────────────────────────────────────┘
                     │
┌────────────────────▼────────────────────────────────────┐
│           集成问答系统 (IntegratedQASystem)               │
│  ┌──────────────────┐      ┌──────────────────┐        │
│  │   MySQL QA       │      │    RAG QA        │        │
│  │  ┌────────────┐  │      │  ┌────────────┐ │        │
│  │  │ BM25检索   │  │      │  │ 查询分类器  │ │        │
│  │  │ Redis缓存  │  │      │  │ 策略选择器  │ │        │
│  │  └────────────┘  │      │  │ 向量检索    │ │        │
│  └──────────────────┘      │  │ 重排序      │ │        │
│                            │  │ LLM生成     │ │        │
│                            │  └────────────┘ │        │
│                            └──────────────────┘        │
└────────────────────┬────────────────────────────────────┘
                     │
    ┌────────────────┼────────────────┐
    │                │                │
┌───▼────┐    ┌─────▼─────┐    ┌────▼─────┐
│ MySQL  │    │   Redis   │    │  Milvus  │
│        │    │           │    │          │
└────────┘    └───────────┘    └──────────┘

3.3 核心模块说明

3.3.1 MySQL QA 模块 (mysql_qa/)

  • BM25Search:基于 BM25 算法的关键词检索
  • MySQLClient:MySQL 数据库连接和查询
  • RedisClient:Redis 缓存管理
  • 数据预处理:文本清洗、分词处理

3.3.2 RAG QA 模块 (rag_qa/)

  • VectorStore:Milvus 向量数据库封装,支持混合检索(稠密+稀疏)
  • RAGSystem:RAG 核心逻辑,包含检索策略和答案生成
  • QueryClassifier:BERT 查询分类器(通用知识 vs 专业咨询)
  • StrategySelector:LLM 驱动的检索策略选择器
  • DocumentProcessor:文档处理流水线(加载、切分、向量化)
  • 文本切分器:中文递归切分、模型切分
  • 文档加载器:PDF、DOCX、PPTX、图片 OCR

3.3.3 集成系统 (new_main.py)

  • IntegratedQASystem:统一入口,协调 MySQL QA 和 RAG QA
  • 对话历史管理:MySQL 存储、查询、清除
  • 流式输出:生成器模式,逐 token 返回

3.3.4 Web 服务 (app.py, api.py)

  • app.py:FastAPI 主应用,支持 WebSocket 和 REST API
  • api.py:SSE 流式 API
  • 静态文件服务:前端页面托管

四、核心流程

4.1 查询处理流程

用户查询
    │
    ├─→ 问候语检测 → 返回模板回复
    │
    ├─→ BM25 检索(MySQL QA)
    │   │
    │   ├─→ 置信度 ≥ 0.85 → 返回 MySQL 答案
    │   │
    │   └─→ 置信度 < 0.85 → 进入 RAG QA
    │
    └─→ RAG QA 流程
        │
        ├─→ 查询分类器(BERT)→ 通用知识/专业咨询
        │
        ├─→ 策略选择器(LLM)→ 选择检索策略
        │   │
        │   ├─→ 直接检索
        │   ├─→ 假设问题检索(HyDE)
        │   ├─→ 子查询检索
        │   └─→ 回溯问题检索
        │
        ├─→ 向量检索(Milvus)
        │   ├─→ 稠密向量检索(BGE-M3)
        │   ├─→ 稀疏向量检索(BGE-M3)
        │   └─→ 混合检索 + 重排序(BGE-Reranker)
        │
        ├─→ 获取对话历史(最近 5 轮)
        │
        ├─→ LLM 生成答案(流式输出)
        │
        └─→ 保存对话历史

4.2 文档处理流程

原始文档(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)

五、关键特性

5.1 混合检索

  • 稠密向量检索:语义相似度匹配,适用于同义表达
  • 稀疏向量检索:关键词匹配,适用于精确术语
  • 加权融合:结合两种检索结果,提升召回率

5.2 重排序优化

  • 使用 Cross-Encoder(BGE-Reranker-Large)对 Top-K 结果重排序
  • 提升 Top-3 相关度,减少无关文档干扰

5.3 多策略自适应

  • LLM 驱动的策略选择,根据查询特点自动选择最佳检索策略
  • 支持复杂查询的分解和简化

5.4 对话上下文

  • 维护最近 5 轮对话历史
  • LLM 生成时考虑历史上下文,提升多轮对话连贯性

5.5 流式输出

  • WebSocket 和 SSE 两种方式
  • 实时返回 token,提升用户体验

六、配置说明

6.1 配置文件 (config.ini)

[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"]

6.2 环境依赖

主要依赖包(见 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

八、使用方式

8.1 启动服务

# 方式1:使用 app.py(WebSocket + REST)
python app.py

# 方式2:使用 api.py(SSE)
python api.py

# 方式3:命令行交互
python new_main.py

8.2 API 接口

REST API (/api/query)

POST /api/query
{
    "query": "什么是人工智能?",
    "source_filter": "ai",
    "session_id": "xxx-xxx-xxx"
}

WebSocket (/api/stream)

{
    "query": "什么是人工智能?",
    "source_filter": "ai",
    "session_id": "xxx-xxx-xxx"
}

SSE (/query)

POST /query
{
    "query": "什么是人工智能?",
    "source_filter": "ai",
    "session_id": "xxx-xxx-xxx"
}

8.3 文档处理

# 处理文档并导入向量库
python rag_qa/rag_main.py --data-processing --data-dir ./rag_qa/data

九、技术亮点

  1. 双路问答策略:MySQL QA 快速响应 + RAG QA 深度理解,兼顾速度和准确性
  2. 混合检索:稠密向量 + 稀疏向量,提升召回率和精确度
  3. 多策略自适应:LLM 驱动的策略选择,针对不同查询类型优化检索效果
  4. 流式输出:WebSocket 和 SSE 两种方式,实时返回答案,提升用户体验
  5. 对话历史管理:MySQL 存储,支持多轮对话上下文
  6. 查询分类:BERT 分类器区分通用知识和专业咨询
  7. 重排序优化:Cross-Encoder 重排序,提升 Top-K 相关度

十、应用场景

  • IT 教育问答:为学生提供 AI、Java、大数据等学科知识问答
  • 智能客服:自动回答常见问题,降低人工客服成本
  • 知识库检索:基于文档的语义检索和问答
  • 多轮对话:支持上下文相关的连续问答

十一、后续优化方向

  1. 性能优化:向量检索缓存、LLM 响应缓存
  2. 准确性提升:更精细的文档切分、更好的重排序策略
  3. 功能扩展:支持更多文档格式、多模态问答
  4. 监控告警:添加性能监控、错误告警
  5. A/B 测试:不同策略和参数的效果对比

文档生成时间:2025年1月
项目版本:v1.0
维护者:NLP 算法工程师团队

About

Smart Chat

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors