root39058 commited on
Commit
97b1884
·
verified ·
1 Parent(s): bc32d5c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -48
app.py CHANGED
@@ -6,7 +6,7 @@ import os
6
  import time
7
  from threading import Thread
8
 
9
- # === 1. БАЗА ДИАЛОГОВ (расширенная) ===
10
 
11
  dialog_templates = [
12
  {
@@ -109,14 +109,12 @@ dialog_templates = [
109
  },
110
  ]
111
 
112
- # === 2. ФУНКЦИИ ГЕНЕРАЦИИ ДИАЛОГОВ ===
113
 
114
  def generate_dialog():
115
- """Генерирует короткий диалог (2-4 реплики)"""
116
  template = random.choice(dialog_templates)
117
  q, a = random.choice(template["dialog"])
118
 
119
- # Вариации ответа
120
  variations = [
121
  a,
122
  f"{a} А что вы думаете?",
@@ -126,7 +124,6 @@ def generate_dialog():
126
  ]
127
  answer = random.choice(variations)
128
 
129
- # Разнообразие вопросов
130
  prefixes = ["Скажите, ", "А можно узнать, ", "Подскажите, ", "Интересно, ", ""]
131
  prefix = random.choice(prefixes)
132
 
@@ -134,11 +131,9 @@ def generate_dialog():
134
  return dialog
135
 
136
  def generate_long_dialog():
137
- """Генерирует длинный диалог (5-12 реплик)"""
138
  turns = random.randint(5, 12)
139
  lines = []
140
 
141
- # Выбираем тему
142
  topics = ["работа", "учёба", "хобби", "путешествия", "наука", "искусство", "технологии", "здоровье"]
143
  topic = random.choice(topics)
144
  lines.append(f"Тема: {topic.capitalize()}")
@@ -167,7 +162,6 @@ def generate_long_dialog():
167
  return "\n".join(lines)
168
 
169
  def generate_dialog_batch():
170
- """Генерирует несколько диалогов за раз"""
171
  count = random.randint(2, 5)
172
  dialogs = []
173
  for _ in range(count):
@@ -177,7 +171,7 @@ def generate_dialog_batch():
177
  dialogs.append(generate_dialog())
178
  return "\n\n---\n\n".join(dialogs)
179
 
180
- # === 3. СОСТОЯНИЕ ГЕНЕРАЦИИ ===
181
 
182
  class DatasetGenerator:
183
  def __init__(self):
@@ -187,11 +181,9 @@ class DatasetGenerator:
187
  self.is_running = False
188
  self.count = 0
189
 
190
- # Загружаем существующие данные
191
  self.load_existing()
192
 
193
  def load_existing(self):
194
- """Загружает уже сгенерированные данные"""
195
  if os.path.exists("/data/dialog_dataset"):
196
  try:
197
  dataset = load_from_disk("/data/dialog_dataset")
@@ -201,11 +193,10 @@ class DatasetGenerator:
201
  self.count = len(self.data["text"])
202
  self.current_size = len(json.dumps(self.data, ensure_ascii=False).encode('utf-8'))
203
  print(f"✅ Загружено {self.count} диалогов, {self.current_size // 1024 // 1024} МБ")
204
- except:
205
- print("❌ Не удалось загрузить существующий датасет")
206
 
207
  def generate_batch(self, batch_size=100):
208
- """Генерирует пачку диалогов"""
209
  new_texts = []
210
  new_dialogs = []
211
  new_turns = []
@@ -228,14 +219,11 @@ class DatasetGenerator:
228
  return new_texts, new_dialogs, new_turns
229
 
230
  def generate_loop(self):
231
- """Основной цикл генерации"""
232
  self.is_running = True
233
 
234
  while self.is_running and self.current_size < self.target_size:
235
- # Генерируем батч
236
  texts, dialogs, turns = self.generate_batch(100)
237
 
238
- # Добавляем в данные
239
  self.data["text"].extend(texts)
240
  self.data["dialog"].extend(dialogs)
241
  self.data["turns"].extend(turns)
@@ -243,24 +231,21 @@ class DatasetGenerator:
243
  self.count += len(texts)
244
  self.current_size = len(json.dumps(self.data, ensure_ascii=False).encode('utf-8'))
245
 
246
- # Сохраняем каждые 1000 диалогов
247
  if self.count % 1000 == 0:
248
  self.save_dataset()
249
  print(f"💾 Сохранено {self.count} диалогов, {self.current_size // 1024 // 1024} МБ")
250
 
251
- time.sleep(0.1) # Небольшая пауза
252
 
253
  self.is_running = False
254
  self.save_dataset()
255
  print("✅ Генерация завершена!")
256
 
257
  def save_dataset(self):
258
- """Сохраняет датасет"""
259
  os.makedirs("/data", exist_ok=True)
260
  dataset = Dataset.from_dict(self.data)
261
  dataset.save_to_disk("/data/dialog_dataset")
262
 
263
- # Сохраняем также как JSONL
264
  with open("/data/dialog_dataset.jsonl", "w", encoding="utf-8") as f:
265
  for i in range(len(self.data["text"])):
266
  entry = {
@@ -271,8 +256,7 @@ class DatasetGenerator:
271
  f.write(json.dumps(entry, ensure_ascii=False) + "\n")
272
 
273
  def get_status(self):
274
- """Возвращает статус генерации"""
275
- percent = (self.current_size / self.target_size) * 100
276
  return {
277
  "count": self.count,
278
  "size_mb": self.current_size // 1024 // 1024,
@@ -281,65 +265,66 @@ class DatasetGenerator:
281
  "is_running": self.is_running
282
  }
283
 
284
- # === 4. GRADIO ИНТЕРФЕЙС ===
285
 
286
  generator = DatasetGenerator()
287
 
288
  def start_generation():
289
- """Запускает генерацию в отдельном потоке"""
290
  if generator.is_running:
291
  return "⏳ Генерация уже запущена!"
292
 
293
  thread = Thread(target=generator.generate_loop)
294
  thread.daemon = True
295
  thread.start()
296
- return "🚀 Генерация запущена!"
297
 
298
  def stop_generation():
299
- """Останавливает генерацию"""
300
  generator.is_running = False
301
  return "⏹️ Генерация остановлена"
302
 
303
  def get_status():
304
- """Возвращает статус для отображения"""
305
  status = generator.get_status()
 
306
  return f"""
307
- 📊 **Статус генерации**
308
 
309
  📝 Диалогов: **{status['count']}**
310
  💾 Размер: **{status['size_mb']} МБ / {status['target_mb']} МБ**
311
  📈 Прогресс: **{status['percent']:.1f}%**
312
  🔄 Состояние: **{'✅ Работает' if status['is_running'] else '⏸️ Остановлен'}**
313
 
314
- {('█' * int(status['percent'] // 2))}{('░' * (50 - int(status['percent'] // 2)))}
315
  """
316
 
317
  def get_sample():
318
- """Показывает случайный диалог"""
319
  if generator.count == 0:
320
  return "Нет сгенерированных диалогов"
321
 
322
  idx = random.randint(0, generator.count - 1)
323
- return f"**Пример диалога #{idx}**\n\n{generator.data['text'][idx]}"
324
 
325
- # === 5. GRADIO APP ===
326
 
327
- with gr.Blocks(title="Генератор диалогов", theme=gr.themes.Soft()) as demo:
328
- gr.Markdown("# 🤖 Генератор русского датасета диалогов")
329
- gr.Markdown("### Создаёт 100+ МБ диалогов для слабых устройств")
 
 
 
 
 
330
 
331
  with gr.Row():
332
  with gr.Column(scale=1):
333
- start_btn = gr.Button("▶️ Запустить генерацию", variant="primary", size="lg")
334
  stop_btn = gr.Button("⏹️ Остановить", variant="stop", size="lg")
335
 
336
  refresh_btn = gr.Button("🔄 Обновить статус", variant="secondary")
337
- sample_btn = gr.Button("📝 Показать пример", variant="secondary")
338
 
339
  status_output = gr.Markdown(get_status())
340
  sample_output = gr.Markdown("")
341
 
342
- # Обработчики
343
  start_btn.click(start_generation, outputs=[status_output])
344
  start_btn.click(get_status, outputs=[status_output])
345
 
@@ -348,15 +333,6 @@ with gr.Blocks(title="Генератор диалогов", theme=gr.themes.Soft
348
 
349
  refresh_btn.click(get_status, outputs=[status_output])
350
  sample_btn.click(get_sample, outputs=[sample_output])
351
-
352
- # Автообновление каждые 10 секунд
353
- demo.load(
354
- fn=get_status,
355
- outputs=[status_output],
356
- every=10
357
- )
358
-
359
- # === 6. ЗАПУСК ===
360
 
361
  if __name__ == "__main__":
362
  demo.launch(share=True)
 
6
  import time
7
  from threading import Thread
8
 
9
+ # === 1. БАЗА ДИАЛОГОВ ===
10
 
11
  dialog_templates = [
12
  {
 
109
  },
110
  ]
111
 
112
+ # === 2. ФУНКЦИИ ГЕНЕРАЦИИ ===
113
 
114
  def generate_dialog():
 
115
  template = random.choice(dialog_templates)
116
  q, a = random.choice(template["dialog"])
117
 
 
118
  variations = [
119
  a,
120
  f"{a} А что вы думаете?",
 
124
  ]
125
  answer = random.choice(variations)
126
 
 
127
  prefixes = ["Скажите, ", "А можно узнать, ", "Подскажите, ", "Интересно, ", ""]
128
  prefix = random.choice(prefixes)
129
 
 
131
  return dialog
132
 
133
  def generate_long_dialog():
 
134
  turns = random.randint(5, 12)
135
  lines = []
136
 
 
137
  topics = ["работа", "учёба", "хобби", "путешествия", "наука", "искусство", "технологии", "здоровье"]
138
  topic = random.choice(topics)
139
  lines.append(f"Тема: {topic.capitalize()}")
 
162
  return "\n".join(lines)
163
 
164
  def generate_dialog_batch():
 
165
  count = random.randint(2, 5)
166
  dialogs = []
167
  for _ in range(count):
 
171
  dialogs.append(generate_dialog())
172
  return "\n\n---\n\n".join(dialogs)
173
 
174
+ # === 3. ГЕНЕРАТОР ===
175
 
176
  class DatasetGenerator:
177
  def __init__(self):
 
181
  self.is_running = False
182
  self.count = 0
183
 
 
184
  self.load_existing()
185
 
186
  def load_existing(self):
 
187
  if os.path.exists("/data/dialog_dataset"):
188
  try:
189
  dataset = load_from_disk("/data/dialog_dataset")
 
193
  self.count = len(self.data["text"])
194
  self.current_size = len(json.dumps(self.data, ensure_ascii=False).encode('utf-8'))
195
  print(f"✅ Загружено {self.count} диалогов, {self.current_size // 1024 // 1024} МБ")
196
+ except Exception as e:
197
+ print(f"❌ Ошибка загрузки: {e}")
198
 
199
  def generate_batch(self, batch_size=100):
 
200
  new_texts = []
201
  new_dialogs = []
202
  new_turns = []
 
219
  return new_texts, new_dialogs, new_turns
220
 
221
  def generate_loop(self):
 
222
  self.is_running = True
223
 
224
  while self.is_running and self.current_size < self.target_size:
 
225
  texts, dialogs, turns = self.generate_batch(100)
226
 
 
227
  self.data["text"].extend(texts)
228
  self.data["dialog"].extend(dialogs)
229
  self.data["turns"].extend(turns)
 
231
  self.count += len(texts)
232
  self.current_size = len(json.dumps(self.data, ensure_ascii=False).encode('utf-8'))
233
 
 
234
  if self.count % 1000 == 0:
235
  self.save_dataset()
236
  print(f"💾 Сохранено {self.count} диалогов, {self.current_size // 1024 // 1024} МБ")
237
 
238
+ time.sleep(0.1)
239
 
240
  self.is_running = False
241
  self.save_dataset()
242
  print("✅ Генерация завершена!")
243
 
244
  def save_dataset(self):
 
245
  os.makedirs("/data", exist_ok=True)
246
  dataset = Dataset.from_dict(self.data)
247
  dataset.save_to_disk("/data/dialog_dataset")
248
 
 
249
  with open("/data/dialog_dataset.jsonl", "w", encoding="utf-8") as f:
250
  for i in range(len(self.data["text"])):
251
  entry = {
 
256
  f.write(json.dumps(entry, ensure_ascii=False) + "\n")
257
 
258
  def get_status(self):
259
+ percent = (self.current_size / self.target_size) * 100 if self.target_size > 0 else 0
 
260
  return {
261
  "count": self.count,
262
  "size_mb": self.current_size // 1024 // 1024,
 
265
  "is_running": self.is_running
266
  }
267
 
268
+ # === 4. GRADIO ===
269
 
270
  generator = DatasetGenerator()
271
 
272
  def start_generation():
 
273
  if generator.is_running:
274
  return "⏳ Генерация уже запущена!"
275
 
276
  thread = Thread(target=generator.generate_loop)
277
  thread.daemon = True
278
  thread.start()
279
+ return "🚀 Генерация Minset запущена!"
280
 
281
  def stop_generation():
 
282
  generator.is_running = False
283
  return "⏹️ Генерация остановлена"
284
 
285
  def get_status():
 
286
  status = generator.get_status()
287
+ progress_bar = "█" * int(status['percent'] // 2) + "░" * (50 - int(status['percent'] // 2))
288
  return f"""
289
+ 📊 **Minset - Статус генерации**
290
 
291
  📝 Диалогов: **{status['count']}**
292
  💾 Размер: **{status['size_mb']} МБ / {status['target_mb']} МБ**
293
  📈 Прогресс: **{status['percent']:.1f}%**
294
  🔄 Состояние: **{'✅ Работает' if status['is_running'] else '⏸️ Остановлен'}**
295
 
296
+ `{progress_bar}`
297
  """
298
 
299
  def get_sample():
 
300
  if generator.count == 0:
301
  return "Нет сгенерированных диалогов"
302
 
303
  idx = random.randint(0, generator.count - 1)
304
+ return f"**Пример диалога Minset #{idx}**\n\n{generator.data['text'][idx]}"
305
 
306
+ # === 5. ИНТЕРФЕЙС ===
307
 
308
+ with gr.Blocks(title="Minset Dataset Generator") as demo:
309
+ gr.Markdown("""
310
+ # 🤖 Minset - Генератор датасета диалогов
311
+
312
+ **Minset** — это датасет русских диалогов для обучения моделей.
313
+
314
+ ⚠️ **Важно:** Модели **ОБУЧАЮТСЯ НА ЭТОМ ДАТАСЕТЕ**, а не являются им самим.
315
+ """)
316
 
317
  with gr.Row():
318
  with gr.Column(scale=1):
319
+ start_btn = gr.Button("▶️ Запустить генерацию Minset", variant="primary", size="lg")
320
  stop_btn = gr.Button("⏹️ Остановить", variant="stop", size="lg")
321
 
322
  refresh_btn = gr.Button("🔄 Обновить статус", variant="secondary")
323
+ sample_btn = gr.Button("📝 Показать пример диалога", variant="secondary")
324
 
325
  status_output = gr.Markdown(get_status())
326
  sample_output = gr.Markdown("")
327
 
 
328
  start_btn.click(start_generation, outputs=[status_output])
329
  start_btn.click(get_status, outputs=[status_output])
330
 
 
333
 
334
  refresh_btn.click(get_status, outputs=[status_output])
335
  sample_btn.click(get_sample, outputs=[sample_output])
 
 
 
 
 
 
 
 
 
336
 
337
  if __name__ == "__main__":
338
  demo.launch(share=True)