Rewrite2 27B · BF16

中文小说改写 / 扩写专用模型。 输入一段小说原文或删减草稿,输出情节与人物不变、表达更自然的正文。
本仓库是 Rewrite2 27B 的 BF16:未量化的原始精度版本,作为其他格式的质量基准。

长度与切分:单次原文建议 500–800 汉字(约 330–530 tokens),固定提示词另加 81 tokens。

训练样本的「提示词 + 原文 + 输出」合计中位数约 1,000 tokens;按原文算,中位数约 800 汉字,输出中位数约 540 汉字。模型默认是压缩式改写:800–950 汉字的输入,训练目标输出中位数约 539 字(约为原文的 0.63 倍),不是等长改写。

长文请按下面的「长文怎么切」分段处理;只调大 max_tokens 不会改变这个长度先验。

可能出现复读 / 死循环。 模型不保证自然收尾,可能连续重复短语或整句,直到达到输出上限。部署时必须启用重复惩罚,建议从 repetition_penalty=1.08 开始(llama.cpp 对应 --repeat-penalty 1.08),同时设置硬性 max_tokens 和超时作为兜底。重复惩罚只能降低概率,不能完全消除。

30 秒判断

  • 它做什么:小说文字改写;把删减草稿扩写成完整正文。
  • 它不做什么:通用聊天、自由续写、凭空编情节、翻译、跨章节长篇一致性维护。
  • 怎么调用:一条 user 消息,内容必须是「固定任务提示词 + 正文」,见下一节。
  • 建议输入:单次原文 500–800 汉字(约 330–530 tokens),另加固定提示词 81 tokens;长文按场景/段落切成 500–700 字的小段,逐段改写。
  • 稳定性:有概率复读或死循环,必须启用重复惩罚(建议从 1.08 起调)并限制输出长度。
  • 本版定位:有充足显存,或需要最高精度、继续做二次量化/评测。
  • 权重与显存:约 53.8 GB(50.1 GiB);建议 80GB 级。

必用提示词

这个模型是任务特化 SFT 模型,不是通用润色助手。训练时只使用一条 user 消息,没有额外 system prompt,也没有 thinking 包裹。请直接使用下面的固定提示词;改成“帮我润色一下”会偏离训练分布。

改写

你是一位小说编辑,正在帮作者改文。请把下面这段小说片段改写成自然、有作者个人风格的中文,保持情节走向、人物设定和主要事件不变。无论原文是否通顺、AI味是轻是重,都要重新组织语言,禁止连续照抄原文超过15字;原文越好,越要用同义改写而不是照搬。

原文:

扩写

你是一位小说编辑,正在帮作者改文。请把下面这段经过删减的小说片段扩写成自然、有作者个人风格的中文,{tier_hint}。保持情节走向、人物设定和对话内容不变;补回被删掉的环境、动作、心理、神态等细节,同时允许重新组织、改写原有的句子和描写,把简略处展开、把生硬的句子重塑得更舒展自然,不要只在原句后面做加法;不得新增或改变情节;禁止连续照抄原文超过15字,直接输出扩写后的正文。

草稿:

{tier_hint} 必须替换成具体倍率说明。例如:

  • 1.5 倍:目标长度约为现在的 1.5 倍,属于中等幅度扩写
  • 1.6 倍:目标长度约为现在的 1.6 倍,属于中等幅度扩写
  • 1.8 倍:目标长度约为现在的 1.8 倍,属于中等幅度扩写

拼接规则:

改写:INSTRUCTION_rewrite.txt 的内容 + 原文
扩写:INSTRUCTION_expand.txt 替换 {tier_hint} 后 + 草稿

提示词末尾的「原文:」「草稿:」已经是格式的一部分,正文直接接在后面,不要再加一轮角色说明或思维链。仓库内附 INSTRUCTION_rewrite.txt 和 INSTRUCTION_expand.txt。

快速开始

1. 启动服务

vllm serve aikexue170/rewrite2-27b-bf16 \
  --served-model-name rewrite2 \
  --trust-remote-code \
  --max-model-len 4096 \
  --gpu-memory-utilization 0.90
  • 格式:合并后的 Hugging Face BF16 权重,6 个 safetensors 分片。
  • 推理:推荐 vLLM;模型结构是 Qwen3.5 文本架构,需要较新的 Transformers/vLLM。
  • 显存:约 50.1 GiB 权重,24GB/48GB 显卡无法完整加载。

