Delete t.py
Browse files
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()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|