import gradio as gr import torch import os import re from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from peft import PeftModel # --- 1. Модельді Жүктеу Параметрлері --- TUNED_MODEL_PATH = "./qwen_kz_books_tuned" BASE_MODEL_ID = "Qwen/Qwen1.5-0.5B-Chat" MODEL_KZ_NAME = "Қазақ Кітаптары AI (Оқытылған)" MODEL_BASE_NAME = "Qwen 1.5-0.5B Chat (Базалық)" # --- 2. Модельді Жүктеу Функциясы --- def load_model(): """Оқытылған немесе базалық Qwen 0.5B моделін CPU-да жүктейді""" print("🔥 Модельді жүктеу басталды. CPU режимі...") try: if os.path.exists(TUNED_MODEL_PATH): print(f"✅ Оқытылған модель табылды: {TUNED_MODEL_PATH}") tokenizer = AutoTokenizer.from_pretrained(TUNED_MODEL_PATH) base_model = AutoModelForCausalLM.from_pretrained( BASE_MODEL_ID, torch_dtype=torch.float32, device_map="cpu", trust_remote_code=True ) model = PeftModel.from_pretrained(base_model, TUNED_MODEL_PATH) model_name = MODEL_KZ_NAME else: print(f"⚠️ Оқытылған модель табылмады. Базалық {BASE_MODEL_ID} жүктелуде.") tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_ID) model = AutoModelForCausalLM.from_pretrained( BASE_MODEL_ID, torch_dtype=torch.float32, device_map="cpu", trust_remote_code=True ) model_name = MODEL_BASE_NAME except Exception as e: print(f"❌ Модельді жүктеу кезінде қате: {e}") return None, None, f"Қате: {e}" print(f"✅ Модель сәтті жүктелді: {model_name}") return model, tokenizer, model_name # Глобальды айнымалыларды жүктеу model, tokenizer, model_status = load_model() # --- 3. Генерация Процесі (AI Қозғалтқышы) --- def generate_content(prompt): """Модельге сұрақ жібереді және нәтижесін алады.""" if model is None: return "Модель жүктелмеді. Қателерді консольден тексеріңіз.", "Қате" # Prompt-ты Qwen-нің чат үлгісіне бейімдеу formatted_prompt = f"Сіз қазақ әдебиеті бойынша білімді чатботсыз. Жауапты толық және Қазақша беріңіз. Сұрақ: {prompt}" # Qwen моделінің чат үлгісін қолдану messages = [ {"role": "user", "content": formatted_prompt} ] input_text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) # Токенизация input_ids = tokenizer(input_text, return_tensors="pt", padding=True).to(model.device) # Генерациялау параметрлері outputs = model.generate( **input_ids, max_new_tokens=512, temperature=0.7, do_sample=True, top_k=50, top_p=0.95, pad_token_id=tokenizer.eos_token_id ) # Нәтижені декодтау generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) # Qwen үлгісіндегі prompt-ты кесіп тастау response_start = generated_text.rfind(messages[-1]['content']) + len(messages[-1]['content']) generated_text = generated_text[response_start:].strip() # Таза мәтінді қайтару result_text = f"## 📚 Қазақша Жауап\n\n{generated_text}" return result_text, f"Генерация сәтті аяқталды. Қолданылған модель: {model_status}" # --- 4. Gradio Интерфейсі --- with gr.Blocks(title="Қазақ Кітаптары Чатботы (Qwen AI)") as demo: gr.HTML(f"""

📖 ҚАЗАҚ КІТАПТАРЫ ТУРАЛЫ ЧАТБОТ 🇰🇿

Бұл AI тек сен оқытқан кітаптар бойынша (Абай жолы, Көшпенділер, Қан мен Тер, т.б.) әңгімелесе алады.

Модель Статусы: {model_status}

""") with gr.Row(): with gr.Column(scale=1): input_prompt = gr.Textbox( label="AI-мен әңгімелесуді бастаңыз", placeholder="Мысалы: 'Абай жолындағы басты кейіпкерлерді атаңыз' немесе 'Мұхтар Әуезовтің бұл романының тарихи маңызы қандай?'", lines=5 ) generate_btn = gr.Button("💬 Сұрақ Жіберу") with gr.Column(scale=2): output_text = gr.Markdown( label="AI Жауабы" ) status_message = gr.Textbox( label="Процесс Статусы", interactive=False ) generate_btn.click( fn=generate_content, inputs=[input_prompt], outputs=[output_text, status_message] ) if __name__ == "__main__": demo.launch()