File size: 6,062 Bytes
f35bde9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# 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) # Для запуска на некоторых платформах