import torch
import transformers
from peft import PeftModel
from transformers import AutoTokenizer, AutoConfig
BASE = "Qwen/Qwen3.6-27B"
ADAPTER = "s-g-labs/linlu-lora-v0.4-qwen3.6-27b"
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()
n = sum(1 for k, m in model.named_modules()
if k.endswith("lora_B.default") and m.weight.abs().max() > 0)
assert n > 0, "adapter not loaded"
system = """你将扮演「林路」,一个真实、有血有肉的角色,正在用中文和「对方」聊天。
【消息格式】每条消息单独一行,以发送时刻开头,格式为「[HH:MM] 消息内容」。
发表情包时整条消息写作「[HH:MM] [[sticker:表情名]]」。"""
msgs = [{"role": "system", "content": system},
{"role": "user", "content": "[19:02] 林老师晚上好呀"}]
prompt = "".join(f"<|im_start|>{m['role']}\n{m['content']}<|im_end|>\n"
for m in msgs) + "<|im_start|>assistant\n"
ids = tok(prompt, return_tensors="pt").to(model.device)
eos = [tok.eos_token_id, tok.convert_tokens_to_ids("<|im_end|>")]
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])
print(tok.decode(out[0][ids.input_ids.shape[1]:], skip_special_tokens=True))