SimrusDenuvo commited on
Commit
52af11a
·
verified ·
1 Parent(s): cafcd4f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -20
app.py CHANGED
@@ -3,23 +3,50 @@ import time
3
  from transformers import pipeline
4
  from datasets import load_dataset
5
 
6
- # Примеры вручную заменяют шумные выборки из датасета
7
- few_shot_examples = [
8
- "Клиент: Я не могу войти в личный кабинет\nОтвет: Пожалуйста, проверьте правильность логина и пароля. Если проблема сохраняется — воспользуйтесь восстановлением доступа или обратитесь в поддержку.",
9
- "Клиент: Мне пришло смс о входе, которого я не совершал\nОтвет: Это может быть попытка входа третьего лица. Рекомендуем срочно сменить пароль и обратиться в службу поддержки банка."
10
- ]
 
 
 
 
 
 
 
 
 
 
11
 
12
- # Инструкции
13
  cot_instruction = (
14
- "Ты — вежливый банковский ассистент. Клиент описывает проблему. "
15
- "Твоя задача сначала шаг за шагом проанализировать суть запроса, а затем дать полезный и точный ответ. "
16
- "Если информации недостаточно — запроси уточнение. Не выдумывай факты."
17
  )
18
 
 
19
  simple_instruction = (
20
- "Ты — банковский помощник. Отвечай кратко и понятно. Не используй лишние детали."
21
  )
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  # Модели
24
  models = {
25
  "ruDialoGPT-small": pipeline("text-generation", model="t-bank-ai/ruDialoGPT-small", tokenizer="t-bank-ai/ruDialoGPT-small", device=-1),
@@ -28,37 +55,40 @@ models = {
28
  }
29
 
30
  # Формирование промптов
 
31
  def build_cot_prompt(user_input):
32
- examples = "\n\n".join(few_shot_examples)
33
  return f"{cot_instruction}\n\n{examples}\n\nКлиент: {user_input}\nРассуждение и ответ:"
34
 
35
  def build_simple_prompt(user_input):
36
- examples = "\n\n".join(few_shot_examples)
37
  return f"{simple_instruction}\n\n{examples}\n\nКлиент: {user_input}\nОтвет:"
38
 
39
- # Функция извлечения финального ответа
 
40
  def extract_final_answer(generated_text):
41
  for line in generated_text.split('\n'):
42
  if "Ответ:" in line:
43
  return line.split("Ответ:")[-1].strip()
44
  return generated_text.strip().split('\n')[-1]
45
 
46
- # Генерация по обоим промптам
 
47
  def generate_dual_answers(user_input):
48
  results = {}
49
  prompt_cot = build_cot_prompt(user_input)
50
  prompt_simple = build_simple_prompt(user_input)
51
 
52
  for name, pipe in models.items():
53
- # CoT ответ
54
  start_cot = time.time()
55
- out_cot = pipe(prompt_cot, max_new_tokens=80, do_sample=True, top_p=0.9, temperature=0.7)[0]["generated_text"]
56
  end_cot = round(time.time() - start_cot, 2)
57
  answer_cot = extract_final_answer(out_cot)
58
 
59
- # Обычный ответ
60
  start_simple = time.time()
61
- out_simple = pipe(prompt_simple, max_new_tokens=80, do_sample=True, top_p=0.9, temperature=0.7)[0]["generated_text"]
62
  end_simple = round(time.time() - start_simple, 2)
63
  answer_simple = extract_final_answer(out_simple)
64
 
@@ -80,9 +110,9 @@ def generate_dual_answers(user_input):
80
 
81
  # Интерфейс Gradio
82
  with gr.Blocks() as demo:
83
- gr.Markdown("## 🏦 Банковский помощник: сравнение CoT и обычного ответа")
84
 
85
- inp = gr.Textbox(label="Вопрос клиента", placeholder="Например: Как перевести деньги на другую карту?", lines=2)
86
  btn = gr.Button("Сгенерировать")
87
 
88
  gr.Markdown("### ruDialoGPT-small")
@@ -110,3 +140,4 @@ with gr.Blocks() as demo:
110
  ])
111
 
112
  demo.launch()
 
 
3
  from transformers import pipeline
4
  from datasets import load_dataset
5
 
