基于 RAG + GRPO 的概率论学习辅助系统 | English
本项目是一个针对概率论、测度论和随机过程的智能问答系统,结合了检索增强生成(RAG)和分组相对策略优化(GRPO)技术,实现了高质量的数学问答能力。
- 🎯 渐进式训练策略:Base Model → SFT → SVD-LoRA → GRPO,系统性提升模型性能
- 📊 显著性能提升:相比基础模型实现 55.5% 的性能提升
- 🔍 RAG 增强检索:基于 ChromaDB 的向量数据库,提供准确的知识检索
- 💡 SVD 初始化优化:相比随机初始化LoRA提升 19.5% 的测试性能
- 🎨 友好的 Web 界面:支持模型对比、实时问答和性能可视化
| 模型 | 平均奖励 | 相对提升 |
|---|---|---|
| 基础模型 | 0.231 | - |
| SFT Random-init | 0.253 | +9.5% |
| SFT SVD-init | 0.302 | +30.8% |
| GRPO (最终) | 0.359 | +55.5% ⭐ |
┌─────────────────────────────────────────────────────────────┐
│ Gradio Web Interface │
│ (问答界面 | 模型对比 | 性能统计 | 系统信息) │
└────────────────────┬────────────────────────────────────────┘
│
┌────────────┴──────────────┐
│ │
┌────▼─────┐ ┌─────▼────┐
│ GRPO │ │ RAG │
│ Model │ │ Engine │
└────┬─────┘ └─────┬────┘
│ │
│ ┌──────▼──────┐
│ │ ChromaDB │
│ │ (BGE embed) │
│ └─────────────┘
│
┌────▼─────────────────────────────┐
│ Qwen2.5-Math-7B-Instruct (4-bit) │
│ + LoRA (rank 16) │
└──────────────────────────────────┘
1. [SFT - 监督微调]
├── Random-init LoRA → 训练损失: 0.7743
└── SVD-init LoRA → 训练损失: 0.7718 (↓0.32%)
测试性能: +19.5% vs Random
2. [GRPO - 强化学习对齐]
├── 训练: 2 epochs, 162 steps, 3.5 hours
├── 奖励模型: 4维启发式 (长度/公式/概念/结构)
└── 最终性能: 0.359 reward (↑55.5% vs Base)
3. [RAG - 检索增强]
├── 向量化: 8个概率论文档章节
├── 检索: Top-3相关片段
└── 生成: 基于检索上下文的准确回答
- Python: 3.8+
- GPU: CUDA兼容GPU,至少 8GB 显存
- 内存: 至少 16GB RAM
- 存储: 至少 20GB 可用空间
# 克隆仓库
git clone https://github.com/Louisym/EE510_alignment_project.git
cd EE510_alignment_project
# 创建虚拟环境(推荐)
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt# 方法1:使用启动脚本
./start_app.sh
# 方法2:直接运行
python app.py访问 http://127.0.0.1:7860 打开界面。
首次使用:点击 "🚀 Load System" 按钮加载模型(需要1-2分钟)。
.
├── app.py # Gradio Web 应用主文件
├── app_cn.py # 中文版界面(备份)
├── app_en.py # 英文版界面
├── requirements.txt # Python 依赖
├── start_app.sh # 启动脚本
│
├── src/ # 核心源代码
│ ├── vector_database.py # ChromaDB 向量数据库
│ ├── rag_pipeline.py # RAG 检索管道
│ ├── document_processor.py # 文档处理器
│ ├── model_loader.py # 模型加载器
│ └── evaluation.py # 评估工具
│
├── training/ # 训练框架
│ ├── sft/ # 监督微调 (SFT)
│ │ ├── train_sft.py # SFT 训练脚本
│ │ ├── trainer.py # SFT 训练器
│ │ ├── data_loader.py # 数据加载器
│ │ └── config.py # 配置文件
│ │
│ └── grpo/ # GRPO 强化学习
│ ├── train_grpo.py # GRPO 训练脚本
│ ├── trainer.py # GRPO 训练器
│ ├── reward_model.py # 奖励模型
│ ├── data_loader.py # 数据加载器
│ └── config.py # 配置文件
│
├── experiments/ # 实验代码
│ └── svd_lora/ # SVD-LoRA 对比实验
│ ├── train_lora_svd_vs_rand.py # 对比训练
│ ├── extract_svd_from_lora.py # SVD 提取
│ └── training_results/ # 结果
│
├── data/ # 数据目录
│ ├── chroma_db/ # 向量数据库
│ ├── docs/ # 原始文档
│ └── training_data/ # 训练数据 (81 QA对)
│
└── outputs/ # 训练输出
└── grpo/ # GRPO 训练结果
├── final_model/ # 最终模型
├── plots/ # 训练曲线
└── metrics/ # 性能指标
# 使用随机初始化 LoRA
python training/sft/train_sft.py \
--config default \
--train-data data/training_data/train.json \
--output-dir outputs/sft/random \
--epochs 3python experiments/svd_lora/train_lora_svd_vs_rand.py \
--base-model Qwen/Qwen2.5-Math-7B-Instruct \
--train-data data/training_data/train.json \
--lora-rank 16 \
--epochs 3python training/grpo/train_grpo.py \
--config from_sft \
--sft-model outputs/sft/final_model \
--train-data data/training_data/train.json \
--output-dir outputs/grpo \
--epochs 2- 向量数据库: ChromaDB (持久化存储)
- 嵌入模型: BAAI/bge-base-en-v1.5
- 文档分块: 500字符/块,50字符重叠
- 检索策略: Top-3 余弦相似度
原理:
- 训练 teacher LoRA → 提取权重矩阵 ΔW
- SVD分解:ΔW ≈ B·A
- 使用 B、A 初始化 student LoRA
优势:相比随机初始化提升 19.5%
4维启发式评分:
| 维度 | 权重 | 说明 |
|---|---|---|
| 长度适当性 | 20% | 回答长度与参考答案比例 |
| 公式存在性 | 30% | 数学符号和公式使用 |
| 概念覆盖度 | 30% | 关键术语覆盖 |
| 结构完整性 | 20% | 定义/公式/示例结构 |
- 基础模型: Qwen/Qwen2.5-Math-7B-Instruct
- 量化: 4-bit NF4 (BitsAndBytes)
- LoRA Rank: 16 (trainable params: ~1.2%)
- 显存占用: ~5GB
| 初始化方法 | 训练损失 | 测试性能 | 提升 |
|---|---|---|---|
| Random | 0.7743 | 0.253 | - |
| SVD | 0.7718 | 0.302 | +19.5% |
关键发现:训练损失相近(0.32%),但测试性能差异显著(19.5%)
| Epoch | Steps | Mean Reward | Max Reward |
|---|---|---|---|
| 1 | 81 | 0.487 | 0.679 |
| 2 | 162 | 0.480 | 0.682 |
| Best | 135 | 0.599 | - |
Loss 方差分析:
- Loss 方差是 Reward 方差的 592倍
- 这是正常现象(group-relative normalization)
- 应关注 reward 指标而非 loss
大型模型文件(*.safetensors, *.bin, *.pth)因GitHub限制未包含在仓库中。
首次运行:
- 自动从 HuggingFace 下载基础模型
- 或按训练指南训练自己的模型
# 加载失败
ls outputs/grpo/final_model/ # 检查模型
nvidia-smi # 检查GPU
# RAG无结果
# 重建向量数据库
python -c "from src.vector_database import VectorDatabase; db = VectorDatabase(); db.initialize()"- LoRA: Hu et al., "LoRA: Low-Rank Adaptation of Large Language Models", ICLR 2022
- GRPO: Shao et al., "DeepSeekMath: Pushing the Limits of Mathematical Reasoning", arXiv 2024
- RAG: Lewis et al., "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks", NeurIPS 2020
本项目仅用于学术研究和教育目的。
- 课程: EE510 Probability Theory
- 学期: Spring 2025
- 技术栈: PyTorch, Transformers, PEFT, Gradio, ChromaDB
🎓 Generated with Claude Code
如有问题或建议,欢迎提交 Issue