JEVnovel 2.5 · 0.8B
面向 AIGC 文学创作的「八股文」定位模型:不再只回答「这句行不行」,而是指出「哪一小片在拖后腿」。
🎯 背景与动机
LLM 在文学创作领域一直面临一个显著的问题。由于对编码、Agent 领域持续精进的训练,文学领域始终未受重视——语料的不平衡、RL 策略的倾向性,使得 AI 在文学创作输出上逐渐形成了一套「八股文」,即文学创作领域的局部最优。八股文通常是概率上的最优,而不是可读性上的最优。
上一代 JEVnovel 2 解决了「识别」问题:给一句话,判断它需不需要修改。但真正把模型接进改稿流水线后,我们发现这还不够——一句被判烂的文字摆在那里,写手模型该改哪里?全句重写容易误伤原本不错的部分,只改坏的部分才是成本最低、效果最稳的做法。
JEVnovel 2.5 就是我们给出的答案:把判断粒度从「整句」细化到「逗号级小片」。
🧠 方法
- 细切分:把一句话按标点切成若干小片,模型逐片打分——坏的不是整句,往往只是其中一两个小片。
- 双头结构:在骨干模型之上挂两个线性头。位置头在每读完一个小片时输出「到这里为止,这段文字需要修改的概率」,逐片连起来就是一条观感曲线——曲线在哪一片突然抬升,问题就出在哪一片。短句头则对每个小片做三分类:拖后腿、中性、有价值,把「问题片」和「亮点片」区分开来。
- 完全蒸馏自 27B:这一代没有使用任何人工直接标注。上一代 27B 教师先对语料逐片打分,产出 2.4 万句带逐片标注的训练集,小模型再从教师身上学——学的不只是结论,还有整条曲线的形状。
- 训练:Qwen3.5 0.8B 基座,LoRA 训练,不引入任何类别加权。我们试过用加权硬拉召回,结果是分数好看了、概率校准全崩了,最后选择回归干净的目标函数。
📊 评测
评测设置
沿用上代协议:判定阈值在验证集上冻结后再应用到 benchmark,main-bench 取人类共识最高的 538 句作为核心指标,all-bench 为噪声较大的全体 4,254 句作为参考。
结果
| 模型 | 来源 | main macro-F1 | bad召回 | bad精确 | 负误报 | all macro-F1 |
|---|---|---|---|---|---|---|
jev-novel-2-27b-bf16 |
JEVnovel 2 | 0.7661 | 0.6162 | 0.8978 | 0.0712 | 0.5928 |
jev-novel-2-4b-bf16 |
JEVnovel 2 | 0.7509 | 0.6273 | 0.8458 | 0.1161 | 0.5954 |
jev-novel-2.5-4b-bf16 |
JEVnovel 2.5 | 0.747 | 0.697 | 0.778 | 0.202 | 0.600 |
jev-novel-2-0.8b-bf16 |
JEVnovel 2 | 0.7426 | 0.6790 | 0.7830 | 0.1910 | 0.6057 |
jev-novel-2.5-0.8b-bf16 |
JEVnovel 2.5 | 0.730 | 0.734 | 0.732 | 0.273 | 0.607 |
claude-opus-5.5 |
LLM 最好成绩 | 0.4853 | 0.6642 | 0.5028 | 0.6667 | 0.4728 |
random-baseline |
baseline | 0.5000 | 0.5000 | 0.5037 | 0.5000 | 0.4999 |
教师保真度
句级分数看不出 2.5 的主能力——人类标注只标了「整句好不好」,没标「哪片烂」。逐片定位的水平要用教师 bench 衡量:以 27B 教师的逐片打分为真值,看学生学得像不像。
| 指标 | 0.8B(本模型) | 4B(姊妹版) |
|---|---|---|
| 整句 P 相关性 | 0.905 | 0.932 |
| 逐片前缀相关性 | 0.910 | 0.935 |
| 片贡献 Δ 相关性 | 0.927 | 0.947 |
| 最拖片命中率 | 0.579 | 0.623 |
| 三分类一致率 | 0.739 | 0.768 |
0.8B 已经把教师曲线九成的形状复制了下来,4B 更高,是家族里保真度最高的一档。
顺带解释一句最拖片命中率为什么明显低于其他指标:观感曲线是严格的因果判断——每读到一个片,只能依据已经读过的内容打分;而教师标注「最拖的片」时用的是 O(N) 次前向的删片对比,等于看完全文再回头指认。让学生一次前向就给出同样的答案,本质上是拿 O(1) 的因果输出逼近 O(N) 的非因果标注,六成上下的命中率已经相当可观。
输出长什么样
同一段文字改前改后:整段概率从 0.398 降到 0.069。红底越深的片观感越差,曲线上的红柱是该片的贡献,底部胶囊是短句头判定——「像是嫌自己说得太明白」被两个头同时点名。
分析与讨论
句级打平,定位是白送的吗? 2.5 在句级二分类上与上一代基本持平,0.8B 甚至略低一点。我们不打算掩饰这一点:主任务从「判断」换成了「定位」,句级分数不退步就是我们给自己定的底线。真正多出来的是逐片定位能力,这是上一代完全没有的。
尺寸效应依然微弱。 0.8B 到 4B,句级分数几乎不动,教师保真度只涨约两个点。和上代结论一致:人类高共识的八股对小模型并不难,参数量的优势体现在模棱两可的长尾句上。追求性价比选 0.8B,追求极限保真选 4B。
已知边界:单句成段的极短文本容易被误伤;模型只判断观感,不判断事实与逻辑;训练域是中文网文,其他文体未经验证。
🗺️ 未来计划
- 第三代头:从「哪里有问题」走向「有什么问题」,让模型直接给出语义化的修改方向;
- 持续扩展数据集的文体广度。
📐 模型规格
| 项 | 值 |
|---|---|
| 参数量 | 0.75B |
| 权重 | bf16,1.5 GB,1 个 safetensors 分片 |
| 文本骨干 | qwen3_5_text,hidden 1024,24 层 |
| 位置头 | Linear(1024→1),逐片前缀概率 |
| 短句头 | Linear(1024→3),拖后腿/中性/有价值 |
| 判定阈值 | 整段 0.050,片 Δ 0.05 / 片 P 0.15 / 绝对线 0.5 |
| 最长输入 | 1024 token(含固定提示) |
🚀 用法
⚠️ 自定义架构,不能直接用
AutoModel加载,请使用本仓库的infer.py。
安装
python -m pip install torch --index-url https://download.pytorch.org/whl/cu128
python -m pip install --no-build-isolation -r requirements.txt
推理
# 单句
python infer.py --text "话一出口她自己先红了脸,像是嫌自己说得太明白,转身去开冰箱。"
# 批量(JSONL)
python infer.py --input input.jsonl --output predictions.jsonl
输入:JSONL 每行包含 sentence(可选 id)。
输出字段:
| 字段 | 说明 |
|---|---|
p |
整段需要修改的概率 |
bad |
整段判定 |
pieces |
逐片结果:text / p / delta / clause / clause_prob / flag |
📄 许可
以 Apache-2.0 发布,承继基座模型(Qwen3.5)的许可证,见 LICENSE。
- Downloads last month
- 56

