X commited on
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,12 +1,14 @@
|
|
| 1 |
-
|
|
|
|
| 2 |
import random
|
| 3 |
import json
|
| 4 |
import os
|
|
|
|
|
|
|
| 5 |
|
| 6 |
-
# === 1. Б
|
| 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 |
-
|
| 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 |
-
#
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
"
|
| 207 |
-
"
|
| 208 |
-
"
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
full_dialog = "\n".join(dialog_lines)
|
| 213 |
|
| 214 |
-
#
|
| 215 |
-
|
| 216 |
-
|
| 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 |
-
|
|
|
|
| 225 |
|
| 226 |
-
def
|
| 227 |
-
"""Генерирует длинный диалог
|
| 228 |
-
turns = random.randint(5,
|
| 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 |
-
|
| 246 |
-
|
| 247 |
-
# Разнообразие вопросов
|
| 248 |
prefixes = ["Скажите, ", "А можно узнать, ", "Подскажите, ", "Интересно, ", ""]
|
| 249 |
prefix = random.choice(prefixes)
|
| 250 |
-
lines.append(f"Человек: {prefix}{
|
| 251 |
else:
|
| 252 |
-
|
|
|
|
| 253 |
responses = [
|
| 254 |
-
|
| 255 |
-
f"О, {
|
| 256 |
-
f"Хорошо, {
|
| 257 |
-
f"Да, {
|
| 258 |
-
f"Верно, {
|
| 259 |
-
f"Конечно же, {
|
| 260 |
-
f"Без сомнения, {
|
| 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 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
|
|
|
| 280 |
|
| 281 |
-
|
| 282 |
-
current_size = 0
|
| 283 |
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 298 |
|
| 299 |
-
|
| 300 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 301 |
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 305 |
|
| 306 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 307 |
|
| 308 |
-
|
| 309 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 310 |
|
| 311 |
-
|
| 312 |
|
| 313 |
-
|
| 314 |
|
| 315 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 316 |
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
|
| 322 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 323 |
|
| 324 |
-
|
| 325 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 326 |
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 334 |
)
|
| 335 |
-
print(f"✅ https://huggingface.co/datasets/{USERNAME}/russian-dialogs-dataset")
|
| 336 |
-
else:
|
| 337 |
-
print("❌ Токен не найден. Датасет сохранён локально.")
|
| 338 |
|
| 339 |
-
# === 6. П
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 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)
|
|
|