一.整体架构与工程流程目标1.理解RAG系统的基本原理及其在教育领域的应用场景2.掌握EduRAG系统的模块化设计和各模块的核心功能3.熟悉RAG系统从查询到生成回答的完整工作流程1.RAG系统整体架构介绍EduRAG智慧问答系统是一个基于RAG(Retrieval-Augmented Generation,检索增强生成)技术的智能问答平台,它通过结合信息检索和生成式模型,从知识库中提取相关信息并生成准确、自然的回答,系统采用工程化的模块化设计,代码结构清晰,便于开发、维护和扩展(1).系统背景RAG技术通过检索外部知识库增强大语言模型的回答能力,特别适用于需要专业知识的场景,EduRAG的支持多种文档格式和灵活的检索策略(2).模块化架构1). 整体结构系统的代码组织分为以下几个核心模块:base/:基础支持模块,负责配置、日志处理core/:核心逻辑模块,实现RAG的关键功能main.py:系统运行入口,支持数据处理和交互查询2).模块详情base模块:config.py:管理系统配置,如API密钥、模型选择等logger.py:记录系统运行日志,便于调试和监控core模块:document_processor.py:处理输入文档,分块并准备向量存储prompts.py:管理Prompt模板,支持不同任务query_classifier.py:分类用户查询类型strategy_selector.py:选择合适的检索策略vector_store.py:管理向量数据库,进行文档存储和检索rag_system.py:整合RAG流程,生成最终回答main.py:命令行交互入口,测试和运行系统3.代码目录结构2.RAG系统基本工作流程(1).步骤EduRAG系统的工作流程分为四个主要步骤,确保从用户查询到生成回答的高效性和准确性:1.查询分类:系统首先判断查询类型(如“通用知识”或“专业咨询”)通用知识直接由大语言模型回答,专业咨询进入检索流程2.策略选择:根据查询特点选择检索策略:直接检索:适用于明确查询,问题比较简单的HyDE检索(假设检索):适用于抽象问题,先假设一个答案,再进行检索子查询检索(子问题):把一个问题拆成多个简单问题,然后每个问题进行检索,再合并回答回溯检索:简化复杂问题后检索3.文档检索:使用vector_store.py从向量数据库中检索相关文档调用文档检索,支使用稠密向量(语义区分)和稀疏向量(词频/关键词)的混合检索,结果再通过ranker模型进行精排(重排序优化)生成回答:将检索到的文档作为上下文,结合用户查询输入大语言模型生成自然语言回答,若无答案则引导人工支持(2).流程图二.基础模块目标1.理解并掌握如何通过Config类集中管理系统的配置参数2.学会配置和使用日志记录器,实现对系统运行状态的监控3.认识base模块在系统架构中的作用,为后续核心逻辑奠定基础base模块是EduRAG智慧问答系统的基础,负责提供系统运行所需的核心功能,包括配置管理、日志记录,这些功能为系统的其他模块提供了稳定的支持,确保系统能够灵活配置、监控运行状态1.配置管理具体配置功能和上一篇一致, 详情见:【AI大模型应用开发】【项目实战】16.RAG智慧问答项目-(四)基于MySql库的问答系统(FQA模块)之基于Mysql数据库实现问答系统这里只是简单介绍一下配置管理, 以及需要新增的配置更新(1).功能config.py文件定义了Config类,用于集中管理系统中的所有配置参数,这些参数包括数据库连接信息、模型选择、分块策略、API设置等,通过集中管理配置,系统可以方便地调整参数、适配不同环境,并支持通过环境变量进行灵活配置(2).代码实现config.ini更新内容# MySQL 配置 [mysql] host = localhost # 实际工作中不会去用root账号,尤其是开发人员,尤其是生产环境 user = root password = 123456 database = subjects # Redis 配置 [redis] host = localhost port = 6379 # password = '123456' db = 0 # Milvus 配置 [milvus] host = localhost port = 19530 database_name = edu_ag collection_name = edu_rag # LLM 配置 [llm] model = qwen3.7-max dashscope_base_url = https://dashscope.aliyuncs.com/compatible-mode/v1 # 检索参数配置 [retrieval] # 父块大小 parent_chunk_size = 1200 # 子块大小 child_chunk_size = 300 # 父块和字块重叠的中间数: 一般大小为字块的1/5 chunk_overlap = 60 # 粗排结果 retrieval_k = 20 # 精排结果 candidate_m = 5 # 应用配置 [app] # 不同类型问题分区处理 valid_sources = ["ai", "java", "test", "ops", "bigdata"] # 客服电话 customer_service_phone = 10086 # 日志配置 [logger] log_file = F:/www/python-data/edu_rag/project/integrated_qa_system/logs/app.log # 控制台日志级别,可选值: DEBUG, INFO, WARNING, ERROR console_level = INFOconfig.py更新内容# base/config.py # 导入配置解析库 import configparser # 解析.ini文件的 # 导入路径操作库 import os class Config: # 初始化配置,加载 config.ini 文件 def __init__(self, config_file=None): # 创建配置解析器,启用插值功能 self.config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation()) # 如果没有提供配置文件路径,则使用默认路径 self.PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__)) self.LOG_DIR = os.path.join(self.PROJECT_ROOT, 'logs') self.MODELS_DIR = os.path.join(self.PROJECT_ROOT, 'rag_qa/models') if config_file is None: config_file = os.path.join(self.PROJECT_ROOT, 'config.ini') # 读取配置文件 self.config.read(config_file, encoding='utf-8') # MySQL 配置 # MySQL 主机地址 # fallback 表示默认值, 如果.ini配置文件中没有的话, 就只用fallback默认值数据 self.MYSQL_HOST = os.getenv('MYSQL_HOST', self.config.get('mysql', 'host', fallback='localhost')) # MySQL 用户名 self.MYSQL_USER = os.getenv('MYSQL_USER', self.config.get('mysql', 'user', fallback='edu_rag')) # MySQL 密码 self.MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD', self.config.get('mysql', 'password', fallback='123456')) # MySQL 数据库名