# 依赖：pip install transformers peft torch pandas scikit-learn
import pandas as pd, numpy as np, torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
from sklearn.metrics import accuracy_score, f1_score, classification_report

BASE = "./Qwen2.5-1.5B"
ADAPTER = "/root/autodl-tmp/output/sft_qwen_lora"  # 或最新 checkpoint 目录
# ADAPTER = "/root/autodl-tmp/output/sft_qwen_full"  # 或最新 checkpoint 目录

tokenizer = AutoTokenizer.from_pretrained(ADAPTER, trust_remote_code=True)
base = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True)
model = PeftModel.from_pretrained(base, ADAPTER).to(base.device)

df = pd.read_csv("sst2_validation.csv")
texts, labels = df["text"].tolist(), df["label"].tolist()
preds=[]
for t in texts:
    prompt = "<|im_start|>user\n请判断以下电影评论的情感倾向，只回答'正面'或'负面'：\n\n" + f"评论：{t}\n情感：<|im_end|>\n<|im_start|>assistant\n"
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    with torch.no_grad():
        out = model.generate(**inputs, max_new_tokens=6, do_sample=False, pad_token_id=tokenizer.eos_token_id)
    resp = tokenizer.decode(out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True).strip()
    preds.append(1 if "正面" in resp else 0 if "负面" in resp else np.random.randint(0,2))

acc = accuracy_score(labels, preds); f1 = f1_score(labels, preds)
rep = classification_report(labels, preds, target_names=["负面","正面"], output_dict=True)
print(f"准确率: {acc:.3f}  F1: {f1:.3f}  精确率(正面): {rep['正面']['precision']:.3f}  召回率(正面): {rep['正面']['recall']:.3f}")
