X commited on
Commit
bc32d5c
·
verified ·
1 Parent(s): 0c4301c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +223 -204
app.py CHANGED
@@ -1,12 +1,14 @@
1
- from datasets import Dataset
 
2
  import random
3
  import json
4
  import os
 
 
5
 
6
- # === 1. БОЛЬШАЯ БАЗА ДИАЛОГОВ (1000+ шаблонов) ===
7
 
8
  dialog_templates = [
9
- # === ПРИВЕТСТВИЯ ===
10
  {
11
  "dialog": [
12
  ("Привет!", "Здравствуйте! Как я могу вам помочь?"),
@@ -18,7 +20,6 @@ dialog_templates = [
18
  ("Хай!", "Хай! Что нового?"),
19
  ]
20
  },
21
- # === КАК ДЕЛА ===
22
  {
23
  "dialog": [
24
  ("Как дела?", "Всё отлично! А у вас?"),
@@ -28,34 +29,29 @@ dialog_templates = [
28
  ("Как успехи?", "Успехи есть! Работаю над новыми проектами."),
29
  ]
30
  },
31
- # === ВОПРОСЫ ОБО ВСЁМ ===
32
  {
33
  "dialog": [
34
  ("Кто ты?", "Я искусственный интеллект, созданный чтобы помогать людям."),
35
  ("Что ты умеешь?", "Я умею отвечать на вопросы, писать тексты, помогать с задачами."),
36
  ("Где ты живёшь?", "Я живу в облаке! Всегда рядом с вами."),
37
- ("Сколько тебе лет?", "Мне несколько лет, но я постоянно учусь и развиваюсь."),
38
  ("Зачем ты здесь?", "Я здесь, чтобы помогать людям в их повседневных задачах."),
39
  ("У тебя есть имя?", "Меня зовут AI-ассистент. А вас?"),
40
  ("Ты человек?", "Нет, я компьютерная программа, но стараюсь быть полезной."),
41
  ]
42
  },
43
- # === НАУЧНЫЕ ВОПРОСЫ ===
44
  {
45
  "dialog": [
46
- ("Почему небо голубое?", "Небо голубое из-за рассеяния Рэлея — свет рассеивается в атмосфере."),
47
- ("Как работает интернет?", "Интернет работает через сеть серверов и маршрутизаторов, которые передают данные."),
48
  ("Что такое искусственный интеллект?", "ИИ — это технология, позволяющая машинам имитировать человеческий разум."),
49
- ("Что такое нейросети?", "Нейросети — это алгоритмы, вдохновлённые структурой мозга человека."),
50
- ("Почему трава зелёная?", "Трава зелёная из-за хлорофилла — пигмента для фотосинтеза."),
51
  ("Когда появилась жизнь на Земле?", "Жизнь появилась около 3,5 миллиардов лет назад."),
52
  ("Сколько планет в солнечной системе?", "В солнечной системе 8 планет."),
53
  ("Что такое чёрная дыра?", "Чёрная дыра — область пространства с огромной гравитацией."),
54
- ("Кто такой Эйнштейн?", "Альберт Эйнштейн — великий физик, создатель теории относительности."),
55
- ("Что такое ДНК?", "ДНК — молекула, хранящая генетическую информацию живых организмов."),
56
  ]
57
  },
58
- # === ЛИТЕРАТУРА И ИСКУССТВО ===
59
  {
60
  "dialog": [
61
  ("Кто написал Войну и мир?", "Войну и мир написал Лев Толстой."),
@@ -67,7 +63,6 @@ dialog_templates = [
67
  ("Кто такой Пушкин?", "Александр Пушкин — великий русский поэт."),
68
  ]
69
  },
70
- # === ПОВСЕДНЕВНЫЕ ВОПРОСЫ ===
71
  {
72
  "dialog": [
73
  ("Где можно купить хлеб?", "Хлеб можно купить в ближайшем супермаркете."),
@@ -76,10 +71,8 @@ dialog_templates = [
76
  ("Как пройти в библиотеку?", "Пройдите прямо, затем поверните налево."),
77
  ("Что посмотреть вечером?", "Рекомендую хороший фильм или книгу."),
78
  ("Как выучить язык?", "Нужна регулярная практика и мотивация."),
79
- ("Где отдохнуть?", "Можно поехать на природу или в городской парк."),
80
  ]
81
  },
82
- # === ПРОГРАММИРОВАНИЕ ===
83
  {
84
  "dialog": [
85
  ("Как выучить Python?", "Начните с основ: переменные, циклы, функции."),
@@ -87,9 +80,9 @@ dialog_templates = [
87
  ("Как создать сайт?", "Нужно знать HTML, CSS, JavaScript и серверный язык."),
88
  ("Что такое Git?", "Git — система контроля версий для кода."),
89
  ("Как стать разработчиком?", "Много практикуйтесь, изучайте алгоритмы."),
 
90
  ]
91
  },
92
- # === ПСИХОЛОГИЯ ===
93
  {
94
  "dialog": [
95
  ("Как справиться со стрессом?", "Помогают медитация, отдых и спорт."),
@@ -98,7 +91,6 @@ dialog_templates = [
98
  ("Почему люди счастливы?", "Счастье в простых вещах: любви, здоровье, увлечениях."),
99
  ]
100
  },
101
- # === ПУТЕШЕСТВИЯ ===
102
  {
103
  "dialog": [
104
  ("Где лучше отдыхать?", "Всё зависит от ваших предпочтений: море, горы, город."),
@@ -107,7 +99,6 @@ dialog_templates = [
107
  ("Где находится Эйфелева башня?", "В Париже, Франция."),
108
  ]
109
  },
110
- # === ФИЛОСОФИЯ ===
111
  {
112
  "dialog": [
113
  ("Что такое любовь?", "Любовь — глубокое чувство привязанности и заботы."),
@@ -116,228 +107,256 @@ dialog_templates = [
116
  ("Что такое свобода?", "Свобода — возможность действовать по своей воле."),
117
  ]
118
  },
119
- # === РАЗВЛЕЧЕНИЯ ===
120
- {
121
- "dialog": [
122
- ("Какой фильм посмотреть?", "Рекомендую современные драмы или классику."),
123
- ("Что почитать?", "Много хороших книг, смотря какой жанр вам нравится."),
124
- ("Как проводить свободное время?", "Можно заниматься спортом, читать, учиться."),
125
- ("Какую музыку послушать?", "Всё зависит от настроения: классика или рок."),
126
- ]
127
- },
128
- # === ЗДОРОВЬЕ ===
129
- {
130
- "dialog": [
131
- ("Как быть здоровым?", "Правильное питание, спорт, сон."),
132
- ("Что делать при простуде?", "Пейте тёплое, отдыхайте, обратитесь к врачу."),
133
- ("Как улучшить память?", "Тренируйте мозг, учите стихи, решайте задачи."),
134
- ("Почему важен сон?", "Сон восстанавливает организм и мозг."),
135
- ]
136
- },
137
- # === ТЕХНОЛОГИИ ===
138
- {
139
- "dialog": [
140
- ("Что такое блокчейн?", "Блокчейн — технология цепочки блоков для хранения данных."),
141
- ("Что такое квантовый компьютер?", "Квантовый компьютер использует законы квантовой физики."),
142
- ("Что такое робототехника?", "Робототехника — наука о создании роботов."),
143
- ]
144
- },
145
- # === ОБЩИЕ ТЕМЫ ===
146
- {
147
- "dialog": [
148
- ("Какая сегодня погода?", "Сегодня солнечно и тепло, отличный день!"),
149
- ("Какой сегодня день?", "Сегодня среда, если я не ошибаюсь."),
150
- ("Что будем делать завтра?", "Завтра будет новый день с новыми возможностями!"),
151
- ("Как провести выходные?", "М��жно устроить пикник или сходить в музей."),
152
- ("Что ты думаешь о будущем?", "Будущее будет наполнено технологиями и открытиями."),
153
- ]
154
- },
155
  ]
156
 
157
- # === 2. ГЕНЕРАЦИЯ МНОГООБРАЗНЫХ ДИАЛОГОВ ===
158
 
159
  def generate_dialog():
160
- """Создаёт многоходовой диалог"""
161
-
162
- # 1. Берём случайный шаблон
163
  template = random.choice(dialog_templates)
164
- base_dialog = template["dialog"]
165
-
166
- # 2. Выбираем случайную пару
167
- q, a = random.choice(base_dialog)
168
-
169
- # 3. Формируем диалог из 2-5 реплик
170
- turns = random.randint(2, 5)
171
- dialog_lines = []
172
-
173
- for i in range(turns):
174
- if i % 2 == 0: # вопрос
175
- if i == 0:
176
- dialog_lines.append(f"Человек: {q}")
177
- else:
178
- # Новый вопрос из другой темы
179
- new_template = random.choice(dialog_templates)
180
- new_q, _ = random.choice(new_template["dialog"])
181
- dialog_lines.append(f"Человек: {new_q}")
182
- else: # ответ
183
- # Вариации ответа
184
- variations = [
185
- a,
186
- f"{a} А что вы думаете?",
187
- f"{a} Это интересный вопрос!",
188
- f"{a} Я надеюсь, это поможет.",
189
- f"{a} Есть ещё вопросы?",
190
- f"Отличный вопрос! {a}",
191
- f"Позвольте подумать... {a}",
192
- f"Определённо! {a}",
193
- f"Конечно! {a}",
194
- ]
195
- answer = random.choice(variations)
196
- dialog_lines.append(f"Ассистент: {answer}")
197
-
198
- # Обновляем вопрос для следующего хода
199
- if i < turns - 1:
200
- new_template = random.choice(dialog_templates)
201
- q, a = random.choice(new_template["dialog"])
202
 
203
- # 4. Добавляем контекст
204
- context = random.choice([
205
- "Разговор начался с приветствия.",
206
- "Диалог продолжается...",
207
- "Интересная беседа.",
208
- "Обсуждение важной темы.",
209
- ])
210
-
211
- # 5. Формируем итоговый текст
212
- full_dialog = "\n".join(dialog_lines)
213
 
214
- # 6. Добавляем теги
215
- tags = random.choice([
216
- f"<dialog>\n{full_dialog}\n</dialog>",
217
- f"[DIALOG]\n{full_dialog}\n[/DIALOG]",
218
- f"Контекст: {context}\n{full_dialog}",
219
- full_dialog,
220
- f"---\n{full_dialog}\n---",
221
- f"# Разговор\n{full_dialog}",
222
- ])
223
 
224
- return tags
 
225
 
226
- def generate_multi_turn_dialog():
227
- """Генерирует длинный диалог с 5-10 репликами"""
228
- turns = random.randint(5, 10)
229
  lines = []
230
 
231
- # Берём случайную тему
232
- topics = [
233
- "работа", "учёба", "хобби", "путешествия", "наука",
234
- "искусство", "технологии", "здоровье", "отношения", "философия"
235
- ]
236
  topic = random.choice(topics)
237
  lines.append(f"Тема: {topic.capitalize()}")
238
 
239
- current_q, current_a = "", ""
240
-
241
  for i in range(turns):
242
  if i % 2 == 0:
243
- # Вопрос
244
  template = random.choice(dialog_templates)
245
- current_q, _ = random.choice(template["dialog"])
246
-
247
- # Разнообразие вопросов
248
  prefixes = ["Скажите, ", "А можно узнать, ", "Подскажите, ", "Интересно, ", ""]
249
  prefix = random.choice(prefixes)
250
- lines.append(f"Человек: {prefix}{current_q.lower()}")
251
  else:
252
- # Ответ с вариациями
 
253
  responses = [
254
- current_a,
255
- f"О, {current_a}",
256
- f"Хорошо, {current_a}",
257
- f"Да, {current_a}",
258
- f"Верно, {current_a}",
259
- f"Конечно же, {current_a}",
260
- f"Без сомнения, {current_a}",
261
  ]
262
  lines.append(f"Ассистент: {random.choice(responses)}")
263
-
264
- # Обновляем для следующего хода
265
- if i < turns - 1:
266
- new_template = random.choice(dialog_templates)
267
- current_q, current_a = random.choice(new_template["dialog"])
268
 
269
  return "\n".join(lines)
270
 
271
- # === 3. СОЗДАНИЕ ДАТАСЕТА ===
272
-
273
- print("🚀 Генерация датасета с диалогами...")
274
-
275
- data = {
276
- "text": [],
277
- "dialog": [],
278
- "turns": []
279
- }
 
280
 
281
- target_size = 100 * 1024 * 1024
282
- current_size = 0
283
 
284
- while current_size < target_size:
285
- # 50% короткие диалоги, 30% средние, 20% длинные
286
- r = random.random()
287
- if r < 0.5:
288
- dialog = generate_dialog()
289
- turns = random.randint(2, 4)
290
- elif r < 0.8:
291
- dialog = generate_multi_turn_dialog()
292
- turns = random.randint(5, 7)
293
- else:
294
- # Супер-длинный диалог
295
- parts = [generate_dialog() for _ in range(random.randint(2, 4))]
296
- dialog = "\n---\n".join(parts)
297
- turns = random.randint(8, 15)
 
 
 
 
 
 
 
 
 
 
298
 
299
- # Добавляем метаданные
300
- full_text = f"{dialog}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
 
302
- data["text"].append(full_text)
303
- data["dialog"].append(dialog)
304
- data["turns"].append(turns)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
 
306
- current_size = len(json.dumps(data, ensure_ascii=False).encode('utf-8'))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
 
308
- if len(data["text"]) % 100 == 0:
309
- print(f"Сгенерировано {len(data['text'])} диалогов, размер: {current_size // 1024 // 1024} МБ")
 
 
 
 
 
 
 
 
310
 
311
- print(f"✅ Готово! {len(data['text'])} диалогов, {current_size // 1024 // 1024} МБ")
312
 
313
- # === 4. СОЗДАНИЕ DATASET ДЛЯ HF ===
314
 
315
- dataset = Dataset.from_dict(data)
 
 
 
 
 
 
 
 
316
 
317
- # Сохраняем локально
318
- os.makedirs("/data", exist_ok=True)
319
- dataset.save_to_disk("/data/dialog_dataset")
320
- print(" Сохранено в /data/dialog_dataset")
321
 
322
- # === 5. ПУШ НА HF (если есть токен) ===
 
 
 
 
 
 
 
 
 
 
 
 
323
 
324
- HF_TOKEN = os.getenv("HF_TOKEN")
325
- USERNAME = "ваш_ник"
 
 
 
 
 
 
 
326
 
327
- if HF_TOKEN:
328
- print("☁️ Загрузка на Hugging Face...")
329
- dataset.push_to_hub(
330
- f"{USERNAME}/Miniset",
331
- token=HF_TOKEN,
332
- private=False,
333
- commit_message="Большой датасет русских диалогов"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
334
  )
335
- print(f"✅ https://huggingface.co/datasets/{USERNAME}/russian-dialogs-dataset")
336
- else:
337
- print("❌ Токен не найден. Датасет сохранён локально.")
338
 
339
- # === 6. ПРИМЕР ДИАЛОГА ===
340
- print("\n📝 Пример диалога:")
341
- print("-" * 50)
342
- print(data["text"][0])
343
- print("-" * 50)
 
1
+ import gradio as gr
2
+ from datasets import Dataset, load_from_disk
3
  import random
4
  import json
5
  import os
6
+ import time
7
+ from threading import Thread
8
 
9
+ # === 1. БАЗА ДИАЛОГОВ (расширенная) ===
10
 
11
  dialog_templates = [
 
12
  {
13
  "dialog": [
14
  ("Привет!", "Здравствуйте! Как я могу вам помочь?"),
 
20
  ("Хай!", "Хай! Что нового?"),
21
  ]
22
  },
 
23
  {
24
  "dialog": [
25
  ("Как дела?", "Всё отлично! А у вас?"),
 
29
  ("Как успехи?", "Успехи есть! Работаю над новыми проектами."),
30
  ]
31
  },
 
32
  {
33
  "dialog": [
34
  ("Кто ты?", "Я искусственный интеллект, созданный чтобы помогать людям."),
35
  ("Что ты умеешь?", "Я умею отвечать на вопросы, писать тексты, помогать с задачами."),
36
  ("Где ты живёшь?", "Я живу в облаке! Всегда рядом с вами."),
37
+ ("Сколько тебе лет?", "Мне несколько лет, но я постоянно учусь."),
38
  ("Зачем ты здесь?", "Я здесь, чтобы помогать людям в их повседневных задачах."),
39
  ("У тебя есть имя?", "Меня зовут AI-ассистент. А вас?"),
40
  ("Ты человек?", "Нет, я компьютерная программа, но стараюсь быть полезной."),
41
  ]
42
  },
 
43
  {
44
  "dialog": [
45
+ ("Почему небо голубое?", "Небо голубое из-за рассеяния Рэлея."),
46
+ ("Как работает интернет?", "Интернет работает через сеть серверов и маршрутизаторов."),
47
  ("Что такое искусственный интеллект?", "ИИ — это технология, позволяющая машинам имитировать человеческий разум."),
48
+ ("Что такое нейросети?", "Нейросети — это алгоритмы, вдохновлённые структурой мозга."),
49
+ ("Почему трава зелёная?", "Трава зелёная из-за хлорофилла."),
50
  ("Когда появилась жизнь на Земле?", "Жизнь появилась около 3,5 миллиардов лет назад."),
51
  ("Сколько планет в солнечной системе?", "В солнечной системе 8 планет."),
52
  ("Что такое чёрная дыра?", "Чёрная дыра — область пространства с огромной гравитацией."),
 
 
53
  ]
54
  },
 
55
  {
56
  "dialog": [
57
  ("Кто написал Войну и мир?", "Войну и мир написал Лев Толстой."),
 
63
  ("Кто такой Пушкин?", "Александр Пушкин — великий русский поэт."),
64
  ]
65
  },
 
66
  {
67
  "dialog": [
68
  ("Где можно купить хлеб?", "Хлеб можно купить в ближайшем супермаркете."),
 
71
  ("Как пройти в библиотеку?", "Пройдите прямо, затем поверните налево."),
72
  ("Что посмотреть вечером?", "Рекомендую хороший фильм или книгу."),
73
  ("Как выучить язык?", "Нужна регулярная практика и мотивация."),
 
74
  ]
75
  },
 
76
  {
77
  "dialog": [
78
  ("Как выучить Python?", "Начните с основ: переменные, циклы, функции."),
 
80
  ("Как создать сайт?", "Нужно знать HTML, CSS, JavaScript и серверный язык."),
81
  ("Что такое Git?", "Git — система контроля версий для кода."),
82
  ("Как стать разработчиком?", "Много практикуйтесь, изучайте алгоритмы."),
83
+ ("Что такое Docker?", "Docker — платформа для контейнеризации приложений."),
84
  ]
85
  },
 
86
  {
87
  "dialog": [
88
  ("Как справиться со стрессом?", "Помогают медитация, отдых и спорт."),
 
91
  ("Почему люди счастливы?", "Счастье в простых вещах: любви, здоровье, увлечениях."),
92
  ]
93
  },
 
94
  {
95
  "dialog": [
96
  ("Где лучше отдыхать?", "Всё зависит от ваших предпочтений: море, горы, город."),
 
99
  ("Где находится Эйфелева башня?", "В Париже, Франция."),
100
  ]
101
  },
 
102
  {
103
  "dialog": [
104
  ("Что такое любовь?", "Любовь — глубокое чувство привязанности и заботы."),
 
107
  ("Что такое свобода?", "Свобода — возможность действовать по своей воле."),
108
  ]
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} А что вы думаете?",
123
+ f"{a} Это интересный вопрос!",
124
+ f"{a} Я надеюсь, это поможет.",
125
+ f"{a} Есть ещё вопросы?",
126
+ ]
127
+ answer = random.choice(variations)
 
128
 
129
+ # Разнообразие вопросов
130
+ prefixes = ["Скажите, ", "А можно узнать, ", "Подскажите, ", "Интересно, ", ""]
131
+ prefix = random.choice(prefixes)
 
 
 
 
 
 
132
 
133
+ dialog = f"Человек: {prefix}{q.lower()}\nАссистент: {answer}"
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()}")
145
 
 
 
146
  for i in range(turns):
147
  if i % 2 == 0:
 
148
  template = random.choice(dialog_templates)
149
+ q, _ = random.choice(template["dialog"])
 
 
150
  prefixes = ["Скажите, ", "А можно узнать, ", "Подскажите, ", "Интересно, ", ""]
151
  prefix = random.choice(prefixes)
152
+ lines.append(f"Человек: {prefix}{q.lower()}")
153
  else:
154
+ template = random.choice(dialog_templates)
155
+ _, a = random.choice(template["dialog"])
156
  responses = [
157
+ a,
158
+ f"О, {a}",
159
+ f"Хорошо, {a}",
160
+ f"Да, {a}",
161
+ f"Верно, {a}",
162
+ f"Конечно же, {a}",
163
+ f"Без сомнения, {a}",
164
  ]
165
  lines.append(f"Ассистент: {random.choice(responses)}")
 
 
 
 
 
166
 
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):
174
+ if random.random() > 0.5:
175
+ dialogs.append(generate_long_dialog())
176
+ else:
177
+ dialogs.append(generate_dialog())
178
+ return "\n\n---\n\n".join(dialogs)
179
 
180
+ # === 3. СОСТОЯНИЕ ГЕНЕРАЦИИ ===
 
181
 
182
+ class DatasetGenerator:
183
+ def __init__(self):
184
+ self.data = {"text": [], "dialog": [], "turns": []}
185
+ self.target_size = 100 * 1024 * 1024
186
+ self.current_size = 0
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")
198
+ self.data["text"] = list(dataset["text"])
199
+ self.data["dialog"] = list(dataset["dialog"])
200
+ self.data["turns"] = list(dataset["turns"])
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 = []
212
+
213
+ for _ in range(batch_size):
214
+ if random.random() < 0.3:
215
+ dialog = generate_dialog_batch()
216
+ turns = random.randint(5, 15)
217
+ elif random.random() < 0.6:
218
+ dialog = generate_long_dialog()
219
+ turns = random.randint(5, 12)
220
+ else:
221
+ dialog = generate_dialog()
222
+ turns = random.randint(2, 4)
223
+
224
+ new_texts.append(dialog)
225
+ new_dialogs.append(dialog)
226
+ new_turns.append(turns)
227
+
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)
242
+
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 = {
267
+ "text": self.data["text"][i],
268
+ "dialog": self.data["dialog"][i],
269
+ "turns": self.data["turns"][i]
270
+ }
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,
279
+ "target_mb": self.target_size // 1024 // 1024,
280
+ "percent": min(percent, 100),
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
+
346
+ stop_btn.click(stop_generation, outputs=[status_output])
347
+ stop_btn.click(get_status, outputs=[status_output])
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)