SimrusDenuvo commited on
Commit
39ebd04
·
verified ·
1 Parent(s): 66fabfa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +70 -30
app.py CHANGED
@@ -3,43 +3,81 @@ import time
3
  from transformers import pipeline
4
  from datasets import load_dataset
5
 
6
- # Загрузка бесплатных русскоязычных моделей
7
  models = {
8
- 'ruDialoGPT-small': pipeline('text-generation', model='t-bank-ai/ruDialoGPT-small', tokenizer='t-bank-ai/ruDialoGPT-small', device=-1),
9
- 'ruDialoGPT-medium': pipeline('text-generation', model='t-bank-ai/ruDialoGPT-medium', tokenizer='t-bank-ai/ruDialoGPT-medium', device=-1),
10
- 'ruGPT3-small': pipeline('text-generation', model='ai-forever/rugpt3small_based_on_gpt2', tokenizer='ai-forever/rugpt3small_based_on_gpt2', device=-1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  }
12
 
13
- # Загрузка банковского датасета с диалогами
14
- bank_data = load_dataset('ai-lab/MBD', split='train')
15
- # Определяем колонку с диалогами
16
- col = next((c for c in bank_data.column_names if 'dialog' in c), None)
 
 
 
 
 
17
  if col is None:
18
- raise ValueError('В датасете не найдена колонка с диалогами')
19
- # Берём первые два примера для few-shot
20
- examples = [item[col] for item in bank_data.select(range(2))]
 
 
 
 
 
 
 
 
 
 
21
 
22
- # Функция построения запроса с CoT и few-shot примерами
23
 
24
- def build_prompt(question):
25
- few_shot = '\n\n'.join(f'Диалог:\n{ex}' for ex in examples)
26
  prompt = (
27
- f"{few_shot}\n\n"
28
- f"Вопрос: {question}\n"
 
29
  "Сначала подробно опишите рассуждения шаг за шагом, а затем дайте краткий связный ответ."
30
  )
31
  return prompt
32
 
33
- # Генерация ответов и снятие тайминга
34
 
35
- def generate(question):
36
  prompt = build_prompt(question)
37
  results = {}
38
  for name, pipe in models.items():
39
  start = time.time()
40
- out = pipe(prompt, max_length=300, do_sample=True, top_p=0.9, temperature=0.7)[0]['generated_text']
 
 
 
 
 
 
 
41
  elapsed = round(time.time() - start, 2)
42
- # Извлечение финального ответа после рассуждений
43
  if 'Ответ:' in out:
44
  answer = out.split('Ответ:')[-1].strip()
45
  else:
@@ -49,25 +87,26 @@ def generate(question):
49
 
50
  # Форматируем вывод для Gradio
51
 
52
- def format_outputs(question):
53
  res = generate(question)
54
  return (
55
  res['ruDialoGPT-small']['answer'], f"{res['ruDialoGPT-small']['time']}s",
56
- res['ruDialoGPT-medium']['answer'], f"{res['ruDialoGPT-medium']['time']}s",
57
- res['ruGPT3-small']['answer'], f"{res['ruGPT3-small']['time']}s"
58
  )
59
 
60
  # Интерфейс Gradio
61
  with gr.Blocks() as demo:
62
- gr.Markdown('## CoT на трёх моделях и банковский датасет')
63
- txt = gr.Textbox(label='Ваш вопрос', placeholder='Введите вопрос, связанный с банковскими услугами', lines=2)
64
- btn = gr.Button('Сгенерировать')
 
65
  out1 = gr.Textbox(label='ruDialoGPT-small Ответ')
66
  t1 = gr.Textbox(label='ruDialoGPT-small Время')
67
- out2 = gr.Textbox(label='ruDialoGPT-medium Ответ')
68
- t2 = gr.Textbox(label='ruDialoGPT-medium Время')
69
- out3 = gr.Textbox(label='ruGPT3-small Ответ')
70
- t3 = gr.Textbox(label='ruGPT3-small Время')
71
  btn.click(format_outputs, inputs=[txt], outputs=[out1, t1, out2, t2, out3, t3])
72
  demo.launch()
73
 
@@ -75,3 +114,4 @@ with gr.Blocks() as demo:
75
 
76
 
77
 
 
 
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
+ # Загрузка "мини" банковского датасета для few-shot (не более 10% данных)
29
+ bank_data_stream = load_dataset(
30
+ 'ai-lab/MBD-mini',
31
+ split='train',
32
+ streaming=True
33
+ )
34
+ # Определяем колонку с диалогами среди ключей
35
+ first_record = next(iter(bank_data_stream))
36
+ col = next((c for c in first_record.keys() if 'dialog' in c or 'Диалог' in c or 'dialogue' in c.lower()), None)
37
  if col is None:
38
+ raise ValueError('Не найдена колонка с диалогами в MBD-mini')
39
+ # Собираем два few-shot примера, не загружая весь датасет
40
+ examples = []
41
+ for rec in bank_data_stream:
42
+ examples.append(rec[col])
43
+ if len(examples) == 2:
44
+ break
45
+
46
+ # Системная инструкция для CoT
47
+ system_instruction = (
48
+ "Вы — банковский ассистент. Ваша задача — корректно и вежливо отвечать на запросы клиентов банка,"
49
+ " рассказывать о причинах и способах решения их проблем с банковскими услугами."
50
+ )
51
 
52
+ # Функция построения основного CoT-промпта
53
 
54
+ def build_prompt(question: str) -> str:
55
+ few_shot_text = '\n\n'.join(f"Пример диалога:\n{ex}" for ex in examples)
56
  prompt = (
57
+ f"{system_instruction}\n\n"
58
+ f"{few_shot_text}\n\n"
59
+ f"Вопрос клиента: {question}\n"
60
  "Сначала подробно опишите рассуждения шаг за шагом, а затем дайте краткий связный ответ."
61
  )
62
  return prompt
63
 
64
+ # Генерация ответов и измерение времени
65
 
66
+ def generate(question: str):
67
  prompt = build_prompt(question)
68
  results = {}
69
  for name, pipe in models.items():
70
  start = time.time()
71
+ # Генерация по CoT
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:
 
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
  with gr.Blocks() as demo:
100
+ gr.Markdown('## Клиентские обращения: CoT на трёх моделях с MBD-mini и тайминг')
101
+ txt = gr.Textbox(label='Опишите проблему клиента', placeholder='Например: "Почему я не могу снять деньги с карты?"', lines=2)
102
+ btn = gr.Button('Сгенерировать ответ')
103
+ # Вывод для трёх моделей
104
  out1 = gr.Textbox(label='ruDialoGPT-small Ответ')
105
  t1 = gr.Textbox(label='ruDialoGPT-small Время')
106
+ out2 = gr.Textbox(label='ruGPT3-small Ответ')
107
+ t2 = gr.Textbox(label='ruGPT3-small Время')
108
+ out3 = gr.Textbox(label='rut5-small-chitchat Ответ')
109
+ t3 = gr.Textbox(label='rut5-small-chitchat Время')
110
  btn.click(format_outputs, inputs=[txt], outputs=[out1, t1, out2, t2, out3, t3])
111
  demo.launch()
112
 
 
114
 
115
 
116
 
117
+