File size: 5,553 Bytes
57645e8
66fabfa
f4f65e1
c43dd36
52af11a
6bbd70d
c43dd36
66fabfa
6bbd70d
c43dd36
 
 
6bbd70d
 
c43dd36
6bbd70d
ead8089
6bbd70d
 
ead8089
 
 
6bbd70d
ead8089
 
6bbd70d
c43dd36
ead8089
c43dd36
 
 
6bbd70d
c43dd36
ead8089
6bbd70d
ead8089
c43dd36
 
 
6bbd70d
c43dd36
ead8089
6bbd70d
 
 
 
 
 
 
 
 
ead8089
 
 
 
ff077e4
66fabfa
ead8089
f5f461a
6bbd70d
 
 
 
 
ead8089
f5f461a
ead8089
f5f461a
6bbd70d
 
 
 
 
ead8089
 
 
6bbd70d
ead8089
6bbd70d
ead8089
f5f461a
 
10035b7
6bbd70d
 
 
10035b7
 
6bbd70d
 
 
66fabfa
 
c43dd36
60a6dd5
6bbd70d
 
 
f5f461a
6bbd70d
 
 
f5f461a
10035b7
6bbd70d
 
f5f461a
6bbd70d
 
 
f5f461a
ead8089
f5f461a
 
6bbd70d
f5f461a
a4bd38b
6bbd70d
f79a4e6
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
114
115
116
117
118
119
120
import gradio as gr
import time
from transformers import pipeline
from datasets import load_dataset

# Загружаем банковский датасет
dataset = load_dataset("Romjiik/Russian_bank_reviews", split="train")

# Примеры для few-shot
few_shot_examples = []
for row in dataset.select(range(2)):
    review = row["review"]
    example = f"Клиент: {review}\nКлассификация: прочее"
    few_shot_examples.append(example)

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

simple_instruction = (
    "Ты — банковский помощник. Классифицируй обращение клиента одним словом — категорией."
)

# Промпты

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"
        f"Рассуждение:"
    )


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"
        f"Категория:"
    )

# Рабочие модели с поддержкой русского языка и легкие
models = {
    "ChatGPT-like (FRED-T5-small)": pipeline("text2text-generation", model="cointegrated/translation-t5-russian-finetuned", tokenizer="cointegrated/translation-t5-russian-finetuned", device=-1),
    "DeepSeek-like (ruGPT3-small)": pipeline("text-generation", model="ai-forever/rugpt3small_based_on_gpt2", tokenizer="ai-forever/rugpt3small_based_on_gpt2", device=-1),
    "GigaChat-like (RuBERT-tiny2)": pipeline("text-classification", model="cointegrated/rubert-tiny2", tokenizer="cointegrated/rubert-tiny2", device=-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()
        try:
            out_cot = pipe(prompt_cot, max_new_tokens=150, do_sample=True, top_p=0.9, temperature=0.7)[0]
            answer_cot = out_cot.get("generated_text", out_cot.get("label", "-"))
        except:
            answer_cot = "Ошибка в CoT"
        end_cot = round(time.time() - start_cot, 2)

        # Simple
        start_simple = time.time()
        try:
            out_simple = pipe(prompt_simple, max_new_tokens=150, do_sample=True, top_p=0.9, temperature=0.7)[0]
            answer_simple = out_simple.get("generated_text", out_simple.get("label", "-"))
        except:
            answer_simple = "Ошибка в обычном"
        end_simple = round(time.time() - start_simple, 2)

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

    return (
        results["ChatGPT-like (FRED-T5-small)"]["cot_answer"], f"{results['ChatGPT-like (FRED-T5-small)']['cot_time']} сек",
        results["ChatGPT-like (FRED-T5-small)"]["simple_answer"], f"{results['ChatGPT-like (FRED-T5-small)']['simple_time']} сек",

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

        results["GigaChat-like (RuBERT-tiny2)"]["cot_answer"], f"{results['GigaChat-like (RuBERT-tiny2)']['cot_time']} сек",
        results["GigaChat-like (RuBERT-tiny2)"]["simple_answer"], f"{results['GigaChat-like (RuBERT-tiny2)']['simple_time']} сек",
    )

# Интерфейс Gradio
with gr.Blocks() as demo:
    gr.Markdown("## 🤖 Классификация клиентских обращений — CoT vs обычный промпт")
    inp = gr.Textbox(label="Обращение клиента", placeholder="Например: Я не могу войти в личный кабинет", lines=2)
    btn = gr.Button("Классифицировать")

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

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

    gr.Markdown("### GigaChat-like (RuBERT-tiny2)")
    cot3, cot3_time = gr.Textbox(label="CoT ответ"), gr.Textbox(label="Время CoT")
    simple3, simple3_time = gr.Textbox(label="Обычный ответ"), 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,
    ])

if __name__ == '__main__':
    demo.launch()