File size: 6,553 Bytes
57645e8
66fabfa
f4f65e1
c43dd36
52af11a
8519047
22c5acd
34db0e6
607079d
 
 
 
 
 
 
34db0e6
 
ead8089
324dafa
 
 
 
ead8089
 
 
324dafa
 
 
 
ead8089
 
607079d
 
 
 
 
 
 
 
 
ead8089
c43dd36
607079d
 
 
ead8089
 
c43dd36
607079d
324dafa
607079d
ead8089
22c5acd
34db0e6
ead8089
 
 
 
ff077e4
66fabfa
607079d
 
22c5acd
607079d
22c5acd
 
607079d
 
 
 
22c5acd
 
607079d
34db0e6
607079d
34db0e6
607079d
f5f461a
607079d
34db0e6
607079d
34db0e6
607079d
34db0e6
22c5acd
607079d
 
 
 
22c5acd
34db0e6
22c5acd
607079d
 
 
 
 
 
66fabfa
 
607079d
60a6dd5
324dafa
607079d
324dafa
 
607079d
 
 
 
 
d143975
324dafa
607079d
 
 
 
d143975
324dafa
607079d
 
 
 
d143975
324dafa
22c5acd
 
 
 
 
 
34db0e6
 
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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(3)):
    review = row["review"]
    category = row["category"] if "category" in row else "(Категория)"
    ex = f"Клиент: {review}\nКлассификация: {category}"
    few_shot_examples.append(ex)

# Инструкции
cot_instruction = (
    "Ты — сотрудник службы безопасности банка. Проанализируй обращение по шагам:\n"
        "1) Определи суть обращения.\n"
        "2) Укажи, есть ли признаки мошенничества (например: звонки, переводы, ссылки, давление).\n"
        "3) Сделай вывод: 'Мошенничество' или 'Не является мошенничеством'.\n\n"
)

simple_instruction = (
     "Ты — сотрудник службы безопасности банка. Проанализируй обращение по шагам:\n"
        "1) Определи суть обращения.\n"
        "2) Укажи, есть ли признаки мошенничества (например: звонки, переводы, ссылки, давление).\n"
        "3) Сделай вывод: 'Мошенничество' или 'Не является мошенничеством'.\n\n"
)

# Используемые модели
models = {
    "ChatGPT-like (ruGPT3small)": pipeline("text-generation", model="ai-forever/rugpt3small_based_on_gpt2", tokenizer="ai-forever/rugpt3small_based_on_gpt2", device=-1),
    "GigaChat-like (ruDialoGPT-medium)": pipeline("text-generation", model="tinkoff-ai/ruDialoGPT-medium", tokenizer="tinkoff-ai/ruDialoGPT-medium", device=-1),
    "DeepSeek-like (RuBERT-tiny2)": pipeline("text-classification", model="cointegrated/rubert-tiny2", tokenizer="cointegrated/rubert-tiny2", 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}\Анализ:"
    )

# Генерация ответов

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():
        if name.startswith("DeepSeek"):
            # классификация
            start = time.time()
            output = pipe(user_input)[0]
            end = round(time.time() - start, 2)
            results[name] = {
                "cot_answer": output['label'],
                "cot_time": end,
                "simple_answer": output['label'],
                "simple_time": end
            }
        else:
            # генерация CoT
            start_cot = time.time()
            out_cot = pipe(prompt_cot, max_new_tokens=100, do_sample=True, top_p=0.9, temperature=0.7)[0]["generated_text"]
            end_cot = round(time.time() - start_cot, 2)
            answer_cot = out_cot.split("Классификация:")[-1].strip()

            # генерация Simple
            start_simple = time.time()
            out_simple = pipe(prompt_simple, max_new_tokens=60, do_sample=True, top_p=0.9, temperature=0.7)[0]["generated_text"]
            end_simple = round(time.time() - start_simple, 2)
            answer_simple = out_simple.split("Классификация:")[-1].strip()

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

    return (
        results["ChatGPT-like (ruGPT3small)"]["cot_answer"], f"{results['ChatGPT-like (ruGPT3small)']['cot_time']} сек",
        results["ChatGPT-like (ruGPT3small)"]["simple_answer"], f"{results['ChatGPT-like (ruGPT3small)']['simple_time']} сек",
        results["GigaChat-like (ruDialoGPT-medium)"]["cot_answer"], f"{results['GigaChat-like (ruDialoGPT-medium)']['cot_time']} сек",
        results["GigaChat-like (ruDialoGPT-medium)"]["simple_answer"], f"{results['GigaChat-like (ruDialoGPT-medium)']['simple_time']} сек",
        results["DeepSeek-like (RuBERT-tiny2)"]["cot_answer"], f"{results['DeepSeek-like (RuBERT-tiny2)']['cot_time']} сек",
        results["DeepSeek-like (RuBERT-tiny2)"]["simple_answer"], f"{results['DeepSeek-like (RuBERT-tiny2)']['simple_time']} сек"
    )

# Gradio интерфейс
with gr.Blocks() as demo:
    gr.Markdown("## 🛡️ Детектирование мошеннических обращений")

    inp = gr.Textbox(label="Вопрос клиента", placeholder="Например: Мне позвонили и сказали, что моя карта заблокирована. Попросили ввести номер карты на сайте, чтобы «разблокировать».
", lines=2)
    btn = gr.Button("Классифицировать")

    gr.Markdown("### ChatGPT-like (ruGPT3small)")
    cot1 = gr.Textbox(label="CoT ответ")
    cot1_time = gr.Textbox(label="Время CoT")
    simple1 = gr.Textbox(label="Zero-shot ответ")
    simple1_time = gr.Textbox(label="Время Zero-shot")

    gr.Markdown("### GigaChat-like (ruDialoGPT-medium)")
    cot2 = gr.Textbox(label="CoT ответ")
    cot2_time = gr.Textbox(label="Время CoT")
    simple2 = gr.Textbox(label="Zero-shot ответ")
    simple2_time = gr.Textbox(label="Время Zero-shot")

    gr.Markdown("### DeepSeek-like (RuBERT-tiny2)")
    cot3 = gr.Textbox(label="CoT ответ")
    cot3_time = gr.Textbox(label="Время CoT")
    simple3 = gr.Textbox(label="Zero-shot ответ")
    simple3_time = gr.Textbox(label="Время Zero-shot")

    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()