Instructions to use aikexue170/rewrite2-27b-fp8 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use aikexue170/rewrite2-27b-fp8 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="aikexue170/rewrite2-27b-fp8") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("aikexue170/rewrite2-27b-fp8") model = AutoModelForCausalLM.from_pretrained("aikexue170/rewrite2-27b-fp8", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use aikexue170/rewrite2-27b-fp8 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "aikexue170/rewrite2-27b-fp8" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "aikexue170/rewrite2-27b-fp8", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/aikexue170/rewrite2-27b-fp8
- SGLang
How to use aikexue170/rewrite2-27b-fp8 with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "aikexue170/rewrite2-27b-fp8" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "aikexue170/rewrite2-27b-fp8", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "aikexue170/rewrite2-27b-fp8" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "aikexue170/rewrite2-27b-fp8", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use aikexue170/rewrite2-27b-fp8 with Docker Model Runner:
docker model run hf.co/aikexue170/rewrite2-27b-fp8
Rewrite2 27B · FP8 W8A8
中文小说改写 / 扩写专用模型。 输入一段小说原文或删减草稿,输出情节与人物不变、表达更自然的正文。
本仓库是 Rewrite2 27B 的 FP8 W8A8:NVIDIA ModelOpt FP8 W8A8 量化版,适合 48GB 级部署。
长度与切分:单次原文建议 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 起调)并限制输出长度。
- 本版定位:显存不够跑 BF16,但希望尽量保留原精度。
- 权重与显存:约 29.5 GB(27.5 GiB);建议 48GB 级。
必用提示词
这个模型是任务特化 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-fp8 \
--served-model-name rewrite2 \
--trust-remote-code \
--max-model-len 4096 \
--gpu-memory-utilization 0.90
- 格式:ModelOpt FP8 W8A8(权重和激活均为 FP8),3 个 safetensors 分片。
- 推理:vLLM 会根据
hf_quant_config.json自动选择量化路径。 - 验证:已在本机 vLLM 中实际加载并生成,曾用于改写站点的 27B 部署。
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 作为硬上限;仍出现连续复读时,直接截断并重试或更换随机种子。不要只靠降低温度解决死循环。
格式与显存
| 项 | 本仓库 |
|---|---|
| 版本 | FP8 W8A8 |
| 权重体积 | 约 29.5 GB(27.5 GiB) |
| 部署参考 | 建议 48GB 级 |
| 推理格式 | Hugging Face safetensors / vLLM |
model-00001-of-00003.safetensors…model-00003-of-00003.safetensors:FP8 权重config.json、hf_quant_config.json、model.safetensors.index.jsontokenizer.json、tokenizer_config.json、chat_template.jinjaINSTRUCTION_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
- 1