Skip to content

xieeddebug/kasike

Repository files navigation

卡斯柯比赛 - 铁路轨道交通 RAG 问答系统

📋 项目简介

这是一个基于 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)的清理警告,不影响主要功能,可以忽略。


🔧 核心特性

1. 混合检索系统(V2优化版)

技术栈

  • 向量检索:BAAI/bge-large-zh-v1.5(中文语义模型)
  • BM25检索:基于jieba分词的关键词匹配
  • Rerank重排序:BAAI/bge-reranker-v2-m3(多语言重排序)

动态权重调整

  • 时间/日期类问题:65% BM25权重(精确匹配更重要)
  • 排名/统计类问题:65% BM25权重(需要精确数值)
  • 标准号/版本号查询:60% BM25权重
  • 概念性问题:70% 向量权重(语义理解更重要)
  • 默认:60% 向量 + 40% BM25

2. 跨语言检索扩展

自动术语翻译

  • 中文术语自动扩展为英文翻译
  • 例如:"牵引系统" → traction system M_VOLTAGE NID_CTRACTION
  • 支持机构名称、技术术语、地区名称等

查询扩展策略

  • 时间类问题:添加西班牙语/英语时间关键词
  • 排名类问题:自动添加相关城市/地区名称
  • SUBSET-026技术文档:添加变量名和英文术语

3. 智能查询优化

关键词提取

  • 技术术语自动加权(如 IEEE、CBTC、ERTMS)
  • 标准号、版本号、变量名高优先级匹配

相邻块合并

  • 自动合并相邻的文档块,保持上下文完整性

表格感知处理

  • 自动识别数值类查询
  • 提取表格数据并结构化处理

📦 完整安装步骤

1. 环境准备

# 克隆项目
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

2. 配置 API

创建 .env 文件(项目根目录):

# LLM 模型配置
CLOUD_MODEL=DeepSeek-R1
CLOUD_API_KEY=你的API_KEY
CLOUD_BASE_URL=https://ai.api.coregpu.cn/v1

3. 模型缓存说明

本项目默认启用离线模式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)

4. 准备数据

确保 AI_database/ 目录包含所有 PDF 文档:

# 解压数据库(如果是压缩包)
unzip AI_database.zip

# 验证数据结构
ls AI_database/
# 应包含:事故报告/、技术报告/、标准规范/、行业报告/

5. 运行答题系统

# 激活虚拟环境
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/)

result/
├── answers_20251201_150830.json      # 完整答案(JSON格式)
├── qa_pairs_20251201_150830.csv       # 问答对(CSV格式)
└── template_format.json               # 提交格式(转换后)

RAG日志(log/)

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管理 文件化模板 支持热更新

📁 数据说明

输入数据(AI_database/)

  • 事故报告:11 份
  • 技术报告:25+ 份
  • 标准规范:60+ 份
    • 安全规范(GB/T 20438、ISO 26262)
    • CBTC 规范(IEEE 1474.1、CZJST)
    • 互联互通规范(32 份)
    • ERTMS/ETCS 标准
  • 行业报告:6 份

输出数据(storage/)

  • document.json / document_backup_*.json:文档块(文本内容)
  • vectors.json / vectors_backup_*.json:向量数据(embedding)
  • 当前使用版本:自动选择最新的备份文件(约 23,050 个文档块)

🛠️ 最新优化(2025-11-28)

v2.2 版本更新

  1. 混合检索系统优化

    • ✅ 动态权重调整:根据问题类型自动调整向量/BM25权重
    • ✅ 排名类问题优化:提高BM25权重,自动扩展城市名称
    • ✅ 时间类问题优化:添加多语言时间关键词
  2. 跨语言检索增强

    • ✅ 中文术语自动翻译:牵引系统 → traction system M_VOLTAGE NID_CTRACTION
    • ✅ 机构名称扩展:国际能源署 → International Energy Agency IEA
    • ✅ 地区名称扩展:江苏省 → 南京 苏州 无锡 常州 徐州 南通
  3. 查询扩展优化

    • ✅ SUBSET-026技术文档:自动添加变量名和英文术语
    • ✅ 时间类问题:添加西班牙语/英语时间关键词
    • ✅ 排名类问题:自动添加相关地区/城市名称
  4. 检索数量调整

    • ✅ 基础题:40 → 60
    • ✅ 中级题:40 → 60
    • ✅ 高级题:40 → 50
  5. 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 个/题

🌟 特色功能

1. 智能文档处理

  • ✅ 自动检测扫描版PDF并使用Tesseract OCR识别
  • ✅ 优化IEEE等标准文档格式
  • ✅ 智能文本清理(移除版权符号等)

2. 混合检索系统

  • ✅ 向量检索(语义相似性)
  • ✅ BM25检索(关键词匹配)
  • ✅ Rerank重排序(精细排序)
  • ✅ 动态权重调整(根据问题类型)

3. 跨语言检索

  • ✅ 中文术语自动翻译
  • ✅ 多语言文档支持
  • ✅ 智能查询扩展

4. 完整日志系统

  • ✅ 记录每次检索的top-k内容
  • ✅ 记录token使用情况
  • ✅ 生成可读格式和统计摘要

5. 灵活配置

  • ✅ 模块化Prompt管理
  • ✅ 分级检索策略(基础/中级/高级)
  • ✅ 自动重试机制

🛠️ 常见问题

Q1: 向量数据库构建失败

问题:某些 PDF 无法解析

解决

  • ✅ 已添加错误处理,会自动跳过问题文件
  • ✅ 支持OCR识别扫描版PDF
  • 查看日志确认跳过了哪些文件

Q2: LLM 调用失败(Error 400)

问题:IEEE标准文档触发API限制

解决

  • ✅ 已优化文本清理,自动简化IEEE标准格式
  • ✅ 移除版权符号和声明
  • ✅ 自动重试机制(减少检索数量)

Q3: 扫描版PDF无法识别

问题:全图片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

Q4: 内存不足

解决

  • 减小 max_token_len 参数
  • 减小检索数量 k
  • 关闭其他应用程序
  • OCR处理时内存占用较大,可临时禁用

Q5: API Key 额度不足

解决

  • 向量数据库已保存,只需重新生成答案
  • 或使用其他 LLM API

Q6: 如何查看检索细节

解决

  • ✅ 自动生成RAG日志(log/ 目录)
  • 查看 rag_log_readable_*.txt 了解检索过程
  • 查看 rag_summary_*.json 了解统计信息

Q7: 终端出现 KeyError: '/loky-xxx' 错误

问题: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加载器

📝 版本历史

v2.2 (2025-11-28)

  • ✅ 混合检索系统优化(动态权重调整)
  • ✅ 跨语言检索增强(中文术语自动翻译)
  • ✅ 查询扩展优化(针对不同问题类型)
  • ✅ 检索数量调整(提高召回率)

v2.1 (2025-11-26)

  • ✅ 混合检索系统(Vector + BM25)
  • ✅ Rerank重排序
  • ✅ 相邻块合并
  • ✅ 表格感知处理

v2.0 (2025-11-20)

  • ✅ OCR支持
  • ✅ RAG日志系统
  • ✅ Prompt管理
  • ✅ 模块化重构

📄 许可证

本项目仅用于比赛目的。


👥 联系方式

如有问题,请联系项目维护者。


最后更新:2025-12-01
版本:v2.2

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors