Spaces:
Runtime error
Runtime error
| # app.py | |
| import gradio as gr | |
| from transformers import pipeline, set_seed | |
| import random | |
| # Загружаем модель для генерации текста (text-generation pipeline) | |
| # Выберите модель: | |
| # 'distilgpt2' - маленькая английская модель GPT-2 | |
| # 'sberbank-ai/rugpt3small_based_on_gpt2' - маленькая русская модель (может требовать больше ресурсов) | |
| # 'bigscience/bloomz-560m' - многоязычная модель поменьше (может быть медленной на CPU) | |
| # Попробуем с distilgpt2 для начала, т.к. она легче всего запустится на CPU | |
| # Если хотите русскую, раскомментируйте строку с 'sberbank-ai...' и закомментируйте distilgpt2 | |
| # generator = pipeline('text-generation', model='distilgpt2', max_new_tokens=50) # Ограничим длину генерации | |
| # generator = pipeline('text-generation', model='sberbank-ai/rugpt3small_based_on_gpt2', max_new_tokens=50) | |
| generator = pipeline('text-generation', model='distilgpt2', max_length=70, num_return_sequences=1, truncation=True) # Альтернативные параметры | |
| print("Модель загружена!") # Для отладки в логах | |
| # Установка зерна для воспроизводимости (опционально) | |
| # set_seed(random.randint(0, 10000)) # Используем случайное зерно для разнообразия | |
| # Функция, которая будет обрабатывать ввод пользователя и историю чата | |
| def respond(message, chat_history): | |
| """ | |
| Принимает сообщение пользователя и историю чата, возвращает ответ бота. | |
| """ | |
| print(f"Получено сообщение: {message}") | |
| print(f"История чата: {chat_history}") | |
| # Формируем промпт для модели (можно экспериментировать) | |
| # Вариант 1: Просто сообщение пользователя | |
| prompt = message | |
| # Вариант 2: Добавляем немного истории (простой) | |
| # history_text = "\n".join([f"User: {m}\nBot: {b}" for m, b in chat_history[-2:]]) # Последние 2 обмена | |
| # prompt = f"{history_text}\nUser: {message}\nBot:" | |
| try: | |
| # Генерируем ответ | |
| # Обратите внимание: 'text-generation' часто лучше работает, если ей дать начало фразы | |
| # Попробуем сделать так, чтобы она просто продолжила мысль или ответила. | |
| # Можно добавить "Ответ:", "Бот:", и т.п. в конец prompt, если модель так лучше реагирует. | |
| bot_response = generator(prompt)[0]['generated_text'] | |
| # Очистка ответа: убираем исходный промпт из сгенерированного текста | |
| # (pipeline часто возвращает промпт + генерацию) | |
| if bot_response.startswith(prompt): | |
| bot_response = bot_response[len(prompt):].strip() | |
| # Иногда модели могут генерировать пустые ответы или спецсимволы, добавим проверку | |
| if not bot_response or len(bot_response.strip()) == 0: | |
| bot_response = "... (модель не сгенерировала ответ)" | |
| print(f"Сгенерированный ответ: {bot_response}") | |
| except Exception as e: | |
| print(f"Ошибка при генерации: {e}") | |
| bot_response = f"Ой, произошла ошибка при генерации ответа: {e}" | |
| # Добавляем пару (сообщение пользователя, ответ бота) в историю | |
| chat_history.append((message, bot_response)) | |
| # Возвращаем пустую строку для очистки поля ввода и обновленную историю | |
| return "", chat_history | |
| # --- Создание интерфейса Gradio --- | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Простой Чат-Бот на Hugging Face") | |
| gr.Markdown("Введите ваше сообщение и нажмите Enter.") | |
| # Компонент чат-бота | |
| chatbot = gr.Chatbot(label="Диалог") | |
| # Поле ввода текста | |
| msg = gr.Textbox(label="Ваше сообщение", placeholder="Напишите что-нибудь...") | |
| # Кнопка очистки (опционально) | |
| clear = gr.Button("Очистить диалог") | |
| # Связываем компоненты: | |
| # Когда пользователь отправляет сообщение (нажатием Enter в Textbox или Button, если бы она была) | |
| # вызывается функция respond с текущим сообщением и историей чата. | |
| # Результат функции (пустая строка и новая история) обновляет Textbox (msg) и Chatbot (chatbot). | |
| msg.submit(respond, [msg, chatbot], [msg, chatbot]) | |
| # Связываем кнопку очистки | |
| clear.click(lambda: (None, None), None, [msg, chatbot], queue=False) | |
| # Запускаем демо | |
| # concurrency_count - сколько запросов может обрабатывать одновременно | |
| # share=True - если хотите получить временную публичную ссылку (не нужно для Spaces) | |
| demo.launch(debug=True) # Включаем debug для логов в интерфейсе Spaces | |
| # demo.launch(server_name="0.0.0.0", server_port=7860) # Для запуска на некоторых платформах |