SimrusDenuvo commited on
Commit
e66857b
·
verified ·
1 Parent(s): 62749b6

Update app.py

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