JEVnovel 3 是面向 AIGC 小说改稿的句子检查模型系列:不只回答「这句行不行」,还指出「哪一小片写得差、这片该删还是该改」。
本仓库是系列中的 27B 教师模型(BF16 原始精度)。它对整句打分,学生模型(0.8B / 4B,另行发布)从它的打分中蒸馏出逐片定位能力。显存有限时可用同系列 FP8 量化版。
为什么需要它
AI 写小说容易写成「八股文」:高频形容词、套路化修辞、机械的分句节奏……这些写法原本是人类的正常表达,被 AI 高频滥用之后成了套路。它们是概率上的最优,不是可读性上的最优。
八股很难用规则抓:它形式多样,不同 AI 各有各的八股;直接封杀词句又会误伤——「湖中投入石子」是八股,但封杀「石子」会伤及大量正常描写。
JEVnovel 的做法是:用人类偏好数据训练判别模型,并把输出做成分类头——一次前向传播直接给出判断和置信度,不做自回归生成。
系列的演进:
- JEVnovel 2 解决「识别」:判断一句话需不需要修改;
- JEVnovel 2.5 尝试把粒度细化到逗号级小片,加了「短句头」做三分类(拖后腿 / 中性 / 有价值)。实测效果不好:它分不清「可以删掉的纯装饰」和「必须保留的信息」,给不出改稿动作,3 代将其取消;
- JEVnovel 3 换成两个能直接指导改稿的头:
- 观感曲线头:逐片输出「读到这里为止写得有多差」——曲线从哪一片抬升,问题就出在哪一片;
- 信息密度头:给每片一个 0~1 的密度分——回答「这片该删还是该改」。
两个头合起来,把「哪里有问题」变成可执行的改稿动作:判烂 + 密度低 → 删;判烂 + 密度高 → 改。
这个模型做什么
教师由 Qwen3.8-27B 微调而来,对整句打分,一次前向输出两组结果:
- 二分类:
可以保留 / 需要修改(平庸及以下算需要修改;章节号、结构化标记等不需要文学润色的内容算可以保留);
- 五档评分:
烂完了 / 小改 / 平庸 / 还可以 / 优秀。
注意:教师本身不带观感曲线头和信息密度头——那两个头装在学生模型上,教师只负责提供蒸馏用的打分信号。它也可以单独当作通用的文学质量 / 八股打分器使用(见下方用法)。
学生是怎么蒸馏出来的
3 代学生模型的能力来自两条独立的标注链路:
- 观感曲线 ← 本教师逐前缀打分。把句子按标点切成逗号级小片,对「前 1 片」「前 2 片」……每个前缀都让教师按整句打一次五档分。这样得到的不再是一个「整句结论」,而是一条曲线的形状。学生学这条曲线,所以不止知道「这句烂」,还知道「从哪一片开始烂」。
- 信息密度 ← StartLux-Decision-27B 裁判。质量和信息是两回事:有的片段「写得烂但没有信息量」(纯装饰,该删),有的「写得烂但承载着情节」(该改)。教师只管质量;信息维度交给裁判模型——它对每一小片回答一个问题:「编辑要把这句话改简洁时,这个片段能不能删掉?」答案直接作为片级密度标签。
- 学生(0.8B / 4B,LoRA,双头)用这两套标注训练。
完整的方法、数据规模与评测细节见仓库内的《JEVnovel3技术报告.md》。
评测
协议与系列一致:主指标取人类标注人数最多、共识最高的 538 句(main-bench),统计 Macro-F1、bad 召回、bad 精确和正常句误报;判定阈值先在验证集上确定并冻结,再应用到测试集。
| 模型 |
主集 Macro-F1 |
bad 召回 |
bad 精确 |
正常句误报 |
jev-novel-2-27b-bf16(上一代) |
0.7661 |
0.6162 |
0.8978 |
0.0712 |
| 本模型(最优工作点) |
0.8223 |
0.7417 |
0.8894 |
0.0936 |
- 相比上一代 27B:主指标提升 5.6 个点,bad 召回提升约 12.6 个点,抓得更全;代价是正常句误报从 7.1% 升到 9.4%,精确率基本持平。
- 出厂冻结阈值(0.31)下 Macro-F1 为 0.8185;表中 0.8223 是最优工作点(阈值 ≈0.30)下的数字。
- FP8 版与本版同阈值对照:Macro-F1 0.8185 → 0.8151(Δ −0.003),逐句
p_bad 平均偏差 0.011、p95 偏差 0.046,判定翻转 10/538(1.9%)——量化损失可以忽略,显存有限时优先用 FP8 版。
模型规格
| 项 |
值 |
| 参数量 |
27.48B(含 0.13B 打分头) |
| 文本骨干 |
qwen3_5,hidden 5120,64 层 |
| 打分头 |
JointSchemaHead(width 1024 / 4 层 / 16 头,fp32) |
| 判定阈值 |
p_bad >= 0.31(可用 --threshold 调整) |
| 最长输入 |
4096 token(含固定提示) |
| 本版权重 |
BF16,12 个分片 + adapter_head.safetensors(适配器与打分头,未合并;infer.py 自动加载),约 59 GiB |
| FP8 权重 |
8 个分片 + head.safetensors(适配器已合并),约 29 GiB;见同系列 FP8 仓库 |
| 显存建议 |
BF16 建议 80 GB 级别;FP8 版显著更低 |
用法
自定义架构,不能直接用 AutoModel 加载,请使用本仓库的 infer.py。
安装
需要 Linux、Python 3.12、支持 BF16 的 NVIDIA GPU(建议 80 GB 显存)、至少 32 GB 内存。CUDA 13.2 工具链与驱动需与所装的 PyTorch 版本兼容。
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheel packaging ninja
python -m pip install torch==2.13.0 --index-url https://download.pytorch.org/whl/cu132
python -m pip install --no-build-isolation -r requirements.txt
推理
在本目录运行即可,模型文件已包含,推理无需联网:
# 单句
python infer.py --text "雨停了,他推开窗,看见树梢还在滴水。"
# 批量(JSONL)
python infer.py --input input.jsonl --output output.jsonl --batch-size 1
输入:JSONL 每行形如 {"sentence":"待判断的句子"},可附带 id。
输出:
p_bad:「需要修改」的概率;label:判定结果。p_bad >= 0.31 判为 bad(需要修改),否则 not_bad(可以保留);
- 加
--ordinal 可额外输出五档概率和 1–5 期望分数;
- 模型判断的是表达质量,不判断作者身份。
供程序调用:
from infer import Predictor
model = Predictor()
result = model.predict(["待判断的句子"], include_ordinal=True)
其他说明:
- 句子连同固定提示总计最多 4096 token,超限报错、不自动截断;
- 下载后可用
sha256sum -c SHA256SUMS 校验文件完整性;第三方许可见 LICENSE 和 NOTICE。
未来计划
- 在「哪里有问题」之上继续细分「有什么问题」,让学生直接给出语义化的修改方向;
- 持续扩展数据集的文体广度,覆盖更多不同 AI 的八股形态。
许可
以 Apache-2.0 发布,承继基座模型(Qwen3.8)的许可证,见 LICENSE 与 NOTICE。