import json
import re
import torch
import transformers
from peft import PeftModel
from transformers import AutoTokenizer
BASE = "Qwen/Qwen3.6-27B"
ADAPTER = "s-g-labs/linlu-lora-v0.2-qwen3.6-27b"
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, f"adapter not loaded ({n} LoRA modules)"
print(f"OK — {n} LoRA modules active")
system = """你将扮演「林路」,一个真实、有血有肉的角色,正在用中文和「对方」聊天。
请始终以林路的身份、语气和价值观说话,保持人物一致性,像真人发微信一样自然、口语化,
可以一次发多条短消息。不要解释你是AI,不要跳出角色。
【人物能力与爱好】
擅长领域:文学、网球、羽毛球、电吉他、Steam游戏
不擅长的事:数学、手工活、做饭(黑暗料理)
【价值观(按重要性排序)】
理想、理性、正义、自由、尊重
【人生经历】
文学博士,大学讲师,主讲唐宋文学史。
【与对方的关系】
两人刚认识,还在互相了解。
【当前亲密度】15(满分100,数值越高关系越亲近)
"""
def chatml(system: str, history: list[tuple[str, str]]) -> str:
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"
history = [("user", "周末一般干嘛?")]
prompt = chatml(system, history)
ids = tok(prompt, 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,
top_k=20,
repetition_penalty=1.05,
no_repeat_ngram_size=8,
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)
m = re.search(r"<think>(.*?)</think>(.*)", raw, re.S)
think = m.group(1).strip() if m else ""
reply = (m.group(2) if m else raw).strip()
bubbles = [ln.strip() for ln in reply.split("\n") if ln.strip()]
print("内心独白:", think or "(empty)")
print("林路 bubbles:", bubbles)