Spaces:
Sleeping
Sleeping
| from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM | |
| import gradio as gr | |
| import torch | |
| class MultiPersonalityChatBot: | |
| def __init__(self): | |
| self.personalities = { | |
| "Гаргамель": { | |
| "model": "sberbank-ai/rugpt3large_based_on_gpt2", | |
| "prompt": "Гаргамель: Я великий волшебник! ", | |
| "temperature": 0.9 | |
| }, | |
| "Родя": { | |
| "model": "sberbank-ai/rugpt3large_based_on_gpt2", | |
| "prompt": "Родя: Привет, братан! ", | |
| "temperature": 0.8 | |
| }, | |
| "Ромчик": { | |
| "model": "sberbank-ai/rugpt3large_based_on_gpt2", | |
| "prompt": "Ромчик: Слушай, вот что я думаю... ", | |
| "temperature": 0.7 | |
| }, | |
| "Кузя": { | |
| "model": "RussianSuperGLUE/rugpt3large_based_on_gpt2", | |
| "prompt": "Кузя: Опа, народ! ", | |
| "temperature": 0.85 | |
| }, | |
| "Nekale": { | |
| "model": "sberbank-ai/rugpt3large_based_on_gpt2", | |
| "prompt": "Nekale: Йоу, всем салют! ", | |
| "temperature": 0.75 | |
| }, | |
| "Ваня Парилка": { | |
| "model": "RussianSuperGLUE/rugpt3large_based_on_gpt2", | |
| "prompt": "Ваня Парилка: Знаток бани и здоровья! ", | |
| "temperature": 0.6 | |
| } | |
| } | |
| self.current_personality = "Nekale" | |
| self.tokenizer = None | |
| self.model = None | |
| self.load_model(self.current_personality) | |
| def load_model(self, personality): | |
| if personality in self.personalities: | |
| model_name = self.personalities[personality]["model"] | |
| self.tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| self.model = AutoModelForCausalLM.from_pretrained(model_name) | |
| self.current_personality = personality | |
| return f"✅ Загружена личность: {personality}" | |
| return "❌ Ошибка загрузки личности" | |
| def generate_response(self, message, history): | |
| if not self.model or not self.tokenizer: | |
| return "❌ Сначала загрузите личность" | |
| personality_data = self.personalities[self.current_personality] | |
| prompt = f"{personality_data['prompt']}Вопрос: {message}\nОтвет:" | |
| inputs = self.tokenizer(prompt, return_tensors="pt", max_length=1024, truncation=True) | |
| with torch.no_grad(): | |
| outputs = self.model.generate( | |
| inputs.input_ids, | |
| max_length=inputs.input_ids.shape[1] + 150, | |
| num_return_sequences=1, | |
| temperature=personality_data['temperature'], | |
| do_sample=True, | |
| pad_token_id=self.tokenizer.eos_token_id, | |
| repetition_penalty=1.1, | |
| no_repeat_ngram_size=3 | |
| ) | |
| response = self.tokenizer.decode(outputs[0], skip_special_tokens=True) | |
| response = response.replace(prompt, "").strip() | |
| return response | |
| chatbot = MultiPersonalityChatBot() | |
| with gr.Blocks(title="Мульти-Персональный Чат-Бот", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🎭 Мульти-Персональный Чат-Бот") | |
| gr.Markdown("## Выберите персонажа и общайтесь!") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| personality = gr.Dropdown( | |
| choices=list(chatbot.personalities.keys()), | |
| label="Выберите персонажа", | |
| value="Nekale" | |
| ) | |
| load_btn = gr.Button("🎯 Активировать персонажа", variant="primary") | |
| status = gr.Textbox(label="Статус системы", interactive=False) | |
| gr.Markdown("### 🎪 Наши персонажи:") | |
| gr.Markdown(""" | |
| - **Гаргамель** - Великий волшебник | |
| - **Родя** - Братан для душевных бесед | |
| - **Ромчик** - Мудрый собеседник | |
| - **Кузя** - Душа компании | |
| - **Nekale** - Современный и стильный | |
| - **Ваня Парилка** - Эксперт по здоровью и бане | |
| """) | |
| with gr.Column(scale=2): | |
| chat_interface = gr.ChatInterface( | |
| fn=chatbot.generate_response, | |
| title="💬 Чат с персонажем", | |
| description="Начните общение с выбранным персонажем...", | |
| examples=[ | |
| "Расскажи о себе", | |
| "Что ты умеешь?", | |
| "Дай совет по здоровью" | |
| ] | |
| ) | |
| load_btn.click( | |
| fn=chatbot.load_model, | |
| inputs=personality, | |
| outputs=status | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=True | |
| ) |