| """ |
| TFMF 官方 Qwen3.5-4B 模型探针脚本 - 使用 enable_thinking=False 关闭 CoT |
| """ |
|
|
| import json |
| import time |
| import torch |
| import re |
| from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer |
|
|
| |
| MODEL_PATH = "/data/coding/TFMF" |
| DATA_PATH = "/data/coding/TFMF/语文教师_语文_高二_v1.jsonl" |
| MAX_NEW_TOKENS = 512 |
| TEMPERATURE = 0.7 |
| TOP_P = 0.9 |
|
|
| |
| print("=" * 60) |
| print("开始加载官方 Qwen3.5-4B 模型...") |
|
|
| tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True) |
| if tokenizer.pad_token is None: |
| tokenizer.pad_token = tokenizer.eos_token |
|
|
| model = AutoModelForCausalLM.from_pretrained( |
| MODEL_PATH, |
| device_map="cuda", |
| torch_dtype=torch.bfloat16, |
| trust_remote_code=True, |
| low_cpu_mem_usage=True, |
| ) |
| model.eval() |
|
|
| print(f"模型加载完成! 显存占用: {torch.cuda.memory_allocated() / 1024**3:.2f} GB") |
| print("=" * 60) |
|
|
| |
| test_samples = [] |
| try: |
| with open(DATA_PATH, "r", encoding="utf-8") as f: |
| for i, line in enumerate(f): |
| if i >= 3: |
| break |
| if line.strip(): |
| test_samples.append(json.loads(line)) |
| print(f"\n成功加载 {len(test_samples)} 条测试样本") |
| except FileNotFoundError: |
| print(f"\n警告: 未找到数据文件 {DATA_PATH}") |
| test_samples = [{ |
| "system": "你是一位高中语文教师,教学风格直白浅近。", |
| "user": "老师,什么是归谬法?", |
| "assistant": "归谬法就是先假设对方的观点正确,然后推导出荒谬结论。" |
| }] |
|
|
| print("-" * 60) |
|
|
| |
| def generate_response(system_prompt, user_query, stream=False): |
| """ |
| 生成回答,通过 enable_thinking=False 关闭 CoT |
| """ |
| messages = [ |
| {"role": "system", "content": system_prompt}, |
| {"role": "user", "content": user_query}, |
| ] |
| |
| |
| prompt = tokenizer.apply_chat_template( |
| messages, |
| tokenize=False, |
| add_generation_prompt=True, |
| enable_thinking=False, |
| ) |
| |
| inputs = tokenizer(prompt, return_tensors="pt").to(model.device) |
| |
| streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) if stream else None |
| |
| print(f"\n【生成中...】") |
| start_time = time.time() |
| |
| with torch.no_grad(): |
| outputs = model.generate( |
| **inputs, |
| max_new_tokens=MAX_NEW_TOKENS, |
| temperature=TEMPERATURE, |
| top_p=TOP_P, |
| do_sample=True, |
| use_cache=True, |
| pad_token_id=tokenizer.eos_token_id, |
| eos_token_id=tokenizer.eos_token_id, |
| repetition_penalty=1.1, |
| streamer=streamer, |
| ) |
| |
| elapsed = time.time() - start_time |
| |
| full_response = tokenizer.decode( |
| outputs[0][inputs['input_ids'].shape[1]:], |
| skip_special_tokens=True |
| ) |
| |
| |
| full_response = re.sub(r'<think>.*?</think>', '', full_response, flags=re.DOTALL).strip() |
| |
| return full_response, elapsed |
|
|
| |
| print("\n开始推理测试...") |
| print("=" * 60) |
|
|
| for idx, sample in enumerate(test_samples, 1): |
| system = sample.get("system", "") |
| user = sample.get("user", "") |
| ground_truth = sample.get("assistant", "") |
| |
| print(f"\n【测试 {idx}】") |
| print(f"用户问题: {user}") |
| |
| response, elapsed = generate_response(system, user, stream=False) |
| |
| print(f"\n【模型回答】(耗时 {elapsed:.2f}秒)") |
| print(response if response else "(模型未生成有效回答)") |
| |
| print(f"\n【教师参考答案】") |
| print(ground_truth[:300] + "..." if len(ground_truth) > 300 else ground_truth) |
| print("-" * 60) |
|
|
| print("\n" + "=" * 60) |
| print("【探针完成】") |
| print(f"模型: Qwen3.5-4B (官方标准版)") |
| print(f"精度: bfloat16") |
| print(f"显存占用: {torch.cuda.memory_allocated() / 1024**3:.2f} GB") |
| print("=" * 60) |