File size: 2,645 Bytes
79e0487
2994d05
 
503a54f
79e0487
2994d05
79e0487
2994d05
 
79e0487
2994d05
79e0487
ec0f578
 
 
 
659c2b5
79e0487
ec0f578
2a5d2ae
ec0f578
2a5d2ae
 
ec0f578
 
 
 
 
 
 
79e0487
 
 
 
 
659c2b5
79e0487
 
 
 
 
 
 
 
ec0f578
2e9f466
79e0487
503a54f
ec0f578
2e9f466
 
 
ec0f578
2e9f466
79e0487
1bd2ce9
2e9f466
 
 
 
2a5d2ae
1bd2ce9
2e9f466
79e0487
 
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
import gradio as gr
import spaces
from transformers import AutoTokenizer, AutoModelForCausalLM
import re

# Название модели
model_name = "t-bank-ai/ruDialoGPT-medium"

# Загрузка токенизатора и модели
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# Инициализация истории диалога
chat_history = []

# Функция генерации с историей
@spaces.GPU(duration=60)  # Декоратор ZeroGPU для выделения GPU на 60 секунд
def generate_response(prompt):
    global chat_history
    # Формирование контекста с предыдущими сообщениями
    dialogue_context = ""
    for i, (sender, message) in enumerate(chat_history[-6:]):  # Берем последние 6 реплик для контекста
        prefix = "@@ПЕРВЫЙ@@" if sender == "Ты" else "@@ВТОРОЙ@@"
        dialogue_context += f"{prefix} {message} "

    # Добавляем текущий запрос с меткой
    dialogue_context += f"@@ПЕРВЫЙ@@ {prompt} @@ВТОРОЙ@@"

    # Преобразуем в тензор и отправляем в модель
    inputs = tokenizer(dialogue_context, return_tensors="pt")
    generated_token_ids = model.generate(
        **inputs,
        top_k=10,
        top_p=0.95,
        num_beams=3,
        num_return_sequences=1,
        do_sample=True,
        no_repeat_ngram_size=2,
        temperature=1.2,
        repetition_penalty=1.2,
        length_penalty=1.0,
        eos_token_id=50257,
        max_new_tokens=40
    )

    # Декодируем и очищаем ответ от тегов
    response = tokenizer.decode(generated_token_ids[0], skip_special_tokens=True)
    cleaned_response = re.sub(r'@@ПЕРВЫЙ@@|@@ВТОРОЙ@@', '', response).strip()

    # Добавляем текущий запрос и ответ в историю для отображения в чате
    chat_history.append(("Ты", prompt))  # Реплика пользователя
    chat_history.append(("Бот", cleaned_response))  # Ответ бота

    return chat_history

# Интерфейс Gradio с отключённым live-режимом (будет кнопка отправки)
iface = gr.Interface(
    fn=generate_response, 
    inputs="text", 
    outputs="chatbot",  # Вывод в виде чата
    title="ruDialoGPT Chatbot с Историей",
    live=False  # Отключаем live-режим для кнопки отправки
)

iface.launch()