SimrusDenuvo commited on
Commit
4fb6307
·
verified ·
1 Parent(s): a4bd38b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -82
app.py CHANGED
@@ -1,106 +1,76 @@
1
- import os
2
- import json
3
  import gradio as gr
4
  import time
5
  from transformers import pipeline
6
- from kaggle.api.kaggle_api_extended import KaggleApi
7
 
8
- # === Подготовка банковского набора данных через Kaggle ===
9
- # Пишем файл kaggle.json из переменных окружения, чтобы authenticate() нашёл его
10
- import json
11
- kaggle_config_dir = os.path.expanduser("~/.config/kaggle")
12
- os.makedirs(kaggle_config_dir, exist_ok=True)
13
- kaggle_json = {
14
- "username": os.getenv("KAGGLE_USERNAME", ""),
15
- "key": os.getenv("KAGGLE_KEY", "")
16
- }
17
- if not kaggle_json["username"] or not kaggle_json["key"]:
18
- raise ValueError("Не найдены переменные окружения KAGGLE_USERNAME и KAGGLE_KEY")
19
- with open(os.path.join(kaggle_config_dir, "kaggle.json"), "w") as f:
20
- json.dump(kaggle_json, f)
21
-
22
- # Скачиваем при первом запуске
23
- DATA_DIR = './data'
24
- json_file = None
25
- if not os.path.exists(DATA_DIR):
26
- os.makedirs(DATA_DIR)
27
- api = KaggleApi()
28
- api.authenticate()
29
- api.dataset_download_files('PromptCloudHQ/banking-chatbot-dataset', path=DATA_DIR, unzip=True)
30
- # Находим JSON-файл с данными
31
- for fname in os.listdir(DATA_DIR):
32
- if fname.endswith('.json'):
33
- json_file = os.path.join(DATA_DIR, fname)
34
- break
35
- else:
36
- for fname in os.listdir(DATA_DIR):
37
- if fname.endswith('.json'):
38
- json_file = os.path.join(DATA_DIR, fname)
39
- break
40
-
41
- if json_file is None:
42
- raise FileNotFoundError('Не удалось найти JSON-файл с банковскими данными в ./data')
43
 
44
- # === Инициализация трёх бесплатных русскоязычных моделей (GPT-2 based) ===
45
- models = {
46
- 'ruDialoGPT-small': pipeline('text-generation', model='t-bank-ai/ruDialoGPT-small', tokenizer='t-bank-ai/ruDialoGPT-small', device=-1),
47
- 'ruDialoGPT-medium': pipeline('text-generation', model='t-bank-ai/ruDialoGPT-medium', tokenizer='t-bank-ai/ruDialoGPT-medium', device=-1),
48
- 'ruGPT3-small': pipeline('text-generation', model='ai-forever/rugpt3small_based_on_gpt2', tokenizer='ai-forever/rugpt3small_based_on_gpt2', device=-1),
49
- }
 
50
 
51
- # Системная инструкция для CoT
52
  system_instruction = (
53
- "Выбанковский ассистент. Ваша задача — корректно и вежливо отвечать на запросы клиентов банка, "
54
- "давать рекомендации по банковским операциям и услугам."
 
55
  )
56
 
57
- # Строим полный промпт с CoT и примерами
 
 
 
 
 
58
 
59
- def build_prompt(question: str) -> str:
60
- few_shot_text = "\n\n".join(f"Пример:\n{ex}" for ex in examples)
61
- prompt = (
 
62
  f"{system_instruction}\n\n"
63
- f"{few_shot_text}\n\n"
64
- f"Вопрос клиента: {question}\n"
65
- "Сначала подробно опишите рассуждения шаг за шагом, а затем кратко сформулируйте ответ."
66
  )
67
- return prompt
68
-
69
- # Генерация ответов и измерение времени
70
 
71
- def generate(question: str):
72
- prompt = build_prompt(question)
73
  results = {}
74
  for name, pipe in models.items():
75
  start = time.time()
76
- out = pipe(prompt, max_length=200, do_sample=True, top_p=0.9, temperature=0.7)[0]['generated_text']
77
  elapsed = round(time.time() - start, 2)
78
- # Извлекаем связный ответ — последнюю строку
79
- answer = out.strip().split('\n')[-1]
80
- results[name] = {'answer': answer, 'time': elapsed}
81
  return results
82
 
83
- # Форматируем вывод для Gradio
84
-
85
- def format_outputs(question: str):
86
- res = generate(question)
87
  return (
88
- res['ruDialoGPT-small']['answer'], f"{res['ruDialoGPT-small']['time']}s",
89
- res['ruDialoGPT-medium']['answer'], f"{res['ruDialoGPT-medium']['time']}s",
90
- res['ruGPT3-small']['answer'], f"{res['ruGPT3-small']['time']}s"
91
  )
92
 
93
- # === Интерфейс Gradio ===
94
  with gr.Blocks() as demo:
