当前状态 → 已完成工作 → 后续计划
| 维度 | 状态 | 备注 |
|---|---|---|
| Spider SFT | ✅ 完成 | EX 71.8%, EM 67.0% |
| Spider SC | ✅ 完成 | SC-12: EX 74.2%, EM 69.0% |
| Spider DPO | ✅ 完成 | Greedy EX 74.0%, SC-12: EX 75.0% |
| Error Analysis | ✅ 完成 | DPO 错误类型分类、oracle 归因、pairwise attribution |
| Candidate Oracle | ✅ 完成 | SFT+DPO 候选池上界 81.43%,已修正评估口径 |
| Candidate Diagnostics | ✅ 完成 | 五类分桶、correct-minority、winner-vs-correct 细化归因 |
| SFT-vs-DPO Router | ⏳ 下一步 | 上限 78.24%,尚未训练/验证实际 selector |
| Candidate Verifier/Reranker | ⏳ 后续 | 上限 81.43%,需先验证 router 和 reward 质量 |
| GRPO | ⏸️ 暂缓 | 等 verifier/reward 可信后再做 readiness analysis |
| 跨数据集迁移 | 暂缓 | 当前只做 Spider;新数据集需重新走完整 SFT → SC → DPO → verifier 诊断 |
| 阶段 | Spider Dev (EX) | Exact Match |
|---|---|---|
| Zero-shot (baseline) | 43.9% | 35.7% |
| SFT (Greedy) | 71.8% | 67.0% |
| SFT + SC-12 | 74.2% | 69.0% |
| DPO (Greedy) | 74.0% | 68.1% |
| DPO + SC-12 | 75.0% | 68.9% |
早期尝试直接用 Spider SFT 模型迁移到更复杂数据集时效果不理想。分析原因:
| 问题 | 说明 |
|---|---|
| Schema 差异大 | 不同数据集的 database/schema 规模、列名风格和外键结构差异明显 |
| 领域偏移 | 学术场景训练数据难以覆盖金融、医疗等专业领域 |
| SQL 复杂度 | 更复杂数据集的查询更长、嵌套更深,Spider 训练数据覆盖不足 |
| 评估标准不同 | 不同 benchmark 的执行标准和数据分布存在差异 |
教训:NL2SQL 的泛化极度依赖训练数据覆盖。Spider pipeline 验证的是 post-training 链路设计合理性,而不是训练出一个直接跨 benchmark 泛化的通用模型。迁移到新数据集时,应在目标数据集上重新走完整 SFT → SC → DPO 流程。
首轮 DPO 训练几乎无提升(71.95% vs 71.76%),事后排查发现:
- sampled-correct chosen 未充分门控,存在偶然正确风险
- 103 对 chosen/rejected 完全一致
教训:训练指标不反映数据质量,数据必须直接 inspect。
为分析提升空间,计算了多 policy 候选池的 oracle(每道题都能从候选池中选到正确 SQL 的理论上界):
| 候选池 / Selector | Spider Dev (EX) | 说明 |
|---|---|---|
| DPO + SC-12 | 75.0% | 当前实际选择结果 |
| SFT + DPO Candidate Oracle | 81.43% | 多 policy 候选池分析上界 |
Oracle 结果说明正确 SQL 已经出现在候选池中,瓶颈正从「候选生成」转向「候选选择」。这是后续最有希望的方向。
Spider 训练数据 (train_spider.json)
↓
SFT 训练 (LoRA)
↓
模型采样候选 SQL (多温度, T=0.8~1.6)
↓
执行对比 + 错误分类 → 构造 DPO pairs
↓
DPO 训练
↓
评测 (Greedy + SC-N)
↓
错误分析 + Oracle 分析
SFT 链路:
- 数据预处理(Spider → Alpaca 格式)
- Schema 序列化与 prompt 构建
- LoRA 微调训练配置
- 模型合并与推理评测
Self-Consistency:
- 批量采样 N 个候选 + 执行投票
- greedy / SC-N 评测脚本
- N=5/8/12 消融实验
DPO 链路:
- 候选采样(多温度、多轮次)
- SQL 质量过滤(防噪声污染)
- 执行对比 + 错误分类(13 类本地错误)
- local hard-negative 策略(gold chosen 为主,门控 sampled-correct 为辅)
- 变异负样本(规则生成)
- 错误类型平衡
- LLaMA-Factory DPO 训练配置
- 整个 pipeline 跑通并记录结果
实验记录:
- 实验结果表格(README)
- SFT / DPO 训练文档
- Candidate Oracle 分析
- Oracle 归因分析
Candidate Oracle 81.43% vs 当前 75.0%,有约 6.5% 的 gap 来自选择环节。
现阶段不直接上复杂 rule verifier 或 GRPO。优先验证一个更简单的问题:
在不更新 policy 的情况下,选择器最多能从已有候选里追回多少?
已拆出的上限:
- SFT-vs-DPO router oracle:只在 SFT SC-12 和 DPO SC-12 两个最终输出之间选,上限约 78.24%
- Full candidate oracle:在 SFT+DPO 全候选池里选,上限 81.43%
执行顺序:
- SFT-vs-DPO router baseline:先做二选一 selector,判断什么时候信 SFT、什么时候信 DPO。
- Candidate-level reranker baseline:如果 router 有效,再扩展到全候选池 rerank。
- Learned verifier:优先用轻量 feature-based model / pairwise preference model,而不是手写复杂 SQL 规则系统。
- Verifier distillation 数据准备:将 verifier 选出的高质量 SQL 作为后续 SFT/DPO/蒸馏候选。
当前关键诊断:
- DPO 错但 oracle 可修:71 题
- 其中
correct_minority:50 题,说明主要问题不是 tie-break,而是正确 SQL 被错误多数派压过 - Pairwise 归因显示主要差异集中在 projection、filter/value grounding、join key/path、grouping、table selection
GRPO 应建立在 verifier/reward 可信之后,而不是作为下一步默认动作。
原因:
- SQL execution reward 虽然可验证,但仍有偶然正确、ORDER BY 口径、literal 大小写、空结果假阳性等噪声
- 如果 reward/verifier 不稳,GRPO 会把 policy 往错误方向推
- GRPO 需要 group 内 reward 有区分度;全 0 或全 1 的 group 学习信号都弱
进入 GRPO 前需要补的统计:
- 每题 group reward 分布:all-zero / mixed / all-one
- 正确候选数量分布:
num_correct_candidates = 0 / 1 / 2 / ... - execution-correct 中疑似偶然正确比例
- verifier gate 后的正样本保留率
可行后再考虑:
current policy samples
→ execution reward
→ verifier / quality gate
→ GRPO update
on-policy / off-policy 混合应放在 verifier 和 GRPO 信号明确之后讨论。
可选形态:
- Off-policy self-training:用历史候选池中的 oracle-correct SQL 做 SFT / DPO
- Iterative verifier-guided self-training:当前 policy 采样 → verifier 过滤 → SFT/DPO → 重新采样
- GRPO + SFT anchor:on-policy RL loss + gold / selected SQL 的 supervised anchor
- Replay buffer:混合当前 on-policy samples 和历史高 reward samples
目标不是长期依赖重 reranker,而是:
verifier 发现好轨迹
→ distill / DPO / RL 回灌 policy
→ 提升单次生成质量
将 Spider pipeline 迁移到新数据集时,需从头训练完整流程:
目标数据集
→ SFT
→ SC 消融
→ DPO
→ Oracle / verifier 诊断
→ 评估
预期在迁移过程中会发现 pipeline 的不足,反过来改进设计。
alignsql/
├── alignsql/ # Python 包 (pip install -e .)
│ ├── data/ # 数据加载/处理
│ │ ├── preprocessing.py # 难度分类、Prompt 构建
│ │ ├── schema.py # Schema 序列化
│ │ └── spider.py # Spider 数据加载器
│ ├── models/
│ │ └── inference.py # Self-Consistency 采样 & 投票
│ ├── eval/
│ │ └── metrics.py
│ └── utils/
│ ├── db.py # SQLite 执行工具
│ └── io.py # JSON/JSONL 读写
├── vendor/ # 第三方代码 (Spider 官方评测)
├── configs/
│ └── spider/
│ ├── sft.yaml
│ └── merge_sft.yaml
├── scripts/
│ ├── evaluate_vllm.py # 推理评测 (greedy / SC)
│ ├── prepare_sft.py # SFT 数据准备
│ ├── prepare_dpo.py # DPO 数据准备
│ ├── analyze_difficulty.py
│ ├── run_zeroshot.sh
│ └── run_eval.sh # 评测入口
├── docs/
├── outputs/ # 实验结果
├── dataset/ # 原始数据
└── data_processed/ # 预处理产物
| 方向 | 预期收益 | 不确定性 |
|---|---|---|
| SFT-vs-DPO router | 最高到 78.24% EX | 需要实际 selector 证明可达 |
| Candidate-level verifier/reranker | 最高到 81.43% EX | minority-correct 识别难度较高 |
| GRPO readiness | 判断是否值得上 RL | reward 稀疏与 label 噪声风险 |
| On/off-policy 混合 | 稳定后续训练 | 需先有可靠 verifier/reward |
| 新数据集全流程 | 验证 pipeline 可迁移性 | 取决于数据集规模和难度 |