File size: 5,888 Bytes
57645e8
66fabfa
f4f65e1
4fb6307
1267d48
cafcd4f
 
 
 
 
e66857b
cafcd4f
f5f461a
cafcd4f
 
 
39ebd04
66fabfa
f5f461a
cafcd4f
f5f461a
 
 
4fb6307
 
 
 
 
66fabfa
cafcd4f
f5f461a
 
cafcd4f
f5f461a
 
4fb6307
cafcd4f
66fabfa
cafcd4f
 
 
 
 
 
079a9a0
cafcd4f
f5f461a
66fabfa
f5f461a
 
 
66fabfa
cafcd4f
f5f461a
cafcd4f
f5f461a
cafcd4f
f5f461a
cafcd4f
f5f461a
cafcd4f
f5f461a
cafcd4f
f5f461a
 
 
 
 
 
 
 
66fabfa
f5f461a
 
 
 
 
 
66fabfa
 
4fb6307
1267d48
cafcd4f
f5f461a
cafcd4f
f5f461a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4bd38b
cafcd4f
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import gradio as gr
import time
from transformers import pipeline
from datasets import load_dataset

# Примеры вручную — заменяют шумные выборки из датасета
few_shot_examples = [
    "Клиент: Я не могу войти в личный кабинет\nОтвет: Пожалуйста, проверьте правильность логина и пароля. Если проблема сохраняется — воспользуйтесь восстановлением доступа или обратитесь в поддержку.",
    "Клиент: Мне пришло смс о входе, которого я не совершал\nОтвет: Это может быть попытка входа третьего лица. Рекомендуем срочно сменить пароль и обратиться в службу поддержки банка."
]

# Инструкции
cot_instruction = (
    "Ты — вежливый банковский ассистент. Клиент описывает проблему. "
    "Твоя задача — сначала шаг за шагом проанализировать суть запроса, а затем дать полезный и точный ответ. "
    "Если информации недостаточно — запроси уточнение. Не выдумывай факты."
)

simple_instruction = (
    "Ты — банковский помощник. Отвечай кратко и понятно. Не используй лишние детали."
)

# Модели
models = {
    "ruDialoGPT-small": pipeline("text-generation", model="t-bank-ai/ruDialoGPT-small", tokenizer="t-bank-ai/ruDialoGPT-small", device=-1),
    "ruDialoGPT-medium": pipeline("text-generation", model="t-bank-ai/ruDialoGPT-medium", tokenizer="t-bank-ai/ruDialoGPT-medium", device=-1),
    "ruGPT3-small": pipeline("text-generation", model="ai-forever/rugpt3small_based_on_gpt2", tokenizer="ai-forever/rugpt3small_based_on_gpt2", device=-1),
}

# Формирование промптов
def build_cot_prompt(user_input):
    examples = "\n\n".join(few_shot_examples)
    return f"{cot_instruction}\n\n{examples}\n\nКлиент: {user_input}\nРассуждение и ответ:"

def build_simple_prompt(user_input):
    examples = "\n\n".join(few_shot_examples)
    return f"{simple_instruction}\n\n{examples}\n\nКлиент: {user_input}\nОтвет:"

# Функция извлечения финального ответа
def extract_final_answer(generated_text):
    for line in generated_text.split('\n'):
        if "Ответ:" in line:
            return line.split("Ответ:")[-1].strip()
    return generated_text.strip().split('\n')[-1]

# Генерация по обоим промптам
def generate_dual_answers(user_input):
    results = {}
    prompt_cot = build_cot_prompt(user_input)
    prompt_simple = build_simple_prompt(user_input)

    for name, pipe in models.items():
        # CoT ответ
        start_cot = time.time()
        out_cot = pipe(prompt_cot, max_new_tokens=80, do_sample=True, top_p=0.9, temperature=0.7)[0]["generated_text"]
        end_cot = round(time.time() - start_cot, 2)
        answer_cot = extract_final_answer(out_cot)

        # Обычный ответ
        start_simple = time.time()
        out_simple = pipe(prompt_simple, max_new_tokens=80, do_sample=True, top_p=0.9, temperature=0.7)[0]["generated_text"]
        end_simple = round(time.time() - start_simple, 2)
        answer_simple = extract_final_answer(out_simple)

        results[name] = {
            "cot_answer": answer_cot,
            "cot_time": end_cot,
            "simple_answer": answer_simple,
            "simple_time": end_simple
        }

    return (
        results["ruDialoGPT-small"]["cot_answer"], f"{results['ruDialoGPT-small']['cot_time']} сек",
        results["ruDialoGPT-small"]["simple_answer"], f"{results['ruDialoGPT-small']['simple_time']} сек",
        results["ruDialoGPT-medium"]["cot_answer"], f"{results['ruDialoGPT-medium']['cot_time']} сек",
        results["ruDialoGPT-medium"]["simple_answer"], f"{results['ruDialoGPT-medium']['simple_time']} сек",
        results["ruGPT3-small"]["cot_answer"], f"{results['ruGPT3-small']['cot_time']} сек",
        results["ruGPT3-small"]["simple_answer"], f"{results['ruGPT3-small']['simple_time']} сек",
    )

# Интерфейс Gradio
with gr.Blocks() as demo:
    gr.Markdown("## 🏦 Банковский помощник: сравнение CoT и обычного ответа")

    inp = gr.Textbox(label="Вопрос клиента", placeholder="Например: Как перевести деньги на другую карту?", lines=2)
    btn = gr.Button("Сгенерировать")

    gr.Markdown("### ruDialoGPT-small")
    cot1 = gr.Textbox(label="CoT ответ")
    cot1_time = gr.Textbox(label="Время CoT")
    simple1 = gr.Textbox(label="Обычный ответ")
    simple1_time = gr.Textbox(label="Время обычного")

    gr.Markdown("### ruDialoGPT-medium")
    cot2 = gr.Textbox(label="CoT ответ")
    cot2_time = gr.Textbox(label="Время CoT")
    simple2 = gr.Textbox(label="Обычный ответ")
    simple2_time = gr.Textbox(label="Время обычного")

    gr.Markdown("### ruGPT3-small")
    cot3 = gr.Textbox(label="CoT ответ")
    cot3_time = gr.Textbox(label="Время CoT")
    simple3 = gr.Textbox(label="Обычный ответ")
    simple3_time = gr.Textbox(label="Время обычного")

    btn.click(generate_dual_answers, inputs=[inp], outputs=[
        cot1, cot1_time, simple1, simple1_time,
        cot2, cot2_time, simple2, simple2_time,
        cot3, cot3_time, simple3, simple3_time
    ])

demo.launch()