Spaces:
Sleeping
Sleeping
| 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 = ( | |
| "Ты — помощник банка. Клиент задал вопрос. Проанализируй обращение шаг за шагом, " | |
| "выдели ключевые признаки и выдай итоговую категорию обращения." | |
| ) | |
| simple_instruction = ( | |
| "Ты — помощник банка. Определи категорию обращения клиента. Ответ должен быть кратким, без лишнего текста." | |
| ) | |
| # Используемые модели | |
| 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="t-bank-ai/ruDialoGPT-medium", tokenizer="t-bank-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}\nКлассификация:" | |
| ) | |
| # Генерация ответов | |
| 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() | |