mikuhhn1239/qwen3-8b-scene-segmentation-lora
213
Qwen3-8B Scene Boundary Detection LoRA
All Novel Can Be Galgame — Agent 2: 场景边界检测
判断段落序列中哪些位置应切换 scene。三 Agent 中最难任务。当前默认 main = v4-590(DeepSeek 重标注, F1 30.5%)。 
基座: Qwen3-8B-Novel-Base-SFT | 方法: LoRA r=64 α=128 | 硬件: A800 80GB
训练代码仓库:https://github.com/lin1753/novel-agent
项目地址;https://github.com/lin1753/novel2galgame
任务
- 输入: 编号段落
[P1]...[P2]... - 输出:
{"boundaries": [N]}— N 为切分位置 - 测试集: 49 条 (v4 标准)
示例
输入:
[P1] 下课铃响,教室里热闹起来。
[P2] 她低头收拾书包。
[P3] 我犹豫了一下,还是叫住了她。
[P4] 十分钟后,我们并肩走在校门外的街道上。
输出:
{"boundaries": [3]} ← P3后切scene(教室→校门外)加载
from transformers import AutoModelForCausalLM
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained(
"mikuhhn1239/qwen3-8b-novel-base-sft",
torch_dtype="auto", device_map="auto",
)
model = PeftModel.from_pretrained(
base, "mikuhhn1239/qwen3-8b-scene-segmentation-lora"
)训练配置
基座: Qwen3-8B-Novel-Base-SFT (Stage1 全参 SFT, 72K)
方法: LoRA (r=64, α=128, dropout=0.05)
框架: transformers Trainer + PEFT
优化器: AdamW (adamw_torch_fused), cosine schedule, warmup=5%
epoch: 5 | LR: 1e-4 | batch: 1×16(accum) | bf16 | max_length: 4096分支映射
完整版本历史
v1–v2:早期探索
v3 系列:人类 Clean 标注
三次格式实验(均失败)
v4 系列:DeepSeek 重标注 — 唯一突破
v4.1 扩标实验详情
v4.1-1804:快速扩标到 1804 条。边界比 8.5%(太保守),31% 零边界。eval_loss 创全系列新低(1.74→1.32),但 F1=29.9% 未超 v4-590。大量低质量标注稀释了信号。
v4.1-582 精炼:筛选 ≥2 边界 + 非 P1 起切 + 8-18 段。边界比 15.6%,零边界仅 8%,≥2 边界占 76%。F1=30.2%(接近 v4-590),但依赖训练密度 — 在低密度测试集上仅 25.9%。
结论:数据密度影响泛化。模型学会训练集的边界密度,密度不匹配时 F1 崩盘。扩标+精炼均未超越 v4-590 的 30.5%。
全系列最终排名
v3.1验证集指标如下

v4与4.1指标对比

关键结论
三大根因
- LM loss ≠ F1 最大化:边界仅占 ~10% 样本,"全 false" 即最低 loss
- 全局篇章理解需求:不同于 narrative-type / attribution 的局部判断,scene-boundary 需要 10-20 段落的全局结构 — 8B 容量可能不够
- 数据不平衡:训练/验证集边界密度不匹配,模型学会训练密度后泛化差
经验
- 短 prompt 是必要条件(95 字 vs 735 字 → +8pp)
- 标注质量 > 数据量 > 训练技巧:DeepSeek 重标注是唯一突破 30% 的路径
- FP 是最终瓶颈:所有版本精度 27-29%,模型始终预测 2-3× 太多边界
- 8B + SFT 天花板 ≈ 30% F1:格式改进、数据扩标、精炼过滤均未突破
- 简单 = 好:不加 reasons、不加推理链、不加复杂格式
继续突破方向
- GRPO/DPO 用 F1 做 reward 信号
- 换 32B/72B 基座
- 增大训练集正样本比例(当前 ~10%)
