import gradio as gr import os from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM import torch # Инициализация модели для русского языка model_name = "microsoft/DialoGPT-medium" # Можно заменить на sberbank-ai/rugpt3small_based_on_gpt2 # Загрузка модели и токенизатора try: tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) tokenizer.pad_token = tokenizer.eos_token except Exception as e: print(f"Ошибка загрузки модели: {e}") # Fallback на более простую модель model_name = "gpt2" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) # Системный промпт для образовательного чат-бота SYSTEM_PROMPT = """ Ты - образовательный помощник преподавателя университета. Твоя задача: - Помогать студентам с учебными вопросами - Объяснять сложные концепции простым языком - Давать конструктивные советы по обучению - Быть терпеливым и поддерживающим - Отвечать на русском языке Всегда: - Будь дружелюбным и профессиональным - Объясняй пошагово - Приводи примеры - Задавай уточняющие вопросы если нужно """ def format_prompt(message, history): """Форматирование промпта с учетом истории""" prompt = SYSTEM_PROMPT + "\n\n" # Добавляем историю разговора for user_msg, bot_msg in history: prompt += f"Студент: {user_msg}\nПреподаватель: {bot_msg}\n\n" prompt += f"Студент: {message}\nПреподаватель:" return prompt def generate_response(message, history, temperature=0.7, max_length=200): """Генерация ответа от модели""" try: # Форматируем промпт prompt = format_prompt(message, history) # Токенизируем inputs = tokenizer.encode(prompt, return_tensors="pt", max_length=1024, truncation=True) # Генерируем ответ with torch.no_grad(): outputs = model.generate( inputs, max_length=inputs.shape[1] + max_length, temperature=temperature, do_sample=True, pad_token_id=tokenizer.eos_token_id, no_repeat_ngram_size=2, top_p=0.9 ) # Декодируем ответ response = tokenizer.decode(outputs[0], skip_special_tokens=True) # Извлекаем только новую часть ответа response = response[len(prompt):].strip() # Очищаем ответ от лишних символов response = response.split("Студент:")[0].strip() if not response: response = "Извините, не могу сформулировать ответ. Попробуйте переформулировать вопрос." return response except Exception as e: return f"Произошла ошибка: {str(e)}. Попробуйте еще раз." def chat_function(message, history, temperature, max_length): """Основная функция чата""" if not message.strip(): return history, "" # Генерируем ответ response = generate_response(message, history, temperature, max_length) # Добавляем в историю history.append((message, response)) return history, "" # Создание интерфейса Gradio with gr.Blocks( title="Образовательный чат-бот", theme=gr.themes.Soft(primary_hue="blue"), css=""" .gradio-container { max-width: 800px !important; margin: auto !important; } """ ) as demo: gr.HTML("""
Ваш персональный помощник для обучения