2. 调用

from pathlib import Path
from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8080/v1",
    api_key="EMPTY",
)

# 改写
rewrite_instruction = Path("INSTRUCTION_rewrite.txt").read_text(encoding="utf-8")
text = """把这里换成需要改写的小说原文。"""
prompt = rewrite_instruction + text

response = client.chat.completions.create(
    model="rewrite2",
    messages=[{"role": "user", "content": prompt}],
    temperature=0.7,
    top_p=0.9,
    max_tokens=1200,
    extra_body={"repetition_penalty": 1.08},
)
print(response.choices[0].message.content)

# 扩写:把 INSTRUCTION_expand.txt 的 {tier_hint} 换成具体倍率
expand_instruction = Path("INSTRUCTION_expand.txt").read_text(encoding="utf-8")
expand_instruction = expand_instruction.replace(
    "{tier_hint}", "目标长度约为现在的 1.6 倍,属于中等幅度扩写"
)
prompt = expand_instruction + text

model 参数填服务启动时设置的名称即可;llama.cpp 服务会使用其 OpenAI 兼容接口。

长文怎么切

这个模型是按「约 800 汉字原文 → 约 540 汉字压缩改写」的训练分布学的,默认不是等长改写。上下文有 4096 tokens,塞得下 1,500–3,000 字,但模型不会因此覆盖全文:它往往展开开头、压缩后半,长度不够时补写。

做法:按自然段/场景切,每段 500–700 汉字,逐段改写。 大多数小说段落本身就在这个长度内;按空行、场景转换、对话轮次结束处切即可。每段都完整带「固定提示词 + 本段原文」,改完按顺序拼接。

最小实现

import re

def split_long_text(text, max_chars=700):
    """按换行/自然段切;单段超长时在句号/问号/感叹号处再切。"""
    paras = [p.strip() for p in re.split(r"\n+", text) if p.strip()]
    chunks, buf = [], ""
    for p in paras:
        while len(p) > max_chars:
            cut = max(p.rfind("。", 0, max_chars),
                      p.rfind("!", 0, max_chars),
                      p.rfind("?", 0, max_chars))
            cut = cut + 1 if cut > 0 else max_chars
            if buf:
                chunks.append(buf)
                buf = ""
            chunks.append(p[:cut].strip())
            p = p[cut:].strip()
        if len(buf) + len(p) + 1 <= max_chars:
            buf = (buf + "\n" + p).strip()
        else:
            if buf:
                chunks.append(buf)
            buf = p
    if buf:
        chunks.append(buf)
    return chunks

# 每段都要带完整固定提示词;这里只示意切分
chunks = split_long_text(original_text)
outputs = [rewrite_with_fixed_prompt(chunk) for chunk in chunks]
final = "\n\n".join(outputs)

rewrite_with_fixed_prompt 就是「INSTRUCTION_rewrite.txt + 该段正文」发一次请求。代码只保证不超过 max_chars,短段按自然段保留,不要把相邻短段强行凑长。

切分参考

原文长度 建议段数 每段
≤ 800 字 1 段 直接输入
800–1,500 字 2 段 400–700 字
1,500–3,000 字 3–5 段 500–700 字
> 3,000 字 先按章/场分,再切 每段 500–700 字

如果必须整段一次输出等长正文

当前模型没有做“等长改写”训练,默认会压缩。可以在固定提示词后追加一句强约束,先小样本验证:

本次必须逐段覆盖原文全部内容,不得省略、压缩或合并后半部分;输出长度应与原文相当,约 N 字。

这只是提示词层面的补救,不保证一定听话;生产环境仍建议按 500–700 字切段。若等长改写是硬需求,下一版需要用「输出/输入 0.9–1.1」的数据做微调。

推荐参数

