- BrainTools - https://www.braintools.ru -
Термин «вайб‑кодинг» в среде пользователей, хоть немного погруженных в тему ИИ, уже не нужно расшифровывать и пояснять. Кажется, людей, не использующих LLM для программирования становится все меньше и меньше.
Я также не избежал этого увлечения, а небольшой фундамент в виде Basic в школе, Pascal, Delphi в универе и макросов на VBA на работе, лишь подстегивал мой зуд делать мелкие проекты, которые могут облегчить мне жизнь, но которые так и остались бы в задумках и не были реализованы — изучать программирование серьезно просто нет времени, а результат хочется здесь и сейчас.
Началось все просто — с телеграм ботов, которые закрывали мои потребности [1] в отдельных задачках, потом проект побольше — комментатор событий на канале (телеграм канал куда мой Home Assistant отправляет сообщения о показаниях датчиков и событиях в доме).
Ну и «вишенка» на торте — моя большая проблема и боль [2] — архивы с фото, которые вследствие моего безалаберного поведения [3] с копиями, превратили диски моего Nas в гигантский портфель копий, дубликатов и т. д. несколько раз приступал к ручному, полуавтоматизированному, автоматизированному поиску дубликатов, но никогда до конца не доходил — программы, которые работают с дубликатами, не полностью закрывали критерии отбора фото — некоторые дубликаты, несмотря на свою идентичность (по показаниям программы) отличались наличием и полнотой заполнения exif тегов, в некоторых не сохранились геометки, соответственно, при удалении дублей, хотелось бы сохранять более полные и качественные экземпляры.
Захотел я инструмент, который бы удовлетворил мои потребности в работе с дубликатами в полной мере, и единственный способ получить его — написать с помощью LLM.
Начитавшись, что Claude лучший в программировании, я пошел в свой бесплатный аккаунт и сформулировал задачу:
привет. у меня есть проблема — несколько папок с фото, причём есть фото дубликаты, однако, просто найти дублирующиеся файлы и удалить их с помощью каких то утилит или программ в лоб не получится, почему то у некоторых файлов исчезли некоторые теги в exif — самое большое проблемное — геометки, которые в некоторых файлах отсутствуют. что я бы хотел — какую то утилиту, которая анализировала 5 папок с фото, находила дублирующиеся по названию файлы, ставила их рядом и под этими фото выводила информацию — имя, размер, разрешение и всю информацию из exif, выделяя ту, которая отсутствует в этом фото, если она заполнена в других. я бы хотел после просмотра этого списка выбирать, отмечая чекбокс те фото, которые нужно удалить, и после нажатия кнопки удалить‑ удалились бы отмеченные файлы. давай поговорим, какие могут быть способы реализации такой задачи (лучше python) для обработки, а вот интерфейс, с учётом моей задачи — нужно подискутировать с тобой. также, вообще всю архитектуру реализации решения, предложи несколько вариантов, распиши плюсы — минусы каждого, я задам уточняющие вопросы и потом приступим уже к пошаговой реализации.. код пока писать не нужно, начнём с архитектуры. если нужно уточнение, можешь задавать вопросы
После небольшой переписки с Claude, уточнений, типа:
идеально. также, решение должно быть реализовано в виде докер контейнера (dockerfile и docker‑compose.yaml) для разворачивания на сервере. также уточню, что хранение папок на nas, доступ к ним идёт по samba,если это важно, учти (понимаю, что скорость будет меньше, готов обсудить, что для реализации потребуется копировать их на машину, где будет выполняться код, или монтирование их)
и т. д., я поставил точку:
давай прямое монтирование, время и место для копирования, а также синхронизация изменений в базовой папке (при удалении), мне кажется, сложнее в реализации. итак, давай окончательную архитектуру реализации, как если бы мы ставили задачу команде разработчиков ПО.
Сделал для того, чтобы при достижении лимита длины в чате (у Claude с этим печально и порой, напечатав почти весь код, он внезапно все вытирал и писал, что лимит достигнут и нужно начать новый чат) было проще вводить следующий чат в контекст, Claude выдал «ТЗ»:
Система предназначена для анализа нескольких архивов фотографий, определения дубликатов по имени файла, сравнения EXIF‑метаданных между дубликатами и выборочного удаления файлов. Система реализуется как веб‑приложение в Docker‑контейнерах с прямым доступом к сетевым хранилищам (NAS) через протокол Samba.
Язык программирования: Python 3.9+
Фреймворк: Flask
База данных: MongoDB
Контейнеризация: Docker + Docker Compose
Веб‑интерфейс: HTML5, CSS (Bootstrap 5), JavaScript (jQuery)
Обработка изображений: Pillow, exifread
Доступ к сетевым ресурсам: smbclient, cifs‑utils
Назначение: Обеспечивает доступ к файлам на NAS, сканирование директорий, чтение и удаление файлов.
Ключевые функции:
Монтирование Samba‑ресурсов
Обход директорий и сбор метаданных файлов
Выполнение операций удаления файлов
Технические особенности:
Монтирование сетевых ресурсов внутри Docker‑контейнера
Обработка ошибок доступа к сетевым ресурсам
Параллельная обработка файлов с контролем нагрузки
Назначение: Извлечение, декодирование и анализ EXIF‑метаданных из фотографий.
Ключевые функции:
Чтение всех EXIF‑тегов из файлов
Корректное декодирование текстовых полей
Преобразование специальных тегов (GPS, даты) в читаемый формат
Выявление различий в метаданных между дубликатами
Технические особенности:
Обработка разных кодировок в EXIF‑тегах
Извлечение геоданных и преобразование их в читаемый формат
Структурирование метаданных для хранения в MongoDB
Назначение: Организация хранения и поиска информации о файлах и метаданных.
Ключевые функции:
Сохранение информации о файлах в MongoDB
Сохранение структурированных EXIF‑метаданных
Хранение превью изображений для быстрой загрузки в интерфейсе
Индексирование данных для эффективного поиска дубликатов
Схема данных:
Коллекция файлов: информация о всех обработанных файлах
Коллекция групп дубликатов: связи между файлами‑дубликатами
Коллекция сессий анализа: информация о выполненных сессиях сканирования
Назначение: Обеспечение взаимодействия между веб‑интерфейсом и бэкенд‑системой.
Ключевые эндпоинты:
/api/folders — получение списка доступных папок
/api/scan — инициирование сканирования выбранных папок
/api/duplicates — получение списка найденных дубликатов
/api/file/{id} — получение детальной информации о файле
/api/delete — удаление выбранных файлов
Технические особенности:
REST API с JSON‑форматом данных
Асинхронная обработка длительных операций
Статусы выполнения операций
Назначение: Обеспечение пользовательского взаимодействия с системой.
Ключевые экраны:
Выбор папок для анализа
Просмотр процесса сканирования
Просмотр найденных дубликатов с превью и EXIF‑данными
Выбор файлов для удаления и подтверждение операции
Технические особенности:
Адаптивный дизайн с использованием Bootstrap
Динамическая загрузка данных через AJAX
Интерактивное сравнение EXIF‑метаданных с выделением различий
Lightbox для просмотра увеличенных изображений
Назначение: Обеспечение развертывания и управления компонентами системы.
Компоненты:
Dockerfile для создания образа приложения
docker‑compose.yaml для оркестрации контейнеров
Скрипты для инициализации и управления
Пользователь выбирает папки для анализа в веб‑интерфейсе
Система монтирует необходимые сетевые ресурсы (если требуется)
Выполняется сканирование файлов и извлечение метаданных
Данные группируются по имени файла для выявления дубликатов
Для каждой группы дубликатов выполняется анализ различий в EXIF
Генерируются превью для отображения в интерфейсе
Результаты сохраняются в MongoDB для быстрого доступа
Пользователь просматривает группы дубликатов
Система отображает превью файлов и различия в EXIF‑метаданных
Пользователь отмечает файлы для удаления
Система запрашивает подтверждение операции
После подтверждения выполняется удаление файлов
Обновляется база данных с учетом выполненных операций
Docker Engine 20.10+
Docker Compose 2.0+
Доступ к сетевым ресурсам через Samba
4 ГБ RAM или более (в зависимости от объема обрабатываемых данных)
Клонирование репозитория
Настройка переменных окружения для доступа к сетевым ресурсам
Запуск системы через Docker Compose
Доступ к веб‑интерфейсу через браузер на порту 5000
Обработка ошибок доступа к сетевым ресурсам
Восстановление после прерывания процесса сканирования
Логирование всех операций и ошибок
Контрольные точки при обработке больших объемов данных
Добавление дополнительных алгоритмов поиска дубликатов (по содержимому, хешу)
Функция объединения метаданных из разных версий одного файла
Статистика и аналитика по архивам фотографий
Интеграция с системами организации фотоархивов
Я попросил сделать MVP — выбор папок, монтирование, поиск дубликатов и вывод списка дубликатов на странице. С первого раза от Claude я сразу получил «горку» файлов, начиная с dockerfile и заканчивая шаблонами html для вывода, описание структуры проекта. Загрузив на сервер в Proxmox, собрал контейнер и зашел на страницу приложения — все заработало с первого раза, монтирование, поиск и вывод(!). Далее были три недели почти ежевечерних митингов с «командой разработчиков». В общей сложности (сейчас подсчитал) у меня 14 диалогов с Клодом, так как из‑за величины проекта, больше одного запроса сделать не получалось — сразу лимит на длину чата отгребал.
Да, были ошибки [4] (порядка 6–7), где не так отрабатывалась какая‑то функция, но продвижение проекта было налицо, каждый спринт я получал какое то улучшение функционала. Очень помог инструмент Github to plainText [5], позволяющий запихнуть в один файл весь код проекта, довольно сложной структуры.
Последний спринт сделал с помощью Cursor, решил попробовать, так сказать самую последнюю технологию вайб‑кодинга. Интересно, что мне оказалась доступна модельClaude 3.7 без подписки и ввода каких то ключей ). Указав в качестве контекста основные папки проекта, я попросил добавить функцию удаления файлов — последнюю, которую необходимо было для минимально неоходимого функционала. Чем не понравился Cursor (может я недостаточно акцентировал его «внимание» в запросе, он сразу начал делать рефакторинг, исправлять ненайденные мной, но видимые моделью ошибки и т. д., по итогу, вместо простой добавки простой функции, у меня ушло еще несколько итераций в Cursor, потому что, исправляя одно, он забыл добавить нормальную обработку удаления. В конечном итоге, код заработал, как я ожидал, и финально я попросил сгенерировать readme.md для оформления репозитория на Github, что модель успешно и сделала (правда, для сокращения передаваемого контекста, я не включил в обработку папку docker, поэтому, модель сгенерировала readme с описанием разворачивания через venv).
Несмотря на то, что до идеала проекта еще далеко, и с первого раза не все получалось идеально, да и не все функции работают, как хотел я (выделение цветом отличий по exif), все равно — использование LLM для реализации своих тайных желаний задумок, лично мне очень зашло.
То, от реализации чего я раньше отмахивался, ибо учить программирование (минимум один язык, технологии фронтенда, бэкенда, развертывания и т. д.) я бы точно не стал,теперь становится доступным и дает возможность буквально в несколько шагов получить результат.
Claude хорош, я такой же начальный запрос отправил в ChatGPT, даже начало ответа показало мне, что будет сложнее.
Да, возможно, для искушенных в программировании специалистов, мои «открытия» покажутся недалекими, но для меня это реальный шанс делать удобные инструменты под мои запросы, пусть кривые‑косые, но если есть результат, так ли это важно?
P. S. да, если интересно, код проекта тут [6]. Спасибо за внимание [7].
Автор: ktibr0
Источник [8]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/13811
URLs in this post:
[1] потребности: http://www.braintools.ru/article/9534
[2] боль: http://www.braintools.ru/article/9901
[3] поведения: http://www.braintools.ru/article/9372
[4] ошибки: http://www.braintools.ru/article/4192
[5] Github to plainText: https://repo2txt.simplebasedomain.com/
[6] тут: https://github.com/ktibr0/work_with_duplicates
[7] внимание: http://www.braintools.ru/article/7595
[8] Источник: https://habr.com/ru/articles/896706/?utm_source=habrahabr&utm_medium=rss&utm_campaign=896706
Нажмите здесь для печати.