95
- gr.Markdown("## Ответы на клиентские обращения\nCoT + тайминг по трём бесплатным моделям")
96
- txt = gr.Textbox(label='Описание проблемы клиента', placeholder='Например: "Почему я не могу снять деньги с карты?"', lines=2)
97
- btn = gr.Button('Сгенерировать ответы')
98
- out1 = gr.Textbox(label='ruDialoGPT-small Ответ')
99
- t1 = gr.Textbox(label='ruDialoGPT-small Время')
100
- out2 = gr.Textbox(label='ruDialoGPT-medium Ответ')
101
- t2 = gr.Textbox(label='ruDialoGPT-medium Время')
102
- out3 = gr.Textbox(label='ruGPT3-small Ответ')
103
- t3 = gr.Textbox(label='ruGPT3-small Время')
104
- btn.click(format_outputs, inputs=[txt], outputs=[out1, t1, out2, t2, out3, t3])
105
- demo.launch()
106
 
 
 
 
 
1
  import gradio as gr
2
  import time
3
  from transformers import pipeline
4
+ from datasets import load_dataset
5
 
6
+ # Загрузка датасета с отзывами банков
7
+ dataset = load_dataset("Romjiik/Russian_bank_reviews", split="train")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
+ # Отбираем 2 примера для few-shot в CoT
10
+ few_shot_examples = []
11
+ for row in dataset.select(range(2)):
12
+ review = row["review"]
13
+ rating = row["rating"]
14
+ ex = f"Клиент: {review}\nОценка: {rating}\nОтвет: Пожалуйста, разъясните ситуацию в деталях. Мы поможем."
15
+ few_shot_examples.append(ex)
16
 
17
+ # Системная инструкция
18
  system_instruction = (
19
+ "Тывежливый и точный банковский помощник. "
20
+ "Ты читаешь обращения клиентов и даешь корректные, подробные, официальные ответы. "
21
+ "Если данных недостаточно — просишь уточнение. Используй рассуждение шаг за шагом."
22
  )
23
 
24
+ # Загружаем три модели
25
+ models = {
26
+ "ruDialoGPT-small": pipeline("text-generation", model="t-bank-ai/ruDialoGPT-small", tokenizer="t-bank-ai/ruDialoGPT-small", device=-1),
27
+ "ruDialoGPT-medium": pipeline("text-generation", model="t-bank-ai/ruDialoGPT-medium", tokenizer="t-bank-ai/ruDialoGPT-medium", device=-1),
28
+ "ruGPT3-small": pipeline("text-generation", model="ai-forever/rugpt3small_based_on_gpt2", tokenizer="ai-forever/rugpt3small_based_on_gpt2", device=-1),
29
+ }
30
 
31
+ # Построение CoT-промпта
32
+ def build_prompt(user_input):
33
+ examples = "\n\n".join(few_shot_examples)
34
+ return (
35
  f"{system_instruction}\n\n"
36
+ f"{examples}\n\n"
37
+ f"Клиент: {user_input}\n"
38
+ f"Опиши шаг за шагом размышления, затем сформулируй окончательный ответ клиенту:"
39
  )
 
 
 
40
 
41
+ # Генерация ответов
42
+ def generate_answers(prompt):
43
  results = {}
44
  for name, pipe in models.items():
45
  start = time.time()
46
+ out = pipe(prompt, max_length=300, do_sample=True, top_p=0.9, temperature=0.7)[0]["generated_text"]
47
  elapsed = round(time.time() - start, 2)
48
+ final_line = out.strip().split('\n')[-1]
49
+ results[name] = {"answer": final_line, "time": elapsed}
 
50
  return results
51
 
52
+ # Формат вывода
53
+ def run_models(user_input):
54
+ prompt = build_prompt(user_input)
55
+ res = generate_answers(prompt)
56
  return (
57
+ res["ruDialoGPT-small"]["answer"], f"{res['ruDialoGPT-small']['time']} сек",
58
+ res["ruDialoGPT-medium"]["answer"], f"{res['ruDialoGPT-medium']['time']} сек",
59
+ res["ruGPT3-small"]["answer"], f"{res['ruGPT3-small']['time']} сек",
60
  )
61
 
62
+ # Интерфейс Gradio
63
  with gr.Blocks() as demo:
64
+ gr.Markdown("## 🤖 Банковский помощник: CoT + 3 модели (русский язык)")
65
+ inp = gr.Textbox(label="Запрос клиента", placeholder="Например: Я не могу попасть в личный кабинет", lines=2)
66
+ btn = gr.Button("Сгенерировать ответы")
67
+ out1 = gr.Textbox(label="ruDialoGPT-small")
68
+ t1 = gr.Textbox(label="Время")
69
+ out2 = gr.Textbox(label="ruDialoGPT-medium")
70
+ t2 = gr.Textbox(label="Время")
71
+ out3 = gr.Textbox(label="ruGPT3-small")
72
+ t3 = gr.Textbox(label="Время")
73
+
74
+ btn.click(run_models, inputs=[inp], outputs=[out1, t1, out2, t2, out3, t3])
75
 
76
+ demo.launch()