项目 建议
temperature 0.7;固定复现实验用 0
top_p 0.9
top_k 50(llama.cpp / vLLM 支持时)
max_tokens 改写建议 ≤1200;扩写建议 ≤1600;不要设 300–500 的小上限
重复惩罚 建议 repetition_penalty=1.08 起步;llama.cpp 使用 --repeat-penalty 1.08
原文长度 500–800 汉字(约 330–530 tokens),另加 81 tokens 固定提示词;长文按 500–700 字切段
长文切分 按场景/段落切 500–700 字;不要整章一次性输入
输出长度 默认压缩改写,约为原文的 0.6–0.8 倍;要等长需显式要求并抽查

训练时 max_length=2048 tokens,这是上下文上限,不是最佳工作区间。按训练分布,单次原文 500–800 汉字、输出 500–1,000 字最稳;原文超过 1,000 汉字后,照抄、复读、跑题、压缩和收尾不稳的风险都会上升。模型默认会压缩改写,不做等长保证;需要等长时按「长文怎么切」里的方法显式要求并抽查。

即使设置了重复惩罚,也必须把 max_tokens 作为硬上限;仍出现连续复读时,直接截断并重试或更换随机种子。不要只靠降低温度解决死循环。

格式与显存

项 本仓库
版本 BF16
权重体积 约 53.8 GB(50.1 GiB)
部署参考 建议 80GB 级
推理格式 Hugging Face safetensors / vLLM
  • model-00001-of-00006.safetensors … model-00006-of-00006.safetensors:BF16 权重
  • model.safetensors.index.json、config.json、generation_config.json
  • tokenizer.json、tokenizer_config.json、chat_template.jinja
  • INSTRUCTION_rewrite.txt、INSTRUCTION_expand.txt、SHA256SUMS

已知限制

  • 默认压缩改写,不是等长改写。 V12 训练数据里,800–950 汉字的输入,参考输出中位数约 539 字(约 0.63 倍);模型会继承这个长度先验。输入 875 字输出 430–550 字属于训练分布内,不是上下文截断;要覆盖全文请按「长文怎么切」切段,或显式要求等长。
  • 任务专用:不保证通用问答、代码、数学或其他领域能力。
  • 改写可能保留过多原文,也可能压缩过度(尤其 800 字以上输入);扩写也可能达不到请求倍率;应在目标文本上抽查。
  • 长距离情节、人物关系和多章一致性需要上游切分与人工校对。
  • 低比特量化可能放大复读、续写、照抄和压缩倾向。本次 Q3_K_M 的额外短输入测试出现了明显短句复读;IQ4_XS/Q3_K_M 也更容易提前收尾。先检查 finish_reason 和 max_tokens,再切小段。
  • 本仓库不附带统一人工质量评测;请按自己的文体、篇幅和部署格式验收后再上线。

精度选择

BF16 是质量基准;FP8 和 NVFP4 已通过实际加载/生成,但本仓库暂不提供统一的人工质量分数。选择时优先看目标显存和实际文本验收。

全部版本

格式 定位 权重 Hugging Face ModelScope
BF16 原精度基准 53.8 GB rewrite2-27b-bf16 rewrite2-27b-bf16
FP8 W8A8 48GB 级部署 29.5 GB rewrite2-27b-fp8 rewrite2-27b-fp8
NVFP4 W4A4 24GB 级 Blackwell 18.9 GB rewrite2-27b-nvfp4 rewrite2-27b-nvfp4
IQ4_XS GGUF 16GB 优先质量 15.2 GB rewrite2-27b-iq4xs rewrite2-27b-iq4xs
Q3_K_M GGUF 16GB 优先余量 13.3 GB rewrite2-27b-q3km rewrite2-27b-q3km

训练概况

  • 基座:Qwen3.8-27B 系列文本基座。
  • 任务:中文小说改写与扩写。
  • 数据:V12 SFT,50,293 对(25,647 改写 + 24,646 扩写)。
  • 方法:LoRA rank 32、alpha 64,1 epoch,max_length=2048。
  • 输出:合并后的 27B SFT 模型,再按各仓库格式量化或转换。

校验

交付文件清单和 SHA-256 见 SHA256SUMS。权重加载后建议先跑一条短改写、一条扩写,确认真实输出和显存占用,再接入生产。

Downloads last month
5
Safetensors
Model size
27B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Collection including aikexue170/rewrite2-27b-bf16