Qwen2.5-3B-Haizi-CN(中文约束版)
在 shikunpunk/Qwen2.5-3B-Haizi 基础上,合并"必须全部使用中文,禁止混入任何英文字母、单词或句子"指令样本,进一步做 3 轮 SFT 微调的版本。
为什么要有 CN 版本?
原始 Haizi 模型在温度 ≥ 0.8 时会有一定概率混入英文(empty / Empty Bottle / myself 等),干扰中文诗歌阅读体验:
| 指标 | Haizi(旧模型) | Haizi-CN |
|---|---|---|
| 样本数 | 50 首 | 20 首 |
| 英文混入率 | 58.0%(29/50) | 0.0%(0/20) ✅ |
| 高频英文 | empty(38x) / Empty(9x) / empty bottle(6x) | 无 |
| 平均长度字 | 303 字 | 223 字 |
仅使用 21 条纯中文约束样本 + 3 轮 SFT,英文混入消除率 100%,风格未失真。
训练方法(Haizi-CN 第二轮)
- 基座:shikunpunk/Qwen2.5-3B-Haizi(QLoRA 已合并的 HF 权重)
- 方法:QLoRA 4bit NF4,LoRA rank=32, alpha=64, dropout=0.05,
lora_target=all - 数据:haizi_cn_train.jsonl(海子诗歌 134 首 + 21 条中文约束纯中文样本,共 155 条)
- 超参:3 epoch,lr=2e-4,cosine 调度,warmup=0.1,cutoff_len=768 per_device_batch=1 × grad_accum=8 → 总优化步数 60 步
- eval_loss = 3.40
- 中文约束指令:
"你是诗人海子,请以{题目}写一首你觉得好的诗歌。注意:必须全部使用中文,禁止混入任何英文字母、单词或句子。"
数据仓库:shikunpunk/haizi-poetry-dataset
生成示例(Haizi-CN,T=1.0)
提示词:请以《空瓶子》为题,创作一首现代诗。
今夜星疏,万古愁 我今夜 在异乡
我今夜 在异乡 酒醉的异乡人啊!
你在酒杯中看到的是什么?是大海还是天空? 你是否知道,在漆黑的夜里,我们抬头可以看到多少颗星星?
今夜我的灯下 盛满了清水 盛满了水中的鱼 盛满了鱼中的我
盛满了清水的瓶中盛满的是什么?
我无法回答这个问题。
我只能在这一些瓶子中发现真理。
我发现:空瓶子中盛满真理。
空瓶子 在盛满欢乐的草原上。 空瓶子 在盛满果实的果园里。
空瓶子! 盛满欢乐和果实的草原和果园。 空瓶子!
快速开始
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "shikunpunk/Qwen2.5-3B-Haizi-CN"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id, trust_remote_code=True, torch_dtype="auto", device_map="auto",
)
prompt = "请以《面朝大海》为题,创作一首现代诗,大约10到15行。注意:必须全部使用中文,禁止混入任何英文字母、单词或句子。"
messages = [{"role": "user", "content": prompt}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=256, do_sample=True, temperature=1.0, top_p=0.9)
print(tokenizer.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))
致谢
- 原始基座:Qwen2.5-3B-Instruct
- 原始海子风格基座:shikunpunk/Qwen2.5-3B-Haizi
- 训练框架:LLaMA-Factory