JEVnovel 3 · 0.8B(BF16)
给 AIGC 小说改稿用的句子检查模型:指出一句话里哪一小片写得差,以及这一片该删还是该改。一次前向传播出结果,不做自回归生成。0.8B 是同系列里最小的尺寸,适合资源有限时部署;本仓库是 BF16 原精度版,还有更省的 FP8 量化版。
仓库内附《JEVnovel3技术报告.md》:方法、数据与评测的完整细节。
它做什么
输入一句话,输出两样东西:
- 观感曲线:把句子按标点切成小片,每读完一片给一个「到这里为止写得有多差」的分数——曲线从哪一片开始抬升,问题就出在哪一片;
- 信息密度:给每片一个 0~1 的分数,回答「这一片有没有内容」。
两者合起来直接给出改稿动作:判烂 + 密度低 → 删(纯装饰,删掉无损);判烂 + 密度高 → 改(有内容,重写不删);没判烂 → 不动。
效果示例
示例 1 里两处判烂、密度都低,投「删」;示例 2 里判烂两处、密度不低,投「改」。
怎么做的
- 语料:社区标注站收集的人类偏好数据,2.4 万句。
- 观感曲线 ← 27B 教师逐前缀打分。用同系列的 27B 教师模型(jev-novel-3-27b-bf16,另行发布):把句子切成小片后,让教师读每一段前缀、按整句打一次五档分(烂完了 / 小改 / 平庸 / 还可以 / 优秀)。学生学的是整条曲线的形状——不只是「这句烂」,还有「从哪一片开始烂」。
- 信息密度 ← StartLux-Decision-27B 裁判。「烂不烂」和「有没有内容」是两回事:写得烂但承载着情节的片段该改,写得烂、只是装饰的片段才该删——一个头答不了两个问题,所以分开。裁判对每一小片回答一个改稿向的问题:「这句话若要润色,这一片应该整片删掉,还是保留、改写?」题面参照人类总结的 AI 八股分类设计(哪些写法属于删掉不心疼的装饰、哪些属于删了句子会断的内容),并用人工整理的八股案例核对过。裁判的答案作为片级密度标签。
- 训练:Qwen3.5-0.8B 基座 + LoRA,两个头各是一个线性层。更完整的细节见仓库内的《JEVnovel3技术报告.md》。
评测
评测采用系列统一协议:判定阈值只在验证集上确定并冻结,再应用到主集(538 条人类共识最高的句子),指标为 Macro-F1。
| 模型 | 主集 Macro-F1 | bad 召回 | bad 精确 | 正常句误报 | 全量 Macro-F1 |
|---|---|---|---|---|---|
jev-novel-2-0.8b-bf16(2 代) |
0.7426 | 0.6790 | 0.7830 | 0.1910 | 0.6057 |
jev-novel-2.5-0.8b-bf16(2.5 代) |
0.730 | 0.734 | 0.732 | 0.273 | 0.607 |
| 本模型(jev-novel-3-0.8b-bf16) | 0.780 | 0.668 | 0.870 | 0.101 | 0.580 |
同系列 FP8 版与本版在同一阈值(0.080)下对照(全量 4254 条):Macro-F1 0.580 → 0.576,逐句分数平均偏差 0.006,主集判定翻转 6/538——量化基本无损。
逐片头与教师/裁判的一致性(验证集):观感曲线相关 0.76,信息密度相关 0.90。
模型规格
| 项 | 值 |
|---|---|
| 参数量 | 0.75B |
| 本版权重 | BF16,约 1.4 GB,单文件 |
| FP8 版 | 约 1.0 GB,见同系列 jev-novel-3-0.8b-fp8 |
| 文本骨干 | qwen3_5_text,hidden 1024,24 层 |
| 观感曲线头 | Linear(1024→1),读每一片的末尾 token |
| 信息密度头 | Linear(1024→1),片内取平均 |
| 判定阈值(验证集冻结) | 整句「需要修改」≥ 0.080;片判烂:Δλ≥0.08 且 λ≥0.15,或 λ≥0.9;删/改分界:密度 0.5 |
| 最长输入 | 512 token(含固定提示) |
用法
⚠️ 自定义结构,不能用
AutoModel直接加载,请使用本仓库的infer.py。
安装
需要 Linux、Python 3.10+、支持 BF16 的 NVIDIA GPU。
python -m pip install torch==2.13.0 --index-url https://download.pytorch.org/whl/cu130
python -m pip install --no-build-isolation -r requirements.txt
推理
# 单句
python infer.py --text "她抽了张纸巾,慢慢擦手,从指尖擦到指根,一根一根地擦。"
# 批量(JSONL)
python infer.py --input input.jsonl --output pred.jsonl
输入:JSONL 每行包含 sentence(可选 id)。
输出:
| 字段 | 说明 |
|---|---|
p_bad |
整句「需要修改」的概率 |
bad |
整句判定(对比阈值 0.080) |
pieces |
逐片结果:text(片文本)/ w(曲线值)/ lam(λ)/ delta_lam(本片增量)/ density(信息密度)/ flag(是否判烂)/ action(删 / 改 / 空) |
下载后可用 sha256sum -c SHA256SUMS 校验文件完整性。
许可
以 Apache-2.0 发布,承继基座模型(Qwen3.5)的许可证,见 LICENSE。