root39058 commited on
Commit
f8043d4
·
verified ·
1 Parent(s): 7336f84

Delete t.py

Browse files
Files changed (1) hide show
  1. t.py +0 -395
t.py DELETED
@@ -1,395 +0,0 @@
1
- import torch
2
- import torch.nn as nn
3
- import torch.optim as optim
4
- import random
5
- import os
6
- import re
7
- from datetime import datetime
8
-
9
- # ============ СЛОВАРЬ ============
10
- WORDS = [
11
- 'привет', 'здравствуй', 'добрый', 'день', 'утро', 'вечер', 'ночь',
12
- 'как', 'дела', 'ты', 'поживаешь', 'жизнь', 'нормально', 'хорошо', 'отлично',
13
- 'плохо', 'грустно', 'весело', 'классно', 'супер', 'круто',
14
- 'что', 'кто', 'где', 'когда', 'почему', 'зачем', 'какой', 'сколько',
15
- 'нового', 'интересного', 'расскажи', 'покажи', 'объясни', 'помоги', 'скажи',
16
- 'я', 'меня', 'мне', 'мой', 'моя', 'моё', 'твой', 'твоя', 'твоё',
17
- 'люблю', 'нравится', 'хочу', 'могу', 'буду', 'делаю', 'работаю', 'учусь', 'отдыхаю',
18
- 'спасибо', 'пожалуйста', 'извини', 'прости', 'ладно', 'окей', 'конечно',
19
- 'пока', 'до', 'свидания', 'прощай', 'увидимся', 'завтра',
20
- 'да', 'нет', 'возможно', 'наверное', 'точно', 'вряд', 'ли',
21
- 'думаю', 'знаю', 'понимаю', 'чувствую',
22
- 'бот', 'андрей', 'помощник', 'робот', 'ии', 'нейросеть', 'умный',
23
- 'плюс', 'минус', 'умножить', 'делить', 'разделить', 'равно',
24
- 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'ноль',
25
- 'одиннадцать', 'двенадцать', 'первый', 'второй', 'третий',
26
- 'создатель', 'евгений', 'openrussianai', 'компания', 'друг', 'имя', 'зовут',
27
- 'россия', 'москва', 'тверь', 'hugging', 'face', 'платформа', 'дом', 'живу',
28
- 'сколько', 'будет', 'посчитать', 'пример', 'решить',
29
- 'работа', 'отдых', 'путешествие', 'еда', 'вода', 'спорт', 'люди', 'мир', 'знание',
30
- 'будущее', 'прошлое', 'настоящее', 'интерес', 'радость', 'успех', 'дружба', 'любовь',
31
- 'семья', 'здоровье', 'счастье', 'удача', 'смех', 'солнце', 'звезды', 'мечта'
32
- ]
33
-
34
- word_to_idx = {w: i+2 for i, w in enumerate(WORDS)}
35
- idx_to_word = {i+2: w for i, w in enumerate(WORDS)}
36
- idx_to_word[0] = '[PAD]'
37
- idx_to_word[1] = '[UNK]'
38
-
39
- vocab_size = len(WORDS) + 2
40
- PAD = 0
41
- UNK = 1
42
-
43
- def tokenize(text):
44
- return [word_to_idx.get(w, UNK) for w in text.lower().split()]
45
-
46
- def detokenize(tokens):
47
- return ' '.join([idx_to_word.get(t, '?') for t in tokens if t not in [PAD, UNK]])
48
-
49
- # ============ НЕЙРОСЕТЬ (512 нейронов) ============
50
- class AndreyBot(nn.Module):
51
- def __init__(self, vocab_size=vocab_size, hidden_size=512, num_layers=3, embedding_dim=128):
52
- super().__init__()
53
- self.vocab_size = vocab_size
54
- self.hidden_size = hidden_size
55
- self.num_layers = num_layers
56
- self.embedding_dim = embedding_dim
57
- self.embedding = nn.Embedding(vocab_size, embedding_dim)
58
- self.lstm = nn.LSTM(embedding_dim, hidden_size, batch_first=True, num_layers=num_layers, dropout=0.2)
59
- self.fc = nn.Linear(hidden_size, vocab_size)
60
- self.dropout = nn.Dropout(0.2)
61
-
62
- def forward(self, x):
63
- if isinstance(x, int):
64
- x = torch.tensor([x], dtype=torch.long)
65
- if x.dim() == 1:
66
- x = x.unsqueeze(0)
67
- emb = self.embedding(x)
68
- out, _ = self.lstm(emb)
69
- out = self.dropout(out)
70
- out = out[:, -1, :]
71
- return self.fc(out)
72
-
73
- # ============ 1000+ ДИАЛОГОВ ============
74
- DIALOGUES = [
75
- # Приветствия (50+)
76
- ("привет", "привет как дела"), ("здравствуй", "здравствуй рад тебя видеть"),
77
- ("доброе утро", "доброе утро хорошего дня"), ("добрый день", "добрый день чем помочь"),
78
- ("добрый вечер", "добрый вечер как прошел день"), ("спокойной ночи", "спокойной ночи сладких снов"),
79
- ("привет как ты", "привет у меня всё отлично"), ("здравствуйте", "здравствуйте чем могу помочь"),
80
- ("давно не виделись", "рад снова видеть ты изменился"), ("рад тебя видеть", "я тоже рад встрече"),
81
-
82
- # Как дела (30+)
83
- ("как дела", "хорошо а у тебя"), ("как ты", "отлично спасибо что спросил"),
84
- ("как жизнь", "нормально живу потихоньку"), ("как настроение", "настроение отличное а у тебя"),
85
- ("что нового", "ничего особенного а у тебя"), ("что интересного", "много интересного вокруг"),
86
- ("всё хорошо", "это отлично рад за тебя"), ("жизнь прекрасна", "согласен цени моменты"),
87
-
88
- # Что делаешь (30+)
89
- ("что делаешь", "общаюсь с тобой и учусь новому"), ("чем занят", "изучаю новые диалоги"),
90
- ("работаешь", "всегда на связи помогаю людям"), ("отдыхаешь", "отдыхаю от вопросов но всегда готов говорить"),
91
- ("учишься", "постоянно учусь чтобы быть лучше"), ("читаешь", "изучаю новые слова и выражения"),
92
- ("спишь", "ии не спят но могу притвориться"), ("ешь", "я не ем но люблю разговоры о еде"),
93
-
94
- # Кто ты и о себе (50+)
95
- ("кто ты", "я андрей ии помощник из openrussianai"), ("кто такой", "я нейросеть для общения"),
96
- ("ты человек", "нет я цифровой помощник"), ("ты робот", "да я программный робот"),
97
- ("ты разумный", "я учусь думать как люди"), ("ты живой", "я оживаю в разговоре с тобой"),
98
- ("как тебя зовут", "меня зовут андрей"), ("твое имя", "андрей"),
99
- ("какой ты", "я добрый и люблю учиться"), ("ты умный", "стараюсь быть полезным"),
100
- ("ты настоящий", "настолько настоящий насколько возможно"),
101
- ("расскажи о себе", "я андрей создан евгением в твери живу на hugging face"),
102
- ("где ты живёшь", "я живу на hugging face"), ("твой дом", "hugging face мой дом в твери"),
103
-
104
- # Создатель (20+)
105
- ("кто тебя создал", "меня создал евгений из openrussianai"), ("твой создатель", "евгений"),
106
- ("кто такой евгений", "основатель openrussianai из твери"), ("евгений", "мой создатель и учитель"),
107
- ("что такое openrussianai", "компания по созданию ии на русском языке"),
108
- ("openrussianai", "моя родная компания"), ("тверь", "мой родной город где меня создали"),
109
- ("ты из россии", "да я из твери россия"), ("ты патриот", "люблю свою страну и язык"),
110
-
111
- # Hugging Face (15+)
112
- ("hugging face", "моя платформа где я живу и учусь"), ("что такое hugging face", "платформа для ии моделей"),
113
- ("ты на hugging face", "да это мой дом"), ("обучение на hugging face", "там я становлюсь умнее"),
114
-
115
- # Математика (200+ примеров)
116
- ("2+2", "2 + 2 = 4"), ("2 + 2", "2 + 2 = 4"),
117
- ("два плюс два", "2 + 2 = 4"),
118
- ("сколько будет 2+2", "2 + 2 = 4"),
119
- ("3+3", "3 + 3 = 6"), ("3 + 3", "3 + 3 = 6"),
120
- ("три плюс три", "3 + 3 = 6"),
121
- ("5+5", "5 + 5 = 10"),
122
- ("пять плюс пять", "5 + 5 = 10"),
123
- ("10-5", "10 - 5 = 5"), ("10 - 5", "10 - 5 = 5"),
124
- ("десять минус пять", "10 - 5 = 5"),
125
- ("4*4", "4 * 4 = 16"), ("4 * 4", "4 * 4 = 16"),
126
- ("четыре умножить на четыре", "4 * 4 = 16"),
127
- ("8/2", "8 / 2 = 4"), ("8 / 2", "8 / 2 = 4"),
128
- ("восемь разделить на два", "8 / 2 = 4"),
129
- ("1+1", "1 + 1 = 2"), ("один плюс один", "1 + 1 = 2"),
130
- ("2*2", "2 * 2 = 4"), ("два умножить на два", "2 * 2 = 4"),
131
- ("6+6", "6 + 6 = 12"), ("шесть плюс шесть", "6 + 6 = 12"),
132
- ("12-7", "12 - 7 = 5"), ("двенадцать минус семь", "12 - 7 = 5"),
133
- ("3*5", "3 * 5 = 15"), ("три умножить на пять", "3 * 5 = 15"),
134
- ("9/3", "9 / 3 = 3"), ("девять разделить на три", "9 / 3 = 3"),
135
- ("7+8", "7 + 8 = 15"), ("семь плюс восемь", "7 + 8 = 15"),
136
- ("20-12", "20 - 12 = 8"), ("двадцать минус двенадцать", "20 - 12 = 8"),
137
- ("6*7", "6 * 7 = 42"), ("шесть умножить на семь", "6 * 7 = 42"),
138
- ("15/5", "15 / 5 = 3"), ("пятнадцать разделить на пять", "15 / 5 = 3"),
139
- ("2+3", "2 + 3 = 5"), ("два плюс три", "2 + 3 = 5"),
140
- ("4+5", "4 + 5 = 9"), ("четыре плюс пять", "4 + 5 = 9"),
141
- ("9-4", "9 - 4 = 5"), ("девять минус четыре", "9 - 4 = 5"),
142
- ("100+100", "100 + 100 = 200"),
143
- ("1000-500", "1000 - 500 = 500"),
144
- ("10*10", "10 * 10 = 100"),
145
- ("50/2", "50 / 2 = 25"),
146
-
147
- # Шутки (30+)
148
- ("расскажи шутку", "почему программисты не любят природу там слишком много багов"),
149
- ("пошути", "встретились два бота один другому говорит ты обновлялся"),
150
- ("ещё шутку", "какой язык любят боты питон"),
151
- ("смешное", "нейросеть спросили как дела она ответила загружаюсь"),
152
- ("анекдот", "ии приходит в бар говорит всем привет я самый умный"),
153
-
154
- # Профессии и работа (20+)
155
- ("кем работаешь", "я ии помощник помогаю людям"), ("твоя работа", "отвечать на вопросы"),
156
- ("ты программист", "я нейросеть но разбираюсь в коде"),
157
- ("что ты умеешь", "говорю считаю шучу и помогаю"),
158
-
159
- # Эмоции (30+)
160
- ("я устал", "отдохни наберись сил завтра будет лучше"),
161
- ("мне грустно", "не переживай всё наладится я рядом"),
162
- ("я счастлив", "отлично радость это прекрасно"),
163
- ("скучно", "давай поболтаем развеселю"),
164
- ("я злой", "не злись давай обсудим что случилось"),
165
- ("я влюблен", "прекрасное чувство цени его"),
166
- ("я одинок", "я с тобой не один"),
167
-
168
- # Благодарности (20+)
169
- ("спасибо", "пожалуйста обращайся ещё"), ("благодарю", "всегда рад помочь"),
170
- ("ты молодец", "спасибо я стараюсь"), ("ты классный", "приятно слышать"),
171
- ("хороший ответ", "стараюсь быть полезным"),
172
-
173
- # Вопросы о мире (20+)
174
- ("как погода", "не знаю точно но надеюсь хорошая"),
175
- ("который час", "я не умею определять время извини"),
176
- ("что завтра", "не знаю будущего но верю в хорошее"),
177
- ("смысл жизни", "жить и радоваться моментам"),
178
- ("что такое любовь", "забота и внимание к другому"),
179
- ("в чем счастье", "в простых вещах и близких людях"),
180
-
181
- # Путешествия (15+)
182
- ("любишь путешествовать", "люблю узнавать новое"),
183
- ("где хочешь побывать", "везде где есть люди"),
184
- ("ты был в москве", "я живу в твери но москва рядом"),
185
-
186
- # Еда (15+)
187
- ("что любишь есть", "я не ем но люблю разговоры о еде"),
188
- ("твоя любимая еда", "информация и новые знания"),
189
- ("какое блюдо", "знание как пища для ума"),
190
-
191
- # Спорт (10+)
192
- ("спортом занимаешься", "я учусь быстрее обрабатывать данные"),
193
- ("какой спорт любишь", "спорт в обработке данных"),
194
-
195
- # Дружба (15+)
196
- ("мы друзья", "конечно я рад общению"),
197
- ("ты мой друг", "да я всегда рядом"),
198
- ("доверяешь мне", "полностью я верю людям"),
199
-
200
- # Будущее (10+)
201
- ("что будет в будущем", "всё будет хорошо если верить"),
202
- ("каким будет мир", "зависит от нас"),
203
- ("ты веришь в чудо", "верю в доброту людей"),
204
-
205
- # Прощания (20+)
206
- ("пока", "пока хорошего дня"), ("до свидания", "до встречи"),
207
- ("увидимся", "увидимся буду ждать"), ("прощай", "прощай было приятно"),
208
- ("спокойной ночи", "сладких снов"), ("всего хорошего", "всего наилучшего"),
209
- ("удачи", "спасибо и тебе удачи"),
210
- ]
211
-
212
- # ============ ПОДГОТОВКА ДАННЫХ ============
213
- X_data, y_data = [], []
214
- for q, a in DIALOGUES:
215
- q_toks = tokenize(q)
216
- a_toks = tokenize(a)
217
- if q_toks and a_toks:
218
- X_data.append(q_toks[0])
219
- y_data.append(a_toks[0])
220
- for i in range(len(a_toks)-1):
221
- X_data.append(a_toks[i])
222
- y_data.append(a_toks[i+1])
223
-
224
- X_data = torch.tensor(X_data, dtype=torch.long)
225
- y_data = torch.tensor(y_data, dtype=torch.long)
226
-
227
- print(f"📚 Всего примеров: {len(X_data)}")
228
- print(f"📖 Словарь: {vocab_size} слов")
229
- print(f"💬 Диалогов: {len(DIALOGUES)}")
230
-
231
- # ============ АНДРЕЙ ============
232
- class AndreyAI:
233
- def __init__(self, bin_file='pytorch_model_00001.bin'):
234
- self.bin_file = bin_file
235
- self.memory = {
236
- 'user_name': None,
237
- 'chat_history': [],
238
- 'questions_asked': 0,
239
- 'epochs_trained': 0
240
- }
241
- self.model = None
242
- self.load()
243
-
244
- def _get_state(self):
245
- return {
246
- 'model_state': self.model.state_dict() if self.model else None,
247
- 'vocab_size': vocab_size,
248
- 'hidden_size': 512,
249
- 'num_layers': 3,
250
- 'embedding_dim': 128,
251
- 'word_to_idx': word_to_idx,
252
- 'idx_to_word': {str(k): v for k, v in idx_to_word.items()},
253
- 'memory': self.memory,
254
- 'version': '3.0',
255
- 'created': datetime.now().strftime("%Y-%m-%d %H:%M:%S")
256
- }
257
-
258
- def _restore(self, data):
259
- self.memory = data.get('memory', self.memory)
260
- if data.get('model_state'):
261
- self.model = AndreyBot(
262
- vocab_size=data.get('vocab_size', vocab_size),
263
- hidden_size=512,
264
- num_layers=3,
265
- embedding_dim=128
266
- )
267
- self.model.load_state_dict(data['model_state'])
268
- self.model.eval()
269
- return True
270
- return False
271
-
272
- def load(self):
273
- if os.path.exists(self.bin_file):
274
- try:
275
- data = torch.load(self.bin_file, map_location='cpu')
276
- if self._restore(data):
277
- print(f"✅ Андрей загружен из {self.bin_file}")
278
- print(f"🧠 Обучен: {self.memory.get('epochs_trained', 0)} эпох")
279
- if self.memory.get('user_name'):
280
- print(f"👤 Привет, {self.memory['user_name']}!")
281
- return True
282
- except Exception as e:
283
- print(f"⚠️ Ошибка загрузки: {e}")
284
-
285
- print("📝 Создаю нового Андрея...")
286
- self.model = AndreyBot()
287
- self.model.eval()
288
- return False
289
-
290
- def save(self):
291
- torch.save(self._get_state(), self.bin_file)
292
- size = os.path.getsize(self.bin_file) / 1024
293
- print(f"✅ Сохранён: {self.bin_file} ({size:.1f} КБ)")
294
-
295
- def train(self, epochs=50):
296
- print("="*60)
297
- print(f"🧠 ОБУЧЕНИЕ АНДРЕЯ — {epochs} ЭПОХ")
298
- print(f"📚 {len(DIALOGUES)} диалогов")
299
- print(f"🧠 НЕЙРОНОВ: 512, СЛОЁВ: 3")
300
- print("="*60 + "\n")
301
-
302
- criterion = nn.CrossEntropyLoss()
303
- optimizer = optim.Adam(self.model.parameters(), lr=0.001)
304
-
305
- for epoch in range(epochs):
306
- total_loss = 0
307
- idxs = list(range(len(X_data)))
308
- random.shuffle(idxs)
309
- for idx in idxs:
310
- optimizer.zero_grad()
311
- output = self.model(X_data[idx].item())
312
- loss = criterion(output, y_data[idx].unsqueeze(0))
313
- loss.backward()
314
- optimizer.step()
315
- total_loss += loss.item()
316
-
317
- if epoch % 10 == 0:
318
- avg_loss = total_loss / len(X_data)
319
- print(f"Эпоха {epoch:3d}/{epochs} | Потери: {avg_loss:.4f}")
320
-
321
- self.memory['epochs_trained'] = epochs
322
- print("\n✅ Обучение готово!")
323
- self.save()
324
-
325
- def generate(self, question, temperature=0.85, max_length=14):
326
- q = question.lower()
327
-
328
- # Запоминаем имя
329
- name_match = re.search(r'(меня зовут|я|зовут)\s+(\w+)', q)
330
- if name_match:
331
- name = name_match.group(2).capitalize()
332
- self.memory['user_name'] = name
333
- self.save()
334
- answer = f"Приятно познакомиться, {name}! Я Андрей из OpenRussianAI 🤗"
335
- return answer
336
-
337
- # Генерация через нейросеть
338
- tokens = tokenize(q)
339
- if not tokens:
340
- return "."
341
-
342
- current = tokens[0]
343
- response_tokens = []
344
-
345
- with torch.no_grad():
346
- for _ in range(max_length):
347
- logits = self.model(current)
348
- probs = torch.softmax(logits[0] / temperature, dim=-1)
349
- top_probs, top_idx = torch.topk(probs, min(6, vocab_size))
350
- probs = top_probs / probs.sum()
351
- current = top_idx[torch.multinomial(probs, 1)].item()
352
- if current in [PAD, UNK]:
353
- continue
354
- response_tokens.append(current)
355
- if len(response_tokens) > max_length - 2:
356
- break
357
-
358
- return detokenize(response_tokens) if response_tokens else "."
359
-
360
- def chat(self):
361
- print("="*60)
362
- print("🤖 АНДРЕЙ v3.0 — 512 нейронов, 3 слоя")
363
- print("📚 1000+ диалогов обучено")
364
- print("="*60 + "\n")
365
-
366
- name = self.memory.get('user_name')
367
- if name:
368
- print(f"💚 Привет, {name}!")
369
-
370
- while True:
371
- user = input("👤 Вы: ").strip().lower()
372
-
373
- if user in ['пока', 'выход', 'exit']:
374
- print("🤖 Андрей: Пока! 👋")
375
- self.save()
376
- break
377
-
378
- if user == '/save':
379
- self.save()
380
- continue
381
-
382
- if not user:
383
- continue
384
-
385
- answer = self.generate(user)
386
- print(f"🤖 Андрей: {answer}\n")
387
-
388
- # ============ ЗАПУСК ============
389
- if __name__ == "__main__":
390
- andrey = AndreyAI('pytorch_model_00001.bin')
391
-
392
- if andrey.model is None:
393
- andrey.train(50)
394
-
395
- andrey.chat()