Views
No views yet
unsloth/qwen2.5-7b-instruct-unsloth-bnb-4bitpip install torch transformers peft bitsandbytes accelerate1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
3from peft import PeftModel
4
5# Загрузка модели
6bnb_config = BitsAndBytesConfig(
7 load_in_4bit=True,
8 bnb_4bit_use_double_quant=True,
9 bnb_4bit_quant_type="nf4",
10 bnb_4bit_compute_dtype=torch.bfloat16,
11)
12
13tokenizer = AutoTokenizer.from_pretrained(
14 "unsloth/qwen2.5-7b-instruct-unsloth-bnb-4bit",
15 trust_remote_code=True,
16)
17
18model = AutoModelForCausalLM.from_pretrained(
19 "unsloth/qwen2.5-7b-instruct-unsloth-bnb-4bit",
20 device_map="auto",
21 quantization_config=bnb_config,
22 trust_remote_code=True,
23)
24
25# Загрузка LoRA адаптера
26model = PeftModel.from_pretrained(model, "Muzurixkurumi/amalia-qwen2.5-7b-lora")
27model = model.merge_and_unload()
28model.eval()
29
30# Загрузка конфигурации
31import json
32with open("inference_config.json", "r", encoding="utf-8") as f:
33 config = json.load(f)
34
35SYSTEM_PROMPT = config["system_prompt"]
36FEW_SHOT_EXAMPLES = config["few_shot_examples"]
37MAX_HISTORY_PAIRS = config["inference_config"]["max_history_pairs"]
38gen_params = config["generation_config"]
39
40# Генерация ответа
41conversation_history = [] # [(user_msg, assistant_msg), ...]
42
43def generate_response(user_message):
44 # Формируем промпт
45 messages = [{"role": "system", "content": SYSTEM_PROMPT}]
46
47 # Few-shot примеры
48 for example in FEW_SHOT_EXAMPLES:
49 messages.append({"role": "user", "content": example["user"]})
50 messages.append({"role": "assistant", "content": example["assistant"]})
51
52 # Rolling window истории (КРИТИЧНО!)
53 for user_msg, assistant_msg in conversation_history[-MAX_HISTORY_PAIRS:]:
54 messages.append({"role": "user", "content": user_msg})
55 messages.append({"role": "assistant", "content": assistant_msg})
56
57 # Текущий запрос
58 messages.append({"role": "user", "content": user_message})
59
60 prompt = tokenizer.apply_chat_template(
61 messages,
62 tokenize=False,
63 add_generation_prompt=True,
64 )
65
66 inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
67
68 with torch.no_grad():
69 outputs = model.generate(
70 **inputs,
71 max_new_tokens=gen_params["max_new_tokens"],
72 temperature=gen_params["temperature"],
73 top_p=gen_params["top_p"],
74 top_k=gen_params["top_k"],
75 do_sample=gen_params["do_sample"],
76 pad_token_id=tokenizer.pad_token_id,
77 eos_token_id=tokenizer.eos_token_id,
78 )
79
80 response = tokenizer.decode(
81 outputs[0][inputs["input_ids"].shape[1]:],
82 skip_special_tokens=True
83 ).strip()
84
85 # Сохраняем в историю
86 conversation_history.append((user_message, response))
87
88 return response
89
90# Пример использования
91print(generate_response("привет амалия!"))
92# Output: йо
93
94print(generate_response("как дела?"))
95# Output: норм, а у тебя?max_history_pairs=5)!1temperature = 0.7
2top_p = 0.9
3top_k = 50 # НЕ УВЕЛИЧИВАТЬ! >50 → риск китайского
4max_new_tokens = 120temperature > 0.8 (китайский + артефакты)top_k > 50 (китайский появляется раньше)