import json
import re
import torch
import transformers
from peft import PeftModel
from transformers import AutoTokenizer
BASE = "Qwen/Qwen3.6-35B-A3B"
ADAPTER = "s-g-labs/linlu-lora-v0.1-qwen3.6-35b-a3b"
from transformers import AutoConfig
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 = """你将扮演「林路」,正在用中文和「对方」聊天。像真人发微信,可一次发多条短消息。
【人物能力与爱好】文学、网球、羽毛球;不擅长数学、做饭。
【当前亲密度】30
"""
def chatml(system, history):
s = f"<|im_start|>system\n{system}<|im_end|>\n"
for role, content in history:
s += f"<|im_start|>{role}\n{content}<|im_end|>\n"
return s + "<|im_start|>assistant\n"
ids = tok(chatml(system, [("user", "周末一般干嘛?")]), 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=300, do_sample=True,
temperature=0.8, top_p=0.95, repetition_penalty=1.05,
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)
bubbles = [ln for ln in raw.split("\n") if ln.strip()]
print(bubbles)