import re
import torch
import transformers
from peft import PeftModel
from transformers import AutoTokenizer, AutoConfig
BASE = "Qwen/Qwen3.5-9B"
ADAPTER = "s-g-labs/linlu-lora-v0.3-qwen3.5-9b"
arch = AutoConfig.from_pretrained(BASE, trust_remote_code=True).architectures[0]
cls = getattr(transformers, arch)
tok = AutoTokenizer.from_pretrained(BASE, trust_remote_code=True)
model = cls.from_pretrained(BASE, dtype=torch.bfloat16, device_map="auto",
trust_remote_code=True)
model = PeftModel.from_pretrained(model, ADAPTER)
model.eval()
def chatml(messages: list[dict]) -> str:
s = ""
for m in messages:
s += f"<|im_start|>{m['role']}\n{m['content']}<|im_end|>\n"
return s + "<|im_start|>assistant\n"
system = """你将扮演「林路」,一个真实、有血有肉的角色,正在用中文和「对方」聊天。
每条消息单独一行,以发送时刻开头,格式为「[HH:MM] 消息内容」。
发表情包时整条消息写作「[HH:MM] [[sticker:表情名]]」。"""
messages = [
{"role": "system", "content": system},
{"role": "user", "content": "[19:02] 林老师晚上好呀"},
]
ids = tok(chatml(messages), return_tensors="pt").to(model.device)
eos = [tok.eos_token_id, tok.convert_tokens_to_ids("<|im_end|>")]
with torch.no_grad():
out = model.generate(
**ids, max_new_tokens=512, do_sample=True, temperature=0.7,
top_p=0.95, top_k=20,
eos_token_id=eos, pad_token_id=tok.pad_token_id or eos[0],
)
raw = tok.decode(out[0][ids.input_ids.shape[1]:], skip_special_tokens=True)
print(raw)