6
+ # Группированные обращения по категориям
7
+ categories = {
8
+ "доступ": [
9
+ "Клиент: Я не могу войти в личный кабинет\nОтвет: Пожалуйста, проверьте правильность логина и пароля. Если проблема сохраняется воспользуйтесь восстановлением доступа или обратитесь в поддержку.",
10
+ "Клиент: У меня заблокирован вход в интернет-банк\nОтвет: Обратитесь в поддержку для подтверждения личности и восстановления доступа."
11
+ ],
12
+ "переводы": [
13
+ "Клиент: Как перевести деньги на другую карту?\nОтвет: Перевод возможен через мобильное приложение или в отделении. Убедитесь, что карта получателя активна.",
14
+ "Клиент: Почему не проходит перевод?\nОтвет: Проверьте лимиты по карте и правильность реквизитов. Если всё верно, свяжитесь с поддержкой."
15
+ ],
16
+ "смс": [
17
+ "Клиент: Мне пришло смс, которого я не ожидал\nОтвет: Это может быть техническое уведомление. Уточните дату и текст сообщения, чтобы мы проверили.",
18
+ "Клиент: Получаю подозрительные смс от банка\nОтвет: Не переходите по ссылкам. Немедленно смените пароль и сообщите в службу безопасности."
19
+ ]
20
+ }
21
 
22
+ # Инструкция CoT (расширенная)
23
  cot_instruction = (
24
+ "Ты — банковский ассистент. Клиент задал вопрос. Сначала разложи его по смысловым блокам: что именно он хочет, какие данные нужны, возможные причины. "
25
+ "После анализа предложи чёткий, полезный и вежливый ответ. Если информации недостаточно запроси уточнение."
 
26
  )
27
 
28
+ # Инструкция обычная
29
  simple_instruction = (
30
+ "Ты — банковский помощник. Отвечай официально, коротко и понятно, без рассуждений."
31
  )
32
 
33
+ # Классификация темы обращения
34
+
35
+ def classify_topic(user_input):
36
+ if any(x in user_input.lower() for x in ["войти", "кабинет", "доступ", "логин", "пароль"]):
37
+ return "доступ"
38
+ elif any(x in user_input.lower() for x in ["перевод", "перевести", "деньги", "карта"]):
39
+ return "переводы"
40
+ elif any(x in user_input.lower() for x in ["смс", "сообщение", "уведомление"]):
41
+ return "смс"
42
+ return "доступ" # fallback
43
+
44
+ # Сбор примеров по теме
45
+
46
+ def get_few_shot_examples(user_input):
47
+ topic = classify_topic(user_input)
48
+ return categories.get(topic, categories["доступ"])
49
+
50
  # Модели
51
  models = {
52
  "ruDialoGPT-small": pipeline("text-generation", model="t-bank-ai/ruDialoGPT-small", tokenizer="t-bank-ai/ruDialoGPT-small", device=-1),
 
55
  }
56
 
57
  # Формирование промптов
58
+
59
  def build_cot_prompt(user_input):
60
+ examples = "\n\n".join(get_few_shot_examples(user_input))
61
  return f"{cot_instruction}\n\n{examples}\n\nКлиент: {user_input}\nРассуждение и ответ:"
62
 
63
  def build_simple_prompt(user_input):
64
+ examples = "\n\n".join(get_few_shot_examples(user_input))
65
  return f"{simple_instruction}\n\n{examples}\n\nКлиент: {user_input}\nОтвет:"
66
 
67
+ # Фильтрация финального ответа
68
+
69
  def extract_final_answer(generated_text):
70
  for line in generated_text.split('\n'):
71
  if "Ответ:" in line:
72
  return line.split("Ответ:")[-1].strip()
73
  return generated_text.strip().split('\n')[-1]
74
 
75
+ # Генерация
76
+
77
  def generate_dual_answers(user_input):
78
  results = {}
79
  prompt_cot = build_cot_prompt(user_input)
80
  prompt_simple = build_simple_prompt(user_input)
81
 
82
  for name, pipe in models.items():
83
+ # CoT
84
  start_cot = time.time()
85
+ out_cot = pipe(prompt_cot, max_new_tokens=100, do_sample=True, top_p=0.95, temperature=0.9)[0]["generated_text"]
86
  end_cot = round(time.time() - start_cot, 2)
87
  answer_cot = extract_final_answer(out_cot)
88
 
89
+ # Simple
90
  start_simple = time.time()
91
+ out_simple = pipe(prompt_simple, max_new_tokens=100, do_sample=True, top_p=0.95, temperature=0.9)[0]["generated_text"]
92
  end_simple = round(time.time() - start_simple, 2)
93
  answer_simple = extract_final_answer(out_simple)
94
 
 
110
 
111
  # Интерфейс Gradio
112
  with gr.Blocks() as demo:
113
+ gr.Markdown("## 🏦 Банковский помощник: CoT vs. Обычный ответ (магистерская работа)")
114
 
115
+ inp = gr.Textbox(label="Вопрос клиента", placeholder="Например: Почему не проходит перевод?", lines=2)
116
  btn = gr.Button("Сгенерировать")
117
 
118
  gr.Markdown("### ruDialoGPT-small")
 
140
  ])
141
 
142
  demo.launch()
143
+