Данная статья не инструкция к действию, а просто моя история из жизни. В прошлых материалах я упоминал, что работаю преподавателем в центре для одарённых школьников.
Центров этих в районе десятка по стране. И до этого года все они работали на базе общей информационной системы.
❯ Что было в этой системе
На самом деле система не очень сложная. По сути электронный журнал с дополнительными фишками. Был личный кабинет для админа, преподавателя и обучающихся. Список учебных программ и мониторинг успеваемости. Написана она была на django, но что было под капотом я не знаю, т.к. доступа у меня не было.
❯ В этом году появилось несколько проблем
Ранее все программы в систему вносила техническая поддержка — тогда их количество было относительно небольшим. Сейчас же объём программ настолько возрос, что поддержка уже не в состоянии их обработать. Хотя в целом этот вопрос постепенно решается, попутно возникло несколько дополнительных проблем — преимущественно экономического характера.
В итоге практически всех от этой системы отрубили и сказали писать все в яндекс-табличку, ибо табличка — это отличная штука.
Преподаватели у нас хоть и хорошие, но не все с компьютером на «ты». И кое-как старую систему заполнять научились. С табличкой даже не знаю, как вышло бы (точнее знаю, тут предсказать не так уж и сложно). А ещё у этой таблички должен быть общий доступ для всех преподавателей :)
Меня попросили что-то придумать с этим. О том, что нас отключат от системы, я узнал немного заранее. Рассмотрел open-source варианты систем, которые могут выполнять подобную задачу, и пришел к выводу, что проще написать такую систему с нуля (приоритетом было, чтобы преподаватели легко перешли на новую систему). Но прикидывая, сколько моих человеко-часов уйдет на эту задачу (да ещё и бесплатно), я плавно сливался с этой темы.
Собственно, я и не собирался ничего делать, но вспомнил, что хотел испытать, на что способна ИИ-шка при написании подобных задач с нуля. Обычно я мучаю DeepSeek и пару других gpt для простеньких скриптов, фикса багов, других проблем с Легаси, и просто для тупых вопросов. Поэтому решил в DeepSeek эту задачку и закинуть. Такого, честно, я не ожидал :)
Писать этот проект решил на микрофреймворке Flask, просто потому что у меня с ним был опыт работы, и на бд MySql — так сложилось, что на работе используем в основном её.
Кинул тестовый промт в DeepSeek, подробно описав задачу и стек технологии на котором надо её выполнить. За пару запросов он уже накидал базовый функционал.

В целом вышло даже неплохо. Он правильно составил структуру проекта, накидал шаблоны, сделал авторизацию через FlaskLogin, и в качестве темы подцепил Bootstrap 5. Даже Бд он неплохую сочинил, правда названия полей мне не очень понравились. Но ожидал я более плохого результата.

