- BrainTools - https://www.braintools.ru -
Авторское право и лицензия
Код, представленный в статье, написан Await IT (await.it.bx@gmail.com [1])
и распространяется под лицензией MIT с обязательным указанием авторства.
Дата публикации кода: 01.06.2026
GitHub репозиторий: https://github.com/Await [2]-IT/GPT-Like
[3] © 2026 Await IT. Все права на исходный код защищены.
Когда все вокруг пользуются ChatGPT и Claude, возникает естественный вопрос: а что, если попробовать сделать нечто подобное самому? Не для того, чтобы конкурировать с гигантами, а чтобы понять изнутри, как работают современные языковые модели.
Этот проект — моя попытка пройти весь путь: от токенизации текста до генерации кода. Не используя готовые решения от HuggingFace, а реализуя каждый компонент самостоятельно. И знаете что? Это оказалось одновременно сложнее и интереснее, чем я предполагал.
Обычный BPE-токенизатор ломается на Python-коде. Он не понимает:
Значимость отступов
Разницу между def как ключевым словом и def как частью слова
Структуру кода (классы, функции, условия)
class CodeTokenizer:
@staticmethod
def tokenize_python_code(code):
tokens = []
try:
token_stream = tokenize.generate_tokens(io.StringIO(code).readline)
for tok in token_stream:
token_type = tokenize.tok_name[tok.type]
token_value = tok.string
if token_type == 'INDENT':
tokens.append(Config.code_indent_token)
elif token_type == 'DEDENT':
tokens.append(Config.code_dedent_token)
# ... обработка ключевых слов, строк, чисел
Что это даёт?
<indent>/<dedent> вместо четырёх пробелов — модель учится структуре
<def>, <class>, <if> как специальные токены — понимание синтаксиса
<string>, <number>, <comment> — типовая информация
# Исходный код:
def factorial(n):
if n == 0:
return 1
# Токенизация:
['<def>', 'factorial', '(', 'n', ')', ':', '<newline>',
'<indent>', '<if>', 'n', '==', '<number>', ':', '<newline>',
'<indent>', '<return>', '<number>', '<newline>', '<dedent>']
Первая версия использовала nn.TransformerEncoder — это архитектура BERT, а не GPT. GPT требует маскированного внимания [5] (look-ahead mask), чтобы токен “видел” только предыдущие токены.
# Было (НЕПРАВИЛЬНО):
encoder_layer = nn.TransformerEncoderLayer(...)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers)
# Стало (правильнее, но ещё не идеально):
def generate_attention_mask(self, seq_len, device):
mask = torch.triu(torch.ones(seq_len, seq_len, device=device), diagonal=1).bool()
return mask
Использование nn.Embedding для позиций — подход 2018 года. Современные модели используют:
RoPE (Rotary Positional Embeddings) — как в LLaMA
ALiBi — как в MPT
Sinusoidal — классика, но лучше, чем learnable
Я оставил learnable эмбеддинги для простоты, но в README проекта честно указал это как ограничение.
У меня не было доступа к терабайтам текста. Только небольшие датасеты с:
Примерами Python-кода
Диалогами в формате вопрос-ответ
Техническими статьями
Аугментация данных: перестановка строк кода, замена имён переменных
Контролируемая генерация: использование специальных токенов <user>, <bot>
Смешанная точность (AMP): позволила увеличить batch size
def fast_train_step(model, batch, optimizer, scaler=None, use_amp=False):
if use_amp and scaler is not None:
with torch.cuda.amp.autocast(): # Mixed precision
outputs = model(inputs)
loss = model.compute_loss(outputs, targets)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
# ...
Токенизатор работает отлично — корректно разбирает сложный Python-код
Модель обучается — loss стабильно снижается
Генерация синтаксически корректного кода (в простых случаях)
Вход: <user> Напиши функцию для суммы двух чисел
Выход: <bot> <start>
def add_numbers(a, b):
result = a + b
return result
<end>
Логические ошибки [6] — модель генерирует синтаксически правильный, но семантически бессмысленный код
Ограниченный контекст — 1024 токена недостаточно для сложных программ
Переобучение на маленьких данных — модель запоминает примеры, а не учится общим принципам
class TransformerModel(nn.Module):
def __init__(self, vocab_size, d_model=256, n_head=8,
num_layers=6, d_ff=2048, dropout=0.1):
super().__init__()
self.token_embedding = nn.Embedding(vocab_size, d_model)
self.position_embedding = nn.Embedding(max_seq_len, d_model)
# ... Transformer слои
Параметры модели:
d_model: 256 (микроскопически мало, но для обучения [7] достаточно)
Слои: 6
Головы внимания: 8
Всего параметров: ~10 миллионов (GPT-3: 175 миллиардов)
# 1. Токенизация данных
tokenizer.train(Config.pretrain_file, Config.vocab_size)
# 2. Создание датасета
dataset = DialogDataset(file_path, tokenizer, max_length)
# 3. Обучение модели
model = train_fast(model, train_loader, val_loader, epochs=30)
# 4. Генерация
text = generate_text(model, tokenizer, prompt, max_length=100)
Плохая токенизация = плохая модель. Особенно для кода.
Можно иметь идеальную архитектуру, но без качественных данных модель не научится.
Когда модель генерирует ерунду, непонятно: проблема в данных, архитектуре или обучении?
Каждый issue и PR на GitHub учил меня чему-то новому.
git clone https://github.com/Await-IT/GPT-Like
cd educational-gpt-python
pip install -r requirements.txt
python train.py
from src.tokenizer import ImprovedBPETokenizer
from src.model import TransformerModel
# Создайте свою модель
model = TransformerModel(vocab_size=50000)
# Обучите на своих данных
# Экспериментируйте с архитектурой
Слишком маленькая модель
Устаревшие компоненты (нет RoPE, SwiGLU)
Нет эффективных оптимизаций (FlashAttention)
Только Python (хотя токенизатор можно расширить)
Реализация RoPE — уже в работе
Поддержка больше языков — JavaScript, Java, C++
Увеличение масштаба — переход к моделям на 100M+ параметров
Интеграция с IDE — плагин для VSCode
Этот проект — не про создание конкурента ChatGPT. Это про понимание. Про то, чтобы за красивым интерфейсом и плавными ответами увидеть сложную систему из эмбеддингов, внимания и слоев нормализации.
Самые важные уроки:
Начинайте с простого — даже минимальная работающая модель даёт невероятное понимание
Не бойтесь ошибок — каждая ошибка в архитектуре учит лучше, чем успех
Делитесь кодом — обратная связь от сообщества бесценна
GitHub репозиторий: https://github.com/Await [2]-IT/GPT-Like
Colab ноутбук для быстрого старта: (в разработке)
Документация API: (в разработке)
Проект распространяется под MIT лицензией. Вы можете:
Использовать код в коммерческих проектах
Модифицировать и распространять изменения
Использовать в академических работах
Единственное условие: сохранение уведомления об авторских правах.
Это учебный проект. Для production использования рекомендую библиотеки типа HuggingFace Transformers, которые реализуют современные архитектуры с оптимизациями.
Для тех, кто хочет глубже: в репозитории есть issues с пометкой “good first issue” — отличные задачи для начала контрибьютинга. А если у вас есть идеи, как улучшить токенизатор или архитектуру — welcome to PR!
P.S. Если статья была полезной, посетите наш Телеграмм канал [8]
Автор: Await-IT
Источник [9]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/25565
URLs in this post:
[1] await.it.bx@gmail.com: mailto:orionai67@gmail.com
[2] https://github.com/Await: https://github.com/Await
[3]
: https://github.com/%D0%B2%D0%B0%D1%88-username/educational-gpt-python%EF%BF%BC
[4] Image: https://sourcecraft.dev/
[5] внимания: http://www.braintools.ru/article/7595
[6] ошибки: http://www.braintools.ru/article/4192
[7] обучения: http://www.braintools.ru/article/5125
[8] Телеграмм канал: https://t.me/Await_IT
[9] Источник: https://habr.com/ru/articles/995838/?utm_source=habrahabr&utm_medium=rss&utm_campaign=995838
Нажмите здесь для печати.