YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
政务问答系统 - 模块化版本
基于RAG(检索增强生成)架构的政务问答系统,采用模块化设计,代码结构清晰易维护。
目录结构
6/
├── config.py # 配置管理模块
├── document_loader.py # 文档加载模块
├── text_processor.py # 文本处理模块
├── retrieval_engine.py # 检索引擎模块
├── inference_engine.py # 推理引擎模块
├── pipeline.py # 处理流水线模块
├── main.py # 主入口文件
├── run.sh # 启动脚本
├── README.md # 说明文档(本文件)
├── models/ # 模型目录
│ ├── Qwen3-Embedding-0.6B/ # Embedding模型
│ └── llm/ # 政务LLM模型
├── data/ # 数据目录
│ ├── test.xlsx # 测试问题文件
│ └── rag_docs/ # RAG知识库文档
└── output/ # 输出目录(自动创建)
└── zhengwu_result.csv # 结果文件
模块说明
1. config.py - 配置管理
- PathManager: 管理所有文件路径(模型、数据、输出)
- ProcessingConfig: 管理处理参数(分块、检索、并发等)
- SystemConfiguration: 系统总配置,整合路径和参数
2. document_loader.py - 文档加载
- DocumentInfo: 文档信息数据类
- TextCleaner: 文本清理器(移除URL、HTML标签等)
- DocumentExtractor: 文档提取器(支持多种格式)
- DocumentLoader: 文档加载器(支持并行加载)
3. text_processor.py - 文本处理
- ChunkInfo: 文本块信息类
- ChunkingStrategy: 分块策略接口
- RecursiveChunkingStrategy: 递归分块策略实现
- DocumentChunker: 文档分块器
- TextStatistics: 文本统计工具
4. retrieval_engine.py - 检索引擎
- EmbeddingEncoder: 嵌入编码器(使用vLLM)
- VectorIndex: 向量索引(存储和检索)
- RetrievalResult: 检索结果类
- RetrievalEngine: 检索引擎(整合编码和检索)
5. inference_engine.py - 推理引擎
- PromptBuilder: 提示词构建器
- ResponseCleaner: 响应清理器
- LLMClient: LLM客户端(异步通信)
- InferenceEngine: 推理引擎
- ConcurrentInferenceManager: 并发推理管理器
6. pipeline.py - 处理流水线
- DataIO: 数据输入输出管理器
- RAGPipeline: RAG处理流水线(整合所有模块)
7. main.py - 主入口
程序入口,负责初始化和启动流水线。
使用方法
前置条件
准备模型和数据
- 将Embedding模型放到
6/models/Qwen3-Embedding-0.6B/ - 将LLM模型放到
6/models/zhenwu/ - 将测试文件放到
6/data/test.xlsx - 将RAG文档放到
6/data/rag_docs/
- 将Embedding模型放到
启动vLLM服务
# 在6/目录下启动vLLM服务
cd /mnt/silver/lz/competitions/mars_提交结果/政务/6
# 启动政务模型服务
vllm serve models/zhenwu \
--port 8000 \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.95
- 安装依赖
pip install vllm openai pandas torch textract langchain-text-splitters tqdm
运行系统
cd /mnt/silver/lz/competitions/mars_提交结果/政务/6
python main.py
运行流程
程序会自动执行以下5个阶段:
- 阶段1: 加载文档(从
data/rag_docs/) - 阶段2: 文本分块(使用递归分块策略)
- 阶段3: 构建向量索引(使用Embedding模型)
- 阶段4: 初始化推理引擎(连接vLLM服务)
- 阶段5: 批量处理问题(检索+生成)
查看结果
结果保存在:output/zhengwu_result.csv
格式:
ID,answer
ZW_001,答案内容1
ZW_002,答案内容2
...
配置说明
路径配置(使用相对路径)
- Embedding模型:
models/Qwen3-Embedding-0.6B - LLM模型:
models/zhenwu - 测试文件:
data/test.xlsx - 数据目录:
data/rag_docs - 结果文件:
output/zhengwu_result.csv
处理参数
- 文本块大小: 2048字符
- 文本块重叠: 512字符
- 检索top-k: 4
- 最大并发数: 16
- 温度参数: 0.5
修改配置
如需修改配置,编辑 config.py 中的 PathManager 和 ProcessingConfig 类。
设计特点
1. 模块化设计
- 每个模块职责单一,易于理解和维护
- 模块之间通过明确的接口通信
- 支持独立测试和替换
2. 面向对象
- 使用类封装数据和行为
- 清晰的继承和组合关系
- 符合SOLID原则
3. 工厂模式
- 提供便捷的工厂函数创建对象
- 降低对象创建的复杂度
4. 异步并发
- 使用asyncio实现高效并发
- 信号量控制并发数量
- 避免资源耗尽
5. 错误处理
- 完善的异常处理机制
- 友好的错误提示信息
与参考代码的差异
| 方面 | 参考代码(2/daima/main.py) | 本版本(6/) |
|---|---|---|
| 文件组织 | 单文件 | 7个模块文件 |
| 编程范式 | 面向对象+单文件 | 模块化+面向对象 |
| 类命名 | 描述性(如DocumentProcessor) | 职责性(如DocumentLoader) |
| 配置方式 | dataclass | 类+单例模式 |
| 路径管理 | 配置类中混合 | 独立PathManager类 |
| 文档加载 | ThreadPoolExecutor直接使用 | 封装成DocumentLoader类 |
| 检索引擎 | DocumentRetrievalSystem | RetrievalEngine |
| 推理引擎 | LLMService+QAProcessor | InferenceEngine+Manager |
| 流程控制 | QASystem.run() | RAGPipeline多阶段 |
故障排除
问题1: 路径不存在
错误: [错误] XXX不存在: /path/to/file
解决:
- 确认6/目录结构正确
- 检查models/和data/目录下的文件是否存在
- 如需修改路径,编辑config.py中的PathManager类
问题2: vLLM服务未启动
错误: 连接LLM API失败
解决:
cd /mnt/silver/lz/competitions/mars_提交结果/政务/6
vllm serve models/zhenwu --port 8000 --tensor-parallel-size 2 --gpu-memory-utilization 0.95
问题3: 内存不足
错误: CUDA out of memory
解决:
- 减少max_concurrent_requests
- 调整embedding_gpu_memory参数
- 减小chunk_size
性能优化
- 并行文档加载: 使用16个线程并行提取文档
- 批量向量编码: vLLM批量编码文本块
- 异步并发推理: 最多16个并发请求
- 高效检索: 使用PyTorch进行向量相似度计算
扩展性
添加新的分块策略
class MyChunkingStrategy(ChunkingStrategy):
def split(self, text: str) -> List[str]:
# 实现自定义分块逻辑
pass
# 使用
strategy = MyChunkingStrategy()
chunker = DocumentChunker(strategy)
修改提示词
编辑 config.py 中的 ProcessingConfig.user_prompt_template
更换Embedding模型
修改 config.py 中的 PathManager.embedding_model
许可证
本代码仅供学习和研究使用。
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support