Views
No views yet
Qwen3-0.6B-Base 全参 SFT。模型不重写整句,只输出编辑脚本(哪些片段改、改成什么),由解析器拼接还原——无编辑句子只需 1 个 decode step,天然低延迟、零幻觉面小。| 评测集 | 句准率 | acceptable 口径* |
|---|---|---|
| 合成盲测(2,386 句) | 99.79% | 99.83% |
| 标贝真实语料(5,023 句,百科域) | 96.5% | 97.3% |
| Apple PolyNorm-Bench zh(278 句,27 类,政策对齐) | 93.2% | 96.0% |
输入 prompt:<|fim_prefix|>{原文}<|fim_suffix|>
输出:每行一条编辑 `锚点->读法`(按原文出现顺序);无需改写时输出为空,直接 <|endoftext|>输入: 会议定在18号下午3:30,预算¥1200万。
输出: 18号->十八号
3:30->三点三十分
¥1200万->一千二百万元1import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4MODEL = "leeoxiang/qwen3-0.6b-zh-tn"
5tok = AutoTokenizer.from_pretrained(MODEL)
6model = AutoModelForCausalLM.from_pretrained(MODEL, dtype=torch.bfloat16).cuda().eval()
7
8EOS_ID = 151643 # <|endoftext|>
9
10def parse_and_apply(src: str, output: str) -> str:
11 """编辑脚本 → 归一化文本。行内以最后一个 -> 分隔;锚点从游标起宽松第一匹配。
12 任何异常应走 fallback(返回原文或转规则链路)。"""
13 parts, cursor = [], 0
14 for line in output.split("\n"):
15 if not line.strip():
16 continue
17 idx = line.rfind("->")
18 assert idx > 0, f"bad line: {line!r}"
19 anchor, reading = line[:idx], line[idx + 2:]
20 pos = src.find(anchor, cursor)
21 assert pos != -1, f"anchor not found: {anchor!r}"
22 parts += [src[cursor:pos], reading]
23 cursor = pos + len(anchor)
24 return "".join(parts) + src[cursor:]
25
26def normalize(src: str) -> str:
27 prompt = f"<|fim_prefix|>{src}<|fim_suffix|>"
28 enc = tok(prompt, return_tensors="pt", add_special_tokens=False).to(model.device)
29 with torch.inference_mode():
30 out = model.generate(**enc, max_new_tokens=128, do_sample=False,
31 eos_token_id=EOS_ID, pad_token_id=EOS_ID)
32 raw = tok.decode(out[0, enc["input_ids"].shape[1]:], skip_special_tokens=True)
33 try:
34 return parse_and_apply(src, raw)
35 except AssertionError:
36 return src # fallback:解析失败回退原文(生产建议转规则链路)
37
38print(normalize("会议定在18号下午3:30,预算¥1200万。"))
39# → 会议定在十八号下午三点三十分,预算一千二百万元。1vllm serve leeoxiang/qwen3-0.6b-zh-tn \
2 --port 8103 --quantization fp8 \
3 --gpu-memory-utilization 0.3 --max-model-len 1024 \
4 --max-num-seqs 8 --enable-prefix-cachingtemperature=0)、stop_token_ids=[151643]、max_tokens=128。