SimrusDenuvo commited on
Commit
f4f65e1
·
verified ·
1 Parent(s): e02f968

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -59
app.py CHANGED
@@ -1,56 +1,48 @@
1
  import gradio as gr
2
  import time
3
- from transformers import pipeline, AutoTokenizer
4
  from datasets import load_dataset
5
 
6
  # Инициализация трёх бесплатных русскоязычных моделей
7
- models = {}
8
-
9
- # 1) ruDialoGPT-small
10
- models['ruDialoGPT-small'] = pipeline(
11
- 'text-generation',
12
- model='t-bank-ai/ruDialoGPT-small',
13
- tokenizer='t-bank-ai/ruDialoGPT-small',
14
- device=-1
15
- )
16
-
17
- # 2) ruGPT3-small
18
- models['ruGPT3-small'] = pipeline(
19
- 'text-generation',
20
- model='ai-forever/rugpt3small_based_on_gpt2',
21
- tokenizer='ai-forever/rugpt3small_based_on_gpt2',
22
- device=-1
23
- )
24
-
25
- # 3) rut5-small-chitchat (T5 requires text2text и slow tokenizer)
26
- t5_tokenizer = AutoTokenizer.from_pretrained(
27
- 'cointegrated/rut5-small-chitchat',
28
- use_fast=False
29
- )
30
- models['rut5-small-chitchat'] = pipeline(
31
- 'text2text-generation',
32
- model='cointegrated/rut5-small-chitchat',
33
- tokenizer=t5_tokenizer,
34
- device=-1
35
- )
36
 
37
- # Загрузка "мини" банковского датасета для few-shot (стриминг)
38
- bank_data_stream = load_dataset(
39
- 'ai-lab/MBD-mini',
40
  split='train',
41
  streaming=True
42
  )
43
- # Определяем колонку с диалогами по ключам
44
- first_record = next(iter(bank_data_stream))
45
- col = next((c for c in first_record.keys() if 'dialog' in c.lower() or 'диалог' in c.lower()), None)
46
- if col is None:
47
- raise ValueError('Не найдена колонка с диалогами в MBD-mini')
48
- # Собираем два few-shot примера
49
  examples = []
50
- for rec in bank_data_stream:
51
- examples.append(rec[col])
 
 
 
52
  if len(examples) == 2:
53
  break
 
 
54
 
55
  # Системная инструкция для CoT
56
  system_instruction = (
@@ -58,13 +50,13 @@ system_instruction = (
58
  " рассказывать о причинах и способах решения их проблем с банковскими услугами."
59
  )
60
 
61
- # Построение CoT-промпта с few-shot
62
 
63
  def build_prompt(question: str) -> str:
64
- few_shot_text = '\n\n'.join(f"Пример диалога:\n{ex}" for ex in examples)
65
  prompt = (
66
  f"{system_instruction}\n\n"
67
- f"{few_shot_text}\n\n"
68
  f"Вопрос клиента: {question}\n"
69
  "Сначала подробно опишите рассуждения шаг за шагом, а затем дайте краткий связный ответ."
70
  )
@@ -77,7 +69,6 @@ def generate(question: str):
77
  results = {}
78
  for name, pipe in models.items():
79
  start = time.time()
80
- # для T5 используем text2text, для других text-generation
81
  out = pipe(
82
  prompt,
83
  max_length=400,
@@ -86,7 +77,7 @@ def generate(question: str):
86
  temperature=0.7
87
  )[0]['generated_text']
88
  elapsed = round(time.time() - start, 2)
89
- # Извлечь финальный ответ
90
  if 'Ответ:' in out:
91
  answer = out.split('Ответ:')[-1].strip()
92
  else:
@@ -94,7 +85,7 @@ def generate(question: str):
94
  results[name] = {'answer': answer, 'time': elapsed}
95
  return results
96
 
97
- # Подготовка вывода для Gradio
98
 
99
  def format_outputs(question: str):
100
  res = generate(question)
@@ -104,11 +95,12 @@ def format_outputs(question: str):
104
  res['rut5-small-chitchat']['answer'], f"{res['rut5-small-chitchat']['time']}s"
105
  )
106
 
107
- # Интерфейс Gradio
 
108
  with gr.Blocks() as demo:
109
- gr.Markdown('## Клиентские обращения: CoT на трёх моделях с MBD-mini и тайминг')
110
  txt = gr.Textbox(
111
- label='Опишите проблему клиента',
112
  placeholder='Например: "Почему я не могу снять деньги с карты?"',
113
  lines=2
114
  )
@@ -119,13 +111,5 @@ with gr.Blocks() as demo:
119
  t2 = gr.Textbox(label='ruGPT3-small Время')
120
  out3 = gr.Textbox(label='rut5-small-chitchat Ответ')
121
  t3 = gr.Textbox(label='rut5-small-chitchat Время')
122
- btn.click(
123
- format_outputs,
124
- inputs=[txt],
125
- outputs=[out1, t1, out2, t2, out3, t3]
126
- )
127
  demo.launch()
128
-
129
-
130
-
131
-
 
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 = (
 
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
  )
 
69
  results = {}
70
  for name, pipe in models.items():
71
  start = time.time()
 
72
  out = pipe(
73
  prompt,
74
  max_length=400,
 
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:
 
85
  results[name] = {'answer': answer, 'time': elapsed}
86
  return results
87
 
88
+ # Форматируем данные для Gradio интерфейса
89
 
90
  def format_outputs(question: str):
91
  res = generate(question)
 
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
  )
 
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()