这是一个基于 RAG(检索增强生成)技术的自动问答系统,用于回答铁路/轨道交通领域的专业问题。系统采用混合检索策略(向量检索 + BM25关键词检索 + Rerank重排序),支持多语言文档检索和智能查询扩展。
- 📚 处理 100+ 份 PDF 技术文档(支持Tesseract OCR + pymupdf识别扫描版PDF)
- 🔍 混合检索系统:向量检索 + BM25关键词检索 + Rerank重排序
- 🌐 跨语言检索:中文查询自动扩展英文术语,支持多语言文档
- 🎯 动态权重调整:根据问题类型自动调整检索策略
- 🤖 AI 自动问答(支持多轮推理)
- 📊 支持基础题、中级题、高级题三个难度
- 📝 完整的RAG检索日志系统
- 🎯 模块化Prompt管理
首次运行(需要构建向量数据库):
- 下载模型:10-20 分钟(BGE embedding + Reranker,约 2.4GB)
- 处理文档:40-60 分钟(100+ PDF,包含 OCR 识别)
- 生成向量:20-40 分钟(22,953 个文档块)
- 总计:约 1-2 小时
后续运行(向量数据库已存在):
- 加载向量数据库:< 5 秒
- 加载模型:10-20 秒
- 总计:约 15-30 秒
答题速度:
- 单题处理:1.5-3 分钟/题(取决于 LLM API 响应速度和检索复杂度)
- 15 道题总计:约 25-45 分钟
喀斯特/
├── kasik/ # 核心业务代码
│ ├── main_runner.py # 主运行入口
│ ├── qa_engine.py # 问答引擎(核心逻辑)
│ ├── database_manager.py # 向量数据库管理
│ ├── hybrid_retriever.py # 混合检索器(V2优化版)
│ ├── query_rewriter.py # 查询扩展/改写器
│ ├── chunk_merger.py # 相邻块合并
│ ├── table_aware_processor.py # 表格感知处理
│ ├── context_compressor.py # 上下文压缩(可选)
│ ├── confidence_scorer.py # 置信度评估(可选)
│ ├── result_manager.py # 结果管理与导出
│ ├── rag_logger.py # RAG检索日志记录
│ ├── text_cleaner.py # 文本清理(支持IEEE标准)
│ └── config.py # 配置管理
├── utils/ # 工具模块
│ ├── LLM.py # 语言模型接口
│ ├── Embeddings.py # 嵌入模型
│ ├── VectorBase.py # 向量数据库
│ └── utils.py # 工具函数(支持OCR)
├── prompts/ # Prompt模板管理
│ ├── prompt_loader.py # Prompt加载器
│ └── expert_rag_prompt.txt # 专家RAG提示
├── scripts/ # 工具脚本
│ └── convert_to_template.py # 格式转换工具
├── version/ # 历史版本代码(当前未使用)
├── tmp/ # 临时文件(测试脚本使用)
├── log/ # RAG检索日志
├── result/ # 答题结果
├── storage/ # 向量数据库
└── AI_database/ # 原始文档
# 1. 进入项目目录
cd 喀斯特
# 2. 激活虚拟环境
source kasik/venv/bin/activate
# 3. 配置API密钥(创建 .env 文件)
cat > .env << 'EOF'
CLOUD_MODEL=DeepSeek-R1
CLOUD_API_KEY=你的API_KEY
CLOUD_BASE_URL=https://ai.api.coregpu.cn/v1
EOF
# 4. 运行答题系统
cd kasik
python main_runner.py
# 5. 转换为提交格式
cd ..
python scripts/convert_to_template.py result/answers_最新时间戳.json运行完成后,提交文件位于:result/template_format.json
系统运行完成后会自动:
- ✅ 保存完整答案到 JSON 文件
- ✅ 导出问答对到 CSV 格式
- ✅ 生成详细的 RAG 检索日志
- ✅ 生成统计摘要
注意:终端末尾可能出现的 KeyError: '/loky-xxx' 是 Python 多进程库(loky)的清理警告,不影响主要功能,可以忽略。
技术栈:
- 向量检索:BAAI/bge-large-zh-v1.5(中文语义模型)
- BM25检索:基于jieba分词的关键词匹配
- Rerank重排序:BAAI/bge-reranker-v2-m3(多语言重排序)
动态权重调整:
- 时间/日期类问题:65% BM25权重(精确匹配更重要)
- 排名/统计类问题:65% BM25权重(需要精确数值)
- 标准号/版本号查询:60% BM25权重
- 概念性问题:70% 向量权重(语义理解更重要)
- 默认:60% 向量 + 40% BM25
自动术语翻译:
- 中文术语自动扩展为英文翻译
- 例如:"牵引系统" →
traction system M_VOLTAGE NID_CTRACTION - 支持机构名称、技术术语、地区名称等
查询扩展策略:
- 时间类问题:添加西班牙语/英语时间关键词
- 排名类问题:自动添加相关城市/地区名称
- SUBSET-026技术文档:添加变量名和英文术语
关键词提取:
- 技术术语自动加权(如 IEEE、CBTC、ERTMS)
- 标准号、版本号、变量名高优先级匹配
相邻块合并:
- 自动合并相邻的文档块,保持上下文完整性
表格感知处理:
- 自动识别数值类查询
- 提取表格数据并结构化处理
# 克隆项目
git clone <repository-url>
cd 喀斯特
# 创建虚拟环境
python3 -m venv kasik/venv
source kasik/venv/bin/activate # Windows: kasik\venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 可选:安装OCR支持(用于处理扫描版PDF)
pip install pytesseract pdf2image
brew install poppler tesseract tesseract-lang # macOS
# Ubuntu/Debian: sudo apt-get install poppler-utils tesseract-ocr tesseract-ocr-chi-sim创建 .env 文件(项目根目录):
# LLM 模型配置
CLOUD_MODEL=DeepSeek-R1
CLOUD_API_KEY=你的API_KEY
CLOUD_BASE_URL=https://ai.api.coregpu.cn/v1本项目默认启用离线模式(HF_HUB_OFFLINE=1),优先使用本地缓存的 HuggingFace 模型。
如果本地没有模型缓存,首次运行前需要先下载模型:
# 临时禁用离线模式运行一次(会自动下载模型)
cd kasik
HF_HUB_OFFLINE=0 TRANSFORMERS_OFFLINE=0 python -c "
from sentence_transformers import SentenceTransformer, CrossEncoder
print('下载 Embedding 模型...')
SentenceTransformer('BAAI/bge-large-zh-v1.5')
print('下载 Reranker 模型...')
CrossEncoder('BAAI/bge-reranker-v2-m3')
print('✅ 模型下载完成!')
"模型缓存位置:~/.cache/huggingface/hub/
所需模型:
BAAI/bge-large-zh-v1.5- Embedding模型(约1.3GB)BAAI/bge-reranker-v2-m3- Reranker模型(约1.1GB)
确保 AI_database/ 目录包含所有 PDF 文档:
# 解压数据库(如果是压缩包)
unzip AI_database.zip
# 验证数据结构
ls AI_database/
# 应包含:事故报告/、技术报告/、标准规范/、行业报告/# 激活虚拟环境
source kasik/venv/bin/activate
# 进入运行目录
cd kasik
# 运行主程序
python main_runner.py首次运行:
- 下载 BGE embedding 模型(约 1.3GB)
- 处理 100+ PDF 文档(自动检测扫描版并OCR)
- 生成向量数据库
- 预计耗时:1-2 小时
后续运行:
- 直接加载本地向量数据库
- 秒级启动
编辑 kasik/config.py:
# 检索数量配置
self.BASIC_K = 60 # 基础题检索数量
self.MEDIUM_K = 60 # 中级题检索数量
self.ADVANCED_K = 50 # 高级题检索数量
# 混合检索配置
self.HYBRID_ALPHA = 0.6 # 向量检索权重
self.ENABLE_DYNAMIC_WEIGHT = True # 启用动态权重调整
self.ENABLE_CHUNK_MERGE = True # 启用相邻块合并
self.ENABLE_QUERY_EXPAND = True # 启用查询扩展
# Reranker配置
self.ENABLE_RERANK = True
self.RERANK_MODEL = "bge-reranker-v2-m3"
self.RERANK_SCORE_THRESHOLD = 0.1 # Rerank分数阈值系统会根据问题类型自动调整检索权重:
| 问题类型 | 向量权重 | BM25权重 | 说明 |
|---|---|---|---|
| 时间/日期类 | 35% | 65% | 精确匹配时间表达 |
| 排名/统计类 | 35% | 65% | 需要精确数值匹配 |
| 标准号/版本号 | 40% | 60% | 精确匹配标准编号 |
| 概念性问题 | 70% | 30% | 语义理解更重要 |
| 默认 | 60% | 40% | 平衡策略 |
运行完成后,系统会生成多个输出文件:
result/
├── answers_20251201_150830.json # 完整答案(JSON格式)
├── qa_pairs_20251201_150830.csv # 问答对(CSV格式)
└── template_format.json # 提交格式(转换后)log/
├── rag_log_20251201_145203.jsonl # 原始检索日志
├── rag_log_readable_20251201_145203.txt # 可读格式日志
└── rag_summary_20251201_145203.json # 统计摘要答案JSON格式:
{
"items": [
{
"question": "问题内容",
"answer": "答案内容",
"question_type": "基础题",
"top_k": 60,
"token_count": 4164,
"char_count": 4552
}
],
"statistics": {
"基础题": 5,
"中级题": 5,
"高级题": 5
}
}| 组件 | 技术选型 | 说明 |
|---|---|---|
| Embedding | BAAI/bge-large-zh-v1.5 | 本地中文语义模型(1.3GB),支持离线加载 |
| Reranker | BAAI/bge-reranker-v2-m3 | 多语言重排序模型,支持离线加载 |
| LLM | DeepSeek-R1 | CoreGPU API,带自动重试机制 |
| 混合检索 | Vector + BM25 | 语义检索+关键词检索融合,动态权重调整 |
| 向量检索 | Cosine Similarity | NumPy高效实现 |
| BM25检索 | jieba分词 + BM25算法 | 中文关键词匹配 |
| PDF 解析 | PyPDF2 + Tesseract OCR + pymupdf | 支持文本层+OCR扫描版 |
| 文本清理 | 自定义规则 | IEEE标准文档优化 |
| 日志系统 | 自研RAG Logger | 详细记录检索过程 |
| Prompt管理 | 文件化模板 | 支持热更新 |
- 事故报告:11 份
- 技术报告:25+ 份
- 标准规范:60+ 份
- 安全规范(GB/T 20438、ISO 26262)
- CBTC 规范(IEEE 1474.1、CZJST)
- 互联互通规范(32 份)
- ERTMS/ETCS 标准
- 行业报告:6 份
document.json/document_backup_*.json:文档块(文本内容)vectors.json/vectors_backup_*.json:向量数据(embedding)- 当前使用版本:自动选择最新的备份文件(约 23,050 个文档块)
-
混合检索系统优化
- ✅ 动态权重调整:根据问题类型自动调整向量/BM25权重
- ✅ 排名类问题优化:提高BM25权重,自动扩展城市名称
- ✅ 时间类问题优化:添加多语言时间关键词
-
跨语言检索增强
- ✅ 中文术语自动翻译:牵引系统 → traction system M_VOLTAGE NID_CTRACTION
- ✅ 机构名称扩展:国际能源署 → International Energy Agency IEA
- ✅ 地区名称扩展:江苏省 → 南京 苏州 无锡 常州 徐州 南通
-
查询扩展优化
- ✅ SUBSET-026技术文档:自动添加变量名和英文术语
- ✅ 时间类问题:添加西班牙语/英语时间关键词
- ✅ 排名类问题:自动添加相关地区/城市名称
-
检索数量调整
- ✅ 基础题:40 → 60
- ✅ 中级题:40 → 60
- ✅ 高级题:40 → 50
-
Rerank优化
- ✅ 设置分数阈值(0.1),保证至少返回top-k个结果
- ✅ 优化阈值过滤逻辑,避免过度过滤
- OCR支持 - 自动识别扫描版PDF(Tesseract OCR + pymupdf)
- RAG日志系统 - 完整记录检索过程
- Prompt管理 - 模块化提示词模板
- IEEE标准优化 - 解决400错误问题
- 文本清理增强 - 移除版权符号、简化标准格式
- 模块化重构 - 清晰的代码结构
- 自动重试机制 - API调用失败自动处理
- CSV导出 - 问答对CSV格式导出
- 统计分析 - 详细的性能统计
- 格式转换工具 - 一键转换为比赛提交格式
- 混合检索V2 - Vector + BM25 融合检索,动态权重调节
- Rerank重排序 - BGE-Reranker-v2-m3 多语言重排序
- 离线模型加载 - Embedding和Reranker优先使用本地缓存
- LLM重试机制 - 网络错误自动重试,支持超时处理
- 渐进式召回 - 片段数量按递减重试
- 跨语言检索 - 中文查询自动扩展英文术语
- 动态权重调整 - 根据问题类型自动调整检索策略
- 查询扩展优化 - 针对不同问题类型的智能扩展
- 相邻块合并 - 保持上下文完整性
- 表格感知处理 - 自动识别和处理表格数据
- 代码行数:~4000+ 行
- 支持文档:100+ PDF文件
- 向量数据:22,953-23,050 个文档块(使用最新备份)
- 问答成功率:100%(15/15题)
- 平均召回片段:40-60 个/题
- ✅ 自动检测扫描版PDF并使用Tesseract OCR识别
- ✅ 优化IEEE等标准文档格式
- ✅ 智能文本清理(移除版权符号等)
- ✅ 向量检索(语义相似性)
- ✅ BM25检索(关键词匹配)
- ✅ Rerank重排序(精细排序)
- ✅ 动态权重调整(根据问题类型)
- ✅ 中文术语自动翻译
- ✅ 多语言文档支持
- ✅ 智能查询扩展
- ✅ 记录每次检索的top-k内容
- ✅ 记录token使用情况
- ✅ 生成可读格式和统计摘要
- ✅ 模块化Prompt管理
- ✅ 分级检索策略(基础/中级/高级)
- ✅ 自动重试机制
问题:某些 PDF 无法解析
解决:
- ✅ 已添加错误处理,会自动跳过问题文件
- ✅ 支持OCR识别扫描版PDF
- 查看日志确认跳过了哪些文件
问题:IEEE标准文档触发API限制
解决:
- ✅ 已优化文本清理,自动简化IEEE标准格式
- ✅ 移除版权符号和声明
- ✅ 自动重试机制(减少检索数量)
问题:全图片PDF提取不到内容
解决:
- ✅ 已集成Tesseract OCR自动识别
- 安装:
pip install pytesseract pdf2image - 系统依赖:
- macOS:
brew install poppler tesseract tesseract-lang - Ubuntu/Debian:
sudo apt-get install poppler-utils tesseract-ocr tesseract-ocr-chi-sim
- macOS:
解决:
- 减小
max_token_len参数 - 减小检索数量
k - 关闭其他应用程序
- OCR处理时内存占用较大,可临时禁用
解决:
- 向量数据库已保存,只需重新生成答案
- 或使用其他 LLM API
解决:
- ✅ 自动生成RAG日志(
log/目录) - 查看
rag_log_readable_*.txt了解检索过程 - 查看
rag_summary_*.json了解统计信息
问题:Python 多进程库(loky)的清理警告
解决:
- ✅ 这是无害的警告,不影响主要功能
- 可以安全忽略,不影响答题结果
- 文档处理速度:
- 普通PDF:约 0.5-2 秒/文件
- 扫描版PDF(OCR):约 2-5 秒/页
- 向量生成速度:约 8-10 块/秒
- 检索速度:< 1 秒(22,953 个向量)
- 答题速度:1.5-3 分钟/题(取决于 LLM API 响应速度)
- 内存占用:
- 基础运行:~2GB
- OCR识别时:~2.5-3GB
- 存储占用:
- 向量数据库:~200-300MB
- Tesseract OCR(系统级安装,不占用项目空间)
.env文件包含敏感信息,不要提交到 Git- API Key 应妥善保管
- 向量数据库文件较大,建议本地存储
kasik/main_runner.py- 主程序入口kasik/qa_engine.py- 问答引擎kasik/hybrid_retriever.py- 混合检索器kasik/query_rewriter.py- 查询扩展器kasik/rag_logger.py- 日志系统utils/utils.py- 工具函数(含OCR)prompts/prompt_loader.py- Prompt加载器
- ✅ 混合检索系统优化(动态权重调整)
- ✅ 跨语言检索增强(中文术语自动翻译)
- ✅ 查询扩展优化(针对不同问题类型)
- ✅ 检索数量调整(提高召回率)
- ✅ 混合检索系统(Vector + BM25)
- ✅ Rerank重排序
- ✅ 相邻块合并
- ✅ 表格感知处理
- ✅ OCR支持
- ✅ RAG日志系统
- ✅ Prompt管理
- ✅ 模块化重构
本项目仅用于比赛目的。
如有问题,请联系项目维护者。
最后更新:2025-12-01
版本:v2.2
