JEVnovel 3 · 4B(FP8)
给 AIGC 小说改稿用的句子检查模型:指出一句话里哪一小片写得差,以及这一片该删还是该改。一次前向传播出结果,不做自回归生成。本仓库是 FP8 量化版(显存约为 BF16 版一半,精度几乎不变),原精度权重见同系列
jev-novel-3-4b-bf16。仓库内附《JEVnovel3技术报告.md》:方法、数据与评测的完整细节。
它做什么
输入一句话,输出两样东西:
- 观感曲线:把句子按标点切成小片,每读完一片给一个「到这里为止写得有多差」的分数——曲线从哪一片开始抬升,问题就出在哪一片;
- 信息密度:给每片一个 0~1 的分数,回答「这一片有没有内容」。
两者合起来直接给出改稿动作:判烂 + 密度低 → 删(纯装饰,删掉无损);判烂 + 密度高 → 改(有内容,重写不删);没判烂 → 不动。
效果示例
示例 1 里三处判烂、密度都低,全投「删」——整段都是可以删掉的装饰性写法;示例 2 只判烂一处、密度 57%,投「改」——那一片要重写,不能删。
怎么做的
- 语料:社区标注站收集的人类偏好数据,2.4 万句。
- 观感曲线 ← 27B 教师逐前缀打分。用同系列的 27B 教师模型(jev-novel-3-27b-bf16,另行发布):把句子切成小片后,让教师读每一段前缀、按整句打一次五档分(烂完了 / 小改 / 平庸 / 还可以 / 优秀)。学生学的是整条曲线的形状——不只是「这句烂」,还有「从哪一片开始烂」。
- 信息密度 ← StartLux-Decision-27B 裁判。「烂不烂」和「有没有内容」是两回事:写得烂但承载着情节的片段该改,写得烂、只是装饰的片段才该删——一个头答不了两个问题,所以分开。裁判对每一小片回答一个改稿向的问题:「这句话若要润色,这一片应该整片删掉,还是保留、改写?」题面参照人类总结的 AI 八股分类设计(哪些写法属于删掉不心疼的装饰、哪些属于删了句子会断的内容),并用人工整理的八股案例核对过。裁判的答案作为片级密度标签。
- 训练:Qwen3.5-4B 基座 + LoRA,两个头各是一个线性层;本仓库权重再经 FP8 量化。更完整的细节见仓库内的《JEVnovel3技术报告.md》。
评测
评测采用系列统一协议:判定阈值只在验证集上确定并冻结,再应用到主集(538 条人类共识最高的句子),指标为 Macro-F1。
| 模型 | 主集 Macro-F1 | bad 召回 | bad 精确 | 正常句误报 | 全量 Macro-F1 |
|---|---|---|---|---|---|
jev-novel-2-27b-bf16(2 代 27B,参考) |
0.7661 | 0.6162 | 0.8978 | 0.0712 | 0.5928 |
jev-novel-2.5-4b-bf16(2.5 代) |
0.747 | 0.697 | 0.778 | 0.202 | 0.600 |
| 本模型(jev-novel-3-4b-fp8) | 0.749 | 0.775 | 0.739 | 0.277 | 0.586 |
本版与 BF16 版在同一阈值(0.040)下对照(全量 4254 条):Macro-F1 0.589 → 0.586,逐句分数平均偏差 0.004,主集判定翻转 8/538——量化基本无损。
逐片头与教师/裁判的一致性(验证集):观感曲线相关 0.79,信息密度相关 0.92。
模型规格
| 项 | 值 |
|---|---|
| 参数量 | 4.21B |
| 本版权重 | FP8 W8A8(e4m3,权重与激活均量化),约 4.8 GB,2 个分片;推理走 PyTorch 原生低精度路径 |
| 文本骨干 | qwen3_5_text,hidden 2560,32 层 |
| 观感曲线头 | Linear(2560→1),读每一片的末尾 token |
| 信息密度头 | Linear(2560→1),片内取平均 |
| 判定阈值(验证集冻结) | 整句「需要修改」≥ 0.040;片判烂:Δλ≥0.1 且 λ≥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.040) |
pieces |
逐片结果:text(片文本)/ w(曲线值)/ lam(λ)/ delta_lam(本片增量)/ density(信息密度)/ flag(是否判烂)/ action(删 / 改 / 空) |
下载后可用 sha256sum -c SHA256SUMS 校验文件完整性。
许可
以 Apache-2.0 发布,承继基座模型(Qwen3.5)的许可证,见 LICENSE。