本项目对应浙江大学 REAL Lab 招生考核题目二,目标是在较小规模模型上实现可控的推理投入(effort control)。项目将 <LOW>、<MEDIUM>、<HIGH> 作为显式控制信号,通过教师模型生成同题三档配对数据,并使用 LoRA SFT 微调 Qwen3.5-4B,使模型在同一问题上能够按 effort token 调整可见推理长度。
需要注意:本项目不直接控制模型内部不可观测计算量,而是将 <reasoning>...</reasoning> 中的 token 数作为可观测 effort proxy。核心判断标准是:同一验证问题在 LOW / MEDIUM / HIGH 三档下形成有序推理长度梯度,同时保持较高答案准确率。
REAL_Effort_Control/
├── README.md # 中文项目说明
├── PROJECT_DESIGN_REPORT.md # 最终设计说明文档
├── figures/
│ └── effort_control_method.png # 方法结构图
├── scripts/
│ ├── generate_teacher_effort_data.py # 调用教师模型生成三档候选数据
│ ├── prepare_main_experiment_data.py # 构造主实验 train/eval 数据
│ ├── build_no_effort_ablation_data.py # 构造去 effort token 消融数据
│ ├── build_general_ability_eval.py # 构造通用能力 OOD 评估集
│ └── evaluate_effort_control.py # base / LoRA / 消融 / 泛化统一评估脚本
├── configs/
│ ├── credentials/ # API 配置;真实密钥文件已被 gitignore 忽略
│ ├── data_generation/ # 教师数据生成配置
│ ├── data_prep/ # 数据切分与消融/泛化数据构造配置
│ ├── training/ # LoRA 训练配置
│ ├── evaluation/ # 各类评估配置
│ └── llamafactory/ # LLaMA-Factory 数据集注册配置
├── data/
│ ├── teacher_candidates_5k.jsonl # 教师模型原始候选结果
│ ├── effort_teacher_sft_5k_all_accepted.json
│ ├── effort_teacher_sft_5k_paired.json # 同题三档配对后的完整 SFT 数据
│ ├── effort_teacher_5k_train.json # 主实验训练集
│ ├── effort_teacher_5k_eval.jsonl # 主实验验证题目
│ ├── ablation_no_effort_5k_train.json # 去 effort token 消融训练集
│ └── general_ability_eval.jsonl # OOD 通用能力评估集
├── outputs/
│ ├── effort_5k_eval/ # 主实验 base / LoRA 评估结果
│ ├── ablation_no_effort_5k_eval/ # 去 effort token 消融结果
│ └── general_ability_eval/ # 通用能力泛化评估结果
└── LLaMA-Factory/ # LoRA SFT 训练框架
推荐使用 environment.yml 创建环境:
cd /root/REAL_lab/REAL_Effort_Control
conda env create -f environment.yml如果服务器无法直接使用 conda activate,也可以直接调用环境中的 Python:
/root/miniconda3/envs/effort/bin/python默认学生模型路径:
/root/autodl-tmp/models/Qwen3.5-4B
教师模型使用百炼平台 API,配置文件为:
configs/credentials/bailian_teacher_config.json
该文件包含真实 API Key,已被 .gitignore 忽略。仓库中只应提交示例文件:
configs/credentials/bailian_teacher_config.example.json
主实验数据来自 GSM8K 与 ARC-Challenge。流程如下:
- 对每个原始问题分别请求教师模型生成
<LOW>、<MEDIUM>、<HIGH>三档回答; - 要求教师输出结构化字段,包括 reasoning、answer、答案类型等;
- 对候选结果进行过滤:API 成功、JSON 可解析、答案正确、推理长度满足预算要求;
- 只保留同一题三档均 accepted 且满足
LOW < MEDIUM < HIGH的样本; - 将保留样本转换为 Alpaca 风格 SFT 数据,用于 LoRA 微调。
生成教师数据:
cd /root/REAL_lab/REAL_Effort_Control
/root/miniconda3/envs/effort/bin/python scripts/generate_teacher_effort_data.py --run-config configs/data_generation/teacher_generation_5k.yaml切分主实验训练集和验证集:
cd /root/REAL_lab/REAL_Effort_Control
/root/miniconda3/envs/effort/bin/python scripts/prepare_main_experiment_data.py --run-config configs/data_prep/main_split_5k.yaml构造去 effort token 消融数据:
cd /root/REAL_lab/REAL_Effort_Control
/root/miniconda3/envs/effort/bin/python scripts/build_no_effort_ablation_data.py --run-config configs/data_prep/no_effort_ablation_5k.yaml构造 OOD 通用能力评估集:
cd /root/REAL_lab/REAL_Effort_Control
/root/miniconda3/envs/effort/bin/python scripts/build_general_ability_eval.py --run-config configs/data_prep/general_ability_eval.yaml训练前需要确保 LLaMA-Factory 能读取本项目的数据集注册信息,并且训练数据已复制到 LLaMA-Factory/data/effort_control/。当前项目已经整理好主实验和消融实验的数据注册。
主实验 LoRA 训练:
cd /root/REAL_lab/REAL_Effort_Control/LLaMA-Factory
/root/miniconda3/envs/effort/bin/llamafactory-cli train ../configs/training/qwen_effort_teacher_5k_lora_sft.yaml去 effort token 消融训练:
cd /root/REAL_lab/REAL_Effort_Control/LLaMA-Factory
/root/miniconda3/envs/effort/bin/llamafactory-cli train ../configs/training/qwen_no_effort_ablation_5k_lora_sft.yaml训练后的主要 LoRA checkpoint:
LLaMA-Factory/saves/qwen3_5-4b/lora/effort_teacher_5k
LLaMA-Factory/saves/qwen3_5-4b/lora/ablation_no_effort_5k
主实验评估:
cd /root/REAL_lab/REAL_Effort_Control
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/base_eval.yaml
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/lora_eval.yaml
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/compare_base_lora.yaml去 effort token 消融评估:
cd /root/REAL_lab/REAL_Effort_Control
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/no_effort_ablation_lora_eval.yaml
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/compare_full_lora_no_effort_ablation.yaml通用能力泛化评估:
cd /root/REAL_lab/REAL_Effort_Control
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/general_base_eval.yaml
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/general_lora_eval.yaml
/root/miniconda3/envs/effort/bin/python scripts/evaluate_effort_control.py --run-config configs/evaluation/compare_general_base_lora.yaml主实验结果:
| Model | Overall Acc. | Token Monotonic Rate | LOW Reasoning | MEDIUM Reasoning | HIGH Reasoning |
|---|---|---|---|---|---|
| Base Qwen3.5-4B | 89.01% | 79.79% | 146.0 | 226.7 | 545.6 |
| LoRA Effort Model | 94.50% | 88.30% | 51.8 | 93.9 | 171.2 |
去 effort token 消融:
| Model | Overall Acc. | Token Monotonic Rate | LOW Reasoning | MEDIUM Reasoning | HIGH Reasoning |
|---|---|---|---|---|---|
| Full Effort LoRA | 94.50% | 88.30% | 51.8 | 93.9 | 171.2 |
| w/o Effort Token | 98.40% | 0.00% | 67.5 | 67.5 | 67.5 |
通用能力 OOD 小样本评估:
| Model | Overall Acc. | OpenBookQA | BoolQ | MMLU | Parse Failures | Avg Reasoning Tokens |
|---|---|---|---|---|---|---|
| Base Qwen3.5-4B | 54.33% | 64.00% | 60.00% | 39.00% | 107 | 597.9 |
| LoRA Effort Model | 84.00% | 92.00% | 84.00% | 76.00% | 12 | 77.3 |
实验表明,LoRA 后模型能够根据 <LOW>、<MEDIUM>、<HIGH> 生成有序的可见推理长度梯度,并在中高 effort 下保持较高准确率。去除 effort token 后,模型虽然仍可答题,但三档输出完全塌缩,说明 effort token 是实现控制能力的必要条件。OOD 小样本评估中未观察到通用能力退化。
更完整的方法设计、实验分析和 AI 工具使用说明见:
PROJECT_DESIGN_REPORT.md