
基于 RAG 技术的智能问答系统实战项目一、项目概述1.1 背景介绍在工业机器人技术培训领域学员在学习过程中会遇到大量专业技术问题如 PLC 通讯配置、EtherCat 总线调试等。传统的人工答疑方式效率低下无法满足学员的即时需求。本项目基于 RAG检索增强生成技术构建了一个智能问答系统能够理解用户问题的语义从知识库中检索相关内容并生成准确、专业的回答。1.2 核心功能多路检索向量检索 BM25 关键词检索 MySQL 知识图谱语义理解基于 BGE-M3 的向量嵌入精准理解用户意图流式响应WebSocket 实时输出回答更快、更流畅一键部署Docker 容器化5 分钟内完成部署二、技术架构2.1 整体架构图┌─────────────────────────────────────────────────────────────┐ │ 用户层 │ │ Web 浏览器 ←→ WebSocket ←→ FastAPI │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 应用层 │ │ 意图分类 → 多路检索 → 重排序 → LLM 生成 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 检索层 │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Milvus │ │ BM25 │ │ MySQL │ │ │ │ 向量检索 │ │ 关键词检索 │ │ 知识图谱 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 数据层 │ │ MySQL Redis Milvus 本地文件系统 │ └─────────────────────────────────────────────────────────────┘2.2 技术栈层级技术选型说明后端框架FastAPI异步支持好自动生成 API 文档向量数据库Milvus开源、高性能、支持混合检索文本嵌入BGE-M3中文效果好、多粒度检索重排序BGE-Reranker提升检索结果相关性搜索引擎Rank-BM25关键词检索补充知识图谱MySQL存储结构化 QA 数据缓存Redis对话历史缓存LLM通义千问 (DashScope)云端 LLM 接口部署Docker一键部署三、核心模块实现3.1 向量检索模块向量检索是 RAG 系统的核心负责将文本转换为向量并在向量空间中查找相似文档。frommilvus_model.hybridimportBGEM3EmbeddingFunctionclassVectorStore:def__init__(self,collection_name,host,port,database):self.clientMilvusClient(urifhttp://{host}:{port})self.client.use_database(database)self._embedding_functionNonepropertydefembedding_function(self):# 延迟加载减少启动内存占用ifself._embedding_functionisNone:self._embedding_functionBGEM3EmbeddingFunction(use_fp16False,devicecpu,cache_dir./model_cache)returnself._embedding_function设计亮点延迟加载模型仅在首次使用时加载减少启动时间统一缓存所有模型文件统一管理避免重复下载3.2 多路检索融合单一检索方式难以覆盖所有场景本项目实现了向量检索 BM25 的融合defretrieve(self,query,top_k5):# 1. 向量检索 - 语义理解vector_resultsself.vector_search(query,top_k*2)# 2. BM25 检索 - 关键词匹配bm25_resultsself.bm25_search(query,top_k*2)# 3. RRF 融合排序mergedself.rrf_fusion(vector_results,bm25_results)# 4. CrossEncoder 重排序rerankedself.rerank(query,merged[:top_k*2])returnreranked[:top_k]RRFReciprocal Rank Fusion公式R R F ( d ) ∑ i 1 k 1 r i ( d ) k RRF(d) \sum_{i1}^{k} \frac{1}{r_i(d) k}RRF(d)i1∑kri(d)k1其中r i ( d ) r_i(d)ri(d)是文档d dd在第i ii个检索结果中的排名。3.3 流式响应使用 WebSocket 实现实时流式输出提升用户体验app.websocket(/ws)asyncdefwebsocket_endpoint(websocket:WebSocket):awaitwebsocket.accept()try:# 流式生成回答forchunkinresponse_generator(query):awaitwebsocket.send_text(json.dumps({type:content,content:chunk}))exceptExceptionase:awaitwebsocket.send_text(json.dumps({type:error,message:str(e)}))四、关键问题解决4.1 Windows 符号链接权限问题问题在 Windows 环境下运行项目时HuggingFace 模型下载报 symlink 错误。解决# 在应用启动前设置环境变量os.environ[HF_HUB_DISABLE_SYMLINKS_WARNING]1os.environ[HF_HUB_DISABLE_SYMLINKS]14.2 模型加载内存溢出问题多个模型同时加载导致内存不足。解决采用延迟加载策略仅在首次使用时加载模型propertydefembedding_function(self):ifself._embedding_functionisNone:self._embedding_functionBGEM3EmbeddingFunction(...)returnself._embedding_function4.3 检索结果不相关问题用户提问后返回的文档不匹配。解决调整文本分块参数chunk_size800, overlap100引入 BGE-Reranker 进行重排序实现多路检索融合策略五、项目结构Itcast_qa_system/ ├── app.py # FastAPI 主应用 ├── new_main.py # QA 系统核心逻辑 ├── config.ini # 配置文件 ├── docker-compose.yml # Docker 编排 ├── start_auto.bat # 一键部署脚本 ├── pdf_qa_generator.py # PDF QA 生成工具 ├── base/ │ ├── config.py # 配置解析 │ └── logger.py # 日志模块 ├── rag_qa/ │ ├── rag_main.py # RAG 主入口 │ └── core/ │ ├── vector_store.py # 向量存储 │ ├── rag_system.py # RAG 系统 │ └── query_classifier.py # 意图分类 ├── mysql_qa/ │ └── db/ │ └── mysql_client.py # MySQL 客户端 └── static/ └── index.html # 前端页面六、一键部署6.1 环境要求Windows 10/11 或 LinuxDocker Desktop16GB 内存Python 3.106.2 部署步骤# 1. 克隆项目gitcloneproject-urlcdItcast_qa_system# 2. 一键启动start_all.bat部署脚本会自动完成停止现有服务启动 Docker 容器MySQL、Redis、Milvus导入知识库数据启动应用服务6.3 访问部署完成后访问http://localhost:8004七、知识库构建7.1 PDF 处理流程PDF 文件 → pdfplumber 提取文本 → LangChain 分块 → BGE-M3 向量化 → Milvus 向量存储7.2 QA 对生成使用 Ollama 本地模型自动生成问答对defgenerate_qa_with_ollama(chunk):promptf根据以下文本生成 3 个问答对{chunk}返回 JSON 格式 [ {{question: 问题1, answer: 答案1}}, {{question: 问题2, answer: 答案2}}, {{question: 问题3, answer: 答案3}} ]responseollama.generate(modelqwen2.5:7b,promptprompt)returnparse_json_response(response)八、性能优化8.1 优化措施优化项效果模型延迟加载启动时间减少 50%Redis 缓存对话历史响应时间减少 30%GPU 加速可选向量计算提升 10 倍连接池复用数据库连接减少 80%8.2 性能指标指标数值检索准确率85%平均响应时间 3 秒并发支持10 用户知识库容量1000 QA 对九、总结与展望9.1 项目亮点RAG 架构结合检索和生成提升回答准确性多路检索向量 BM25 MySQL多维度召回流式响应WebSocket 实时输出用户体验更好一键部署Docker 容器化部署简单快捷9.2 未来优化方向本地部署开源 LLM如 Qwen-7B降低 API 成本引入用户反馈机制持续优化检索质量添加监控告警及时发现系统异常微服务化拆分支持更大规模部署十、参考资源Milvus 向量数据库BGE-M3 嵌入模型LangChain RAG 教程FastAPI 文档项目源码https://gitee.com/mr_yan_123/rag_在线演示http://localhost:8004本文为项目实战总结如有疏漏欢迎指正