import gradio as gr import torch from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel # Model yükleme print("🔍 Model yükleniyor....") base_model_name = "vngrs-ai/Kumru-2B-Base" adapter_path = "ademireltaz/kumru-tr-poetry-lora" # Tokenizer - use_fast=False ile yükle tokenizer = AutoTokenizer.from_pretrained( base_model_name, use_fast=False, trust_remote_code=True ) # Pad token ayarla if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained( base_model_name, torch_dtype=torch.float16, low_cpu_mem_usage=True, device_map="auto", trust_remote_code=True ) model = PeftModel.from_pretrained(model, adapter_path) model.eval() print("✅ Model hazır!") def chat_generate(message, history, temperature, max_length): """Chatbot formatında şiir üret""" # Şiir dışı istekleri kontrol et non_poetry_keywords = [ 'hesapla', 'çarp', 'böl', 'topla', 'çıkar', 'matematik', 'kod yaz', 'program', 'script', 'function', 'tarif', 'yemek', 'nasıl yapılır', 'hava durumu', 'saat kaç', 'tarih', 'çevir', 'translate', 'İngilizce', 'anlat', 'açıkla', 'nedir', 'kimdir', 'hikaye', 'makale', 'yazı yaz', 'kompozisyon', 'özet', 'özetle', 'summarize' ] message_lower = message.lower() # Şiir anahtar kelimeleri poetry_keywords = ['şiir', 'mısra', 'beyit', 'kıta', 'dizeleri', 'nazım'] # Şiir isteği içerip içermediğini kontrol et has_poetry_keyword = any(keyword in message_lower for keyword in poetry_keywords) has_non_poetry_keyword = any(keyword in message_lower for keyword in non_poetry_keywords) # Eğer açıkça şiir dışı bir şey isteniyorsa reddet if has_non_poetry_keyword and not has_poetry_keyword: return "Üzgünüm, ben sadece şiir üretmek için eğitilmiş bir modelim. Lütfen bana bir şiir konusu verin, sizin için şiir yazayım. 🌸" # Mesaj çok kısa ve genel ise (örn: "merhaba", "nasılsın") if len(message.split()) <= 3 and not has_poetry_keyword: # Basit sohbet tespiti greeting_words = ['merhaba', 'selam', 'hey', 'nasılsın', 'naber', 'günaydın', 'iyi akşamlar'] if any(word in message_lower for word in greeting_words): return "Merhaba! Ben bir şiir üretme modeliyim. Bana bir konu verin, sizin için şiir yazayım. Örneğin: 'Aşk hakkında bir şiir yaz' veya 'Sonbahar temalı şiir' 🍂" # Şiir üretimi için prompt hazırla prompt = f"Görev: {message}\nYanıt:" inputs = tokenizer( prompt, return_tensors="pt", return_token_type_ids=False, padding=True ).to(model.device) with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=int(max_length), do_sample=True, temperature=float(temperature), top_p=0.92, repetition_penalty=1.1, pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id, ) full_text = tokenizer.decode(outputs[0], skip_special_tokens=True) if "Yanıt:" in full_text: poem = full_text.split("Yanıt:", 1)[1].strip() else: poem = full_text.replace(prompt, "").strip() # Üretilen içeriğin şiir olup olmadığını basit kontrol if len(poem.split()) < 10: # Çok kısa ise return "Üzgünüm, sadece şiir üretebilirim. Lütfen bana bir şiir konusu belirtin. 📝" return poem # Chatbot arayüzü - examples formatı düzeltildi demo = gr.ChatInterface( fn=chat_generate, title="🎭 Kumru ile Taz Şiir Botu", description=""" Türkçe şiir üretmek için tasarlanmış bir chat bot. **Nasıl kullanılır:** - Bir şair tarzı ve tema belirtin - Örnek: "Nazım Hikmet tarzında, deniz üzerine bir şiir yaz" **Desteklenen şairler:** - Nazım Hikmet - Aşık Veysel - Orhan Veli - Fazıl Hüsnü Dağlarca - Cahit Sıtkı Tarancı gibi üstadlar """, # ✅ Examples düzeltildi: [mesaj, temperature, max_length] examples=[ ["Nazım Hikmet tarzında, deniz üzerine duygusal bir şiir yaz.", 0.85, 256], ["Aşık Veysel tarzında, yol temasıyla bir şiir yaz.", 0.85, 256], ["Orhan Veli tarzında, İstanbul sokaklarını anlatan bir şiir yaz.", 0.85, 256], ["Fazıl Hüsnü Dağlarca tarzında, barış üzerine bir şiir yaz.", 0.85, 256], ["Cahit Sıtkı Tarancı tarzında, sonbahar üzerine melankolik bir şiir yaz.", 0.85, 256], ], additional_inputs=[ gr.Slider(0.1, 2.0, 0.85, step=0.05, label="🌡️ Temperature (yaratıcılık)"), gr.Slider(100, 512, 256, step=16, label="📏 Maksimum uzunluk"), ], theme=gr.themes.Soft(), ) if __name__ == "__main__": demo.launch()