Раз получилась не совсем ерунда, решил продолжить мучить этот проект. Почти половина того, что он написал, оказалось мусором: дубляж кода — это прям девиз у DeepSeek :). Всю логику он запихал в один файл app.py и шаблоны разместил рядом. Но все заработало и шаблоны в принципе неплохие. Его же и заставил все это логически разделить и составить адекватную структуру. Вышло не идеально, однако меня и так устроило.
Продолжил закидывать промты для добавления новых фич и в попытках заставить его написать адекватную логику работы. Спустя десяток запросов получаю следующее.
Без контекста DeepSeek пишет совсем ерунду, а контекст он и в рамках одного чата умудрился начать терять. Погуглил, что с этим делать. Все советуют либо попросить самого бота составить краткое содержание диалога, либо залить чат в модель с контекстом побольше (например в Qeen), и там сделать тоже самое. С обычным чатом это возможно прокатит, но с чатом, где куча кода, это банально не работает. В итоге тупо скопировал старый чат в txt и скормил его в новом чате :D. В целом это сработало, но скушал он процентов 40.
Помимо этого возникла ещё одна проблема: т.к. DeepSeek не самый идеальный код, мне за ним пришлось многое переписывать, а что-то вообще выкидывать. Соответственно, накопилось куча расхождений с чатом, и учитывать все это мне надоело.
Все это время у меня зрела мысль, что, по-хорошему, надо скормить ему актуальный проект, чтобы минимизировать расхождение в контексте. Но как это сделать? Грузить все файлы по отдельности неудобно. И тут до меня дошло, что можно просто упаковать все файлы проекта в один текстовый документ. За пару запросов в того же бота получил скрипт, который проходит по всем файлам проекта и собирает их в один большой txt, с сохранением структуры проекта и информации о файлах. Такой файл позволяет легко заливать проект в нейросеть целиком, так чтобы она в нем ориентировалась. Для больших проектов, естественно, не подойдет.
import os
import argparse
def should_ignore(path, ignore_list):
"""Проверяет, нужно ли игнорировать путь"""
for item in ignore_list:
if item in path.split(os.path.sep):
return True
return False
def read_file_content(filepath):
"""Читает содержимое файла с обработкой ошибок кодировки"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
return f.read()
except UnicodeDecodeError:
try:
with open(filepath, 'r', encoding='cp1252') as f:
return f.read()
except UnicodeDecodeError:
return "[БИНАРНЫЕ ДАННЫЕ ИЛИ НЕПОДДЕРЖИВАЕМАЯ КОДИРОВКА]"
def main():
parser = argparse.ArgumentParser(description='Сборщик файлов проекта')
parser.add_argument('--output', default='project_content.txt',
help='Выходной файл (по умолчанию: project_content.txt)')
parser.add_argument('--root', default='.',
help='Корневая директория проекта (по умолчанию: текущая)')
args = parser.parse_args()
# Списки исключений
ignore_dirs = {
'__pycache__', '.git', '.idea', 'venv', 'env',
'node_modules', '.pytest_cache', 'dist', 'build',
'project_parser.py', 'project_content.txt' #Костыль, что-бы он не парсил сам себя
}
ignore_extensions = {
'.pyc', '.pyo', '.pyd', '.db', '.sqlite3',
'.jpg', '.png', '.gif', '.ico', '.pdf', '.so'
}
with open(args.output, 'w', encoding='utf-8') as outfile:
for root_dir, dirs, files in os.walk(args.root):
# Пропускаем игнорируемые директории
dirs[:] = [d for d in dirs if not should_ignore(
os.path.join(root_dir, d), ignore_dirs)]
for file in files:
file_path = os.path.join(root_dir, file)
rel_path = os.path.relpath(file_path, args.root)
# Пропускаем игнорируемые файлы
if should_ignore(file_path, ignore_dirs):
continue
if os.path.splitext(file)[1] in ignore_extensions:
continue
# Записываем информацию о файле
outfile.write(f"Файл: {rel_path}n")
outfile.write(f"Размер: {os.path.getsize(file_path)} байтn")
outfile.write("-" * 50 + "n")
# Записываем содержимое файла
content = read_file_content(file_path)
outfile.write(content + "n")
outfile.write("=" * 50 + "nn")
if __name__ == '__main__':
main()
И вот такой файлик DeepSeek уже смог скушать на 92%. Этого хватило с лихвой. Конечно, можно перейти на модель с контекстом побольше, но я хотел домучить DeepSeek.
Как оказалось, чем больше файл, тем контекст у модели меньше, точнее контекст тот же, а длина чата меньше. В итоге дошло до того, что и этот файл DeepSeek может скушать всего на 31%. К счастью, мне уже и не надо в него загружать весь проект (да и в принципе редко это кому-то надо…). Хватает загрузки отдельных файлов.
❯ Что в итоге получилось
Система была запущена спустя 5 дней после начала разработки. Я считаю это своим рекордом :D. Естественно, на момент запуска функционал был очень ограничен. По сути было только заполнение журнала и выгрузка отчета по проведенным занятиям (как на скриншоте выше). Так как разработка началась после старта учебного года, нам надо было запустить его как можно быстрее, чтобы не потерять информацию о проведенных занятиях и преподавателям надо было меньше переносить.
Следующим появился модуль статистики. Можно сказать, моя гордость :) В основном позволяет директору мониторить преподавателей. А самим преподавателям проверять, насколько верно они все заполнили. Так как я и сам преподаватель и все время тупо забывал заполнять журнал, совершенно не понимаю, почему этого не было в старой системе. По факту — одна из самых полезных вещей и всякие доработки в статистику я вношу до сих пор.
Дальше мне надоело смотреть свое расписание по бумажке — появился модуль «Расписание занятий» с возможностью просмотра расписания преподавателей, обучающихся, аудиторного фонда. И кривенькая генерация, для которой ещё потребовался список аудиторий. Чуть позже появился экспорт в exel.

Потом был создан простенький менеджер файлов. По большому счету просто чтобы смотреть учебные программы.

Последними появились отмены занятий, пока с отображением только в модуле статистики (думаю потом ещё и в расписании это добавлю). А также отсутствие учеников по уважительной причине, которое автоматом ставит на все занятия за период отсутствия, что ученик болел. Также появился личный кабинет для обучающихся.

Обычно я свои проекты начинаю с разработки темной темы :), но из-за сроков в этот раз вышло наоборот.
❯ Дабы меня не посчитали «Лайф-кодером» :)
Для начала скажу, что мой опыт более 7 лет позволяет мне оценить что нашкодила нейронка, и в случае чего переписать за ней или добиться от неё приемлемого результата. Но даже несмотря на все это я ещё несколько недель рефакторил и дописывал этот проект :) И, на самом деле, структура мне до сих пор не нравится, но переделать нормально нет времени, да и оно ж работает :)
❯ Итог
Система живет уже третий месяц. Преподаватели достаточно легко «пересели» на неё. В основном благодаря тому, что личный кабинет я постарался сделать как можно ближе к старой системе, добавив новые фичи и убрав недостатки.
У директора появились отчеты в требуемом формате и мониторинг преподавателей. Шанс получить по шапке за кривое заполнение яндекс-таблицы сведен к минимуму (можете сами догадаться, что у остальных центров). По этой причине к нашей системе подключился ещё один центр. Сейчас занимаюсь разграничением доступа, т.к. изначально такое не планировалось.
Касательно применения нейросетей, я честно ожидал более плохого результата, но DeepSeek позволил мне существенно сэкономить рабочее время, да и, будем честными, без него я бы вообще этот проект не стал реализовывать. Жаль, что он так хорошо не работает с низкоуровневым программированием (с тем же проектом «Мультиключ» он мне особо не помог, но там и направление более узкое). Зато благодаря тому, что python такой популярный, нейронки неплохо его освоили. Главное понимать, что они пишут :)
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите кэшбэк на баланс.
Автор: EnvalidGamer


