Как я с DeepSeek писал информационную систему (электронный журнал) для образовательного центра за пару дней. CRM-системы.. CRM-системы. deepseek.. CRM-системы. deepseek. Flask.. CRM-системы. deepseek. Flask. HTML.. CRM-системы. deepseek. Flask. HTML. python.. CRM-системы. deepseek. Flask. HTML. python. timeweb_статьи.. CRM-системы. deepseek. Flask. HTML. python. timeweb_статьи. Блог компании Timeweb Cloud.. CRM-системы. deepseek. Flask. HTML. python. timeweb_статьи. Блог компании Timeweb Cloud. ии-ассистент.. CRM-системы. deepseek. Flask. HTML. python. timeweb_статьи. Блог компании Timeweb Cloud. ии-ассистент. информационная система.. CRM-системы. deepseek. Flask. HTML. python. timeweb_статьи. Блог компании Timeweb Cloud. ии-ассистент. информационная система. искусственный интеллект.. CRM-системы. deepseek. Flask. HTML. python. timeweb_статьи. Блог компании Timeweb Cloud. ии-ассистент. информационная система. искусственный интеллект. Машинное обучение.

Данная статья не инструкция к действию, а просто моя история из жизни. В прошлых материалах я упоминал, что работаю преподавателем в центре для одарённых школьников.
Центров этих в районе десятка по стране. И до этого года все они работали на базе общей информационной системы.

❯ Что было в этой системе

На самом деле система не очень сложная. По сути электронный журнал с дополнительными фишками. Был личный кабинет для админа, преподавателя и обучающихся. Список учебных программ и мониторинг успеваемости. Написана она была на django, но что было под капотом я не знаю, т.к. доступа у меня не было.

❯ В этом году появилось несколько проблем

Ранее все программы в систему вносила техническая поддержка — тогда их количество было относительно небольшим. Сейчас же объём программ настолько возрос, что поддержка уже не в состоянии их обработать. Хотя в целом этот вопрос постепенно решается, попутно возникло несколько дополнительных проблем — преимущественно экономического характера.

В итоге практически всех от этой системы отрубили и сказали писать все в яндекс-табличку, ибо табличка — это отличная штука.

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

Меня попросили что-то придумать с этим. О том, что нас отключат от системы, я узнал немного заранее. Рассмотрел open-source варианты систем, которые могут выполнять подобную задачу, и пришел к выводу, что проще написать такую систему с нуля (приоритетом было, чтобы преподаватели легко перешли на новую систему). Но прикидывая, сколько моих человеко-часов уйдет на эту задачу (да ещё и бесплатно), я плавно сливался с этой темы.
Собственно, я и не собирался ничего делать, но вспомнил, что хотел испытать, на что способна ИИ-шка при написании подобных задач с нуля. Обычно я мучаю DeepSeek и пару других gpt для простеньких скриптов, фикса багов, других проблем с Легаси, и просто для тупых вопросов. Поэтому решил в DeepSeek эту задачку и закинуть. Такого, честно, я не ожидал :)

Писать этот проект решил на микрофреймворке Flask, просто потому что у меня с ним был опыт работы, и на бд MySql — так сложилось, что на работе используем в основном её.

Кинул тестовый промт в DeepSeek, подробно описав задачу и стек технологии на котором надо её выполнить. За пару запросов он уже накидал базовый функционал.

Как я с DeepSeek писал информационную систему (электронный журнал) для образовательного центра за пару дней - 1

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

Как я с DeepSeek писал информационную систему (электронный журнал) для образовательного центра за пару дней - 2

Раз получилась не совсем ерунда, решил продолжить мучить этот проект. Почти половина того, что он написал, оказалось мусором: дубляж кода — это прям девиз у 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.

Как я с DeepSeek писал информационную систему (электронный журнал) для образовательного центра за пару дней - 5

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

Как я с DeepSeek писал информационную систему (электронный журнал) для образовательного центра за пару дней - 6

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

Отмена занятий со статистикой (я тут явный рекордсмен, благодаря отдыху в больнице) и списком отмен

Отмена занятий со статистикой (я тут явный рекордсмен, благодаря отдыху в больнице) и списком отмен
Как я с DeepSeek писал информационную систему (электронный журнал) для образовательного центра за пару дней - 8
В личном кабинете обучающегося не очень много функционала, но все самое нужное есть

В личном кабинете обучающегося не очень много функционала, но все самое нужное есть

Обычно я свои проекты начинаю с разработки темной темы :), но из-за сроков в этот раз вышло наоборот.

Печеньки принес всего один преподаватель :(

Печеньки принес всего один преподаватель :(
Тут ещё можно заметить мини-статистику в личном кабинете, она нужна для того, чтобы преподаватели (в основном я) не забыли заполнить проведенные занятия

Тут ещё можно заметить мини-статистику в личном кабинете, она нужна для того, чтобы преподаватели (в основном я) не забыли заполнить проведенные занятия
Светлой темой мне теперь пользоваться неприятно

Светлой темой мне теперь пользоваться неприятно

❯ Дабы меня не посчитали «Лайф-кодером» :)

Для начала скажу, что мой опыт более 7 лет позволяет мне оценить что нашкодила нейронка, и в случае чего переписать за ней или добиться от неё приемлемого результата. Но даже несмотря на все это я ещё несколько недель рефакторил и дописывал этот проект :) И, на самом деле, структура мне до сих пор не нравится, но переделать нормально нет времени, да и оно ж работает :)

❯ Итог

Система живет уже третий месяц. Преподаватели достаточно легко «пересели» на неё. В основном благодаря тому, что личный кабинет я постарался сделать как можно ближе к старой системе, добавив новые фичи и убрав недостатки.

У директора появились отчеты в требуемом формате и мониторинг преподавателей. Шанс получить по шапке за кривое заполнение яндекс-таблицы сведен к минимуму (можете сами догадаться, что у остальных центров). По этой причине к нашей системе подключился ещё один центр. Сейчас занимаюсь разграничением доступа, т.к. изначально такое не планировалось.

Касательно применения нейросетей, я честно ожидал более плохого результата, но DeepSeek позволил мне существенно сэкономить рабочее время, да и, будем честными, без него я бы вообще этот проект не стал реализовывать. Жаль, что он так хорошо не работает с низкоуровневым программированием (с тем же проектом «Мультиключ» он мне особо не помог, но там и направление более узкое). Зато благодаря тому, что python такой популярный, нейронки неплохо его освоили. Главное понимать, что они пишут :)


Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале 

Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите кэшбэк на баланс.

Автор: EnvalidGamer

Источник

Rambler's Top100