股票投资实战助手 基于 Qwen2.5-3B 的两阶段对齐微调项目:SFT 监督微调 → DPO 偏好对齐。
本项目聚焦于在小规模模型(Qwen2.5-3B)上进行对齐优化,通过 SFT(监督微调)与 DPO(偏好对齐)提升模型在 A 股投资场景中的实用性。 本项目目标并非训练通用大模型,而是针对特定金融任务,优化模型的表达质量、信息密度和实用性。
| 指标 | SFT only | SFT + DPO | 变化 |
|---|---|---|---|
| GPT-4o 偏好胜率 | 26% | 74% | +48pp |
| 含具体数字比例 | 100% | 100% | — |
| 含套话比例 | 14% | 4% | −10pp |
| 回声开头比例 | 40% | 30% | −10pp |
| 平均回答长度 | 134.7 字 | 136.9 字 | +2.2 字 |
评估方法:50 题独立测试集 × GPT-4o 裁判 × A/B 位置随机交换
原始金融数据 (3939条)
│
▼
[数据清洗 + GPT 扩充]
│
▼
SFT 数据集 (5000条 instruction/output)
│
▼
┌─────────────────────────────────────┐
│ Stage 1: SFT 监督微调 │
│ Qwen2.5-3B + LoRA (rank=16) │
│ lr=1e-4 / 3 epochs / FP16 │
│ 消融实验 → 选最优配置 │
└─────────────────────────────────────┘
│
▼
[SFT adapter] ──merge_and_unload()──▶ merged base
│
▼
DPO 偏好数据集 (1834组 chosen/rejected)
│
▼
┌─────────────────────────────────────┐
│ Stage 2: DPO 偏好对齐 │
│ β=0.1 / lr=1e-5 / 1 epoch │
│ sigmoid loss / 新 LoRA on merged │
│ 消融实验(6 个维度) │
└─────────────────────────────────────┘
│
▼
[DPO adapter]
│
▼
评估:50题测试集 × GPT-4o裁判 → 胜率 74%
FinPilot/
├── data/
│ ├── sample_sft.json # SFT 数据样例
│ └── sample_dpo.json # DPO 偏好对样例
├── scripts/
│ ├── data/
│ │ ├── generate_finance_sft.py # 生成 SFT 数据
│ │ ├── generate_dpo_data.py # 构造偏好对
│ │ └── merge_finance_sft.py # 合并数据
│ ├── train/
│ │ ├── train_final.py # SFT 最终训练
│ │ ├── train_dpo.py # DPO 训练
│ │ └── run_ablation.py # SFT 消融实验
│ └── eval/
│ ├── eval_dpo.py # 生成对比回答
│ ├── generate_answers.py # 独立生成回答文件
│ └── local_judge.py # 4o裁判评估
├── demo/
│ └── demo.md # 演示截图
├── results/
│ ├── dpo_results.json # DPO 11 次消融完整指标
│ ├── ablation_results.json # SFT 6 组消融结果
│ ├── eval_results.json # GPT-4o 评估 50 个原始结果
│ ├── eval_report.md # 评估报告
│ ├── dpo_summary.md # DPO 消融汇总表
│ └── ablation_report.md # SFT 消融报告
├── README.md
├── requirements.txt
└── .gitignore
本项目未显式训练 reward model,而是通过构造 chosen/rejected 偏好对,引入隐式 reward 信号用于 DPO 训练。 偏好数据的构造基于以下规则:
- 信息密度优先:优先选择包含具体金融指标(如市盈率区间、成交量特征等)的回答
- 减少套话表达:降低“这是一个很好的问题”等模板化句式
- 直接回答问题:避免重复问题(echo),强调直接给出结论与分析
- 金融相关性:强调 A 股市场特有逻辑,而非通用解释
这些规则共同构成隐式 reward,使模型学习更偏向“实用投资回答”,而非泛化语言生成。
相比传统 RLHF,DPO 直接基于偏好对进行优化,具有以下优势:
- 训练稳定性更高:避免 reward model 带来的不稳定性
- 工程复杂度更低:无需额外训练 reward 模型
- 适合小模型场景:在 3B 参数规模下,DPO 更容易收敛
因此在本项目的数据规模和模型规模以及算力限制下,DPO 是更合适的对齐方法。
本项目使用 GPT-4o 作为裁判,在 50 题独立测试集上进行 A/B 对比评估:
- 随机交换答案顺序用于消除位置偏差
- 仅比较相对偏好而非绝对正确性 该方法在当前大模型对齐研究中被广泛用作人工评估的替代方案,用于衡量模型输出质量提升。
| 消融维度 | 最优配置 | 结论 |
|---|---|---|
| 量化精度 | FP16 | 4-bit 量化在 32GB 显存下无必要,FP16 训练更稳 |
| LoRA rank | rank=16 | rank=32 无显著提升,rank=8 略有下降 |
| target_modules | 全部线性层 | 仅 q/v 效果弱,全部线性层更充分 |
| 学习率 | 1e-4 | 5e-5 收敛慢,2e-4 不稳定 |
| epochs | 3 | 2 epochs 欠拟合,4 epochs 过拟合 |
| 数据量 | 5000 条 | 3000 条指标明显低于 5000 条 |
| 消融维度 | 最优配置 | 结论 |
|---|---|---|
| β 参数 | 0.1 | β=0.5 过度约束,β=0.05 偏好漂移 |
| 学习率 | 1e-5 | 5e-6 学习不足,5e-5 发散 |
| epoch 数 | 1 | 2+ epochs 出现过拟合 |
| 长度差消融 | 等长数据≈原始 | DPO 学的是内容质量而非长度 |
| loss 类型 | sigmoid | IPO loss 效果相当但不稳定 |
| 噪声鲁棒性 | 10% 噪声可接受 | 30% 噪声性能明显下降 |
LoRA adapter 约 120MB,未上传至本仓库。训练脚本可复现完整流程。