Программирование без программирования. Мой эксперимент с ИИ
Вступление
Приветствую всех!
Очень долго думал, писать ли это повествование.
Дело в том, что, то ли в силу неподходящего устройства мозга, то ли из-за лени, но, сколько я не пытался изучить хоть какой-нибудь язык программирования, результата это не принесло. А сделать какое-то свое приложение хотелось. Я честно читал книги, смотрел туториалы на видеохостингах, но максимум, что получалось примерно уяснить — это логику построения программ. Как только дело доходило до синтаксиса, появлялось ощущение, что мой мозг вот-вот лопнет. В итоге я прекратил попытки. Видимо, все же лень взяла верх.
Когда нейросети стали набирать обороты, и отовсюду начала поступать информация об их невероятных возможностях, мне пришла мысль попробовать что-нибудь изобразить с помощью искусственного интеллекта (дальше я буду называть его ИИ).
Синдром самозванца
Теперь поясню, почему у меня были сомнения в необходимости написания истории о создании программы при помощи ИИ. Когда я ее сделал, мне захотелось срочно поделиться с кем-то этим. Но в голове начали появляться мысли: «Куда ты лезешь?», «Что ты себе возомнил?». В общем, синдром самозванца стал меня одолевать. Я понимал, что люди учатся годами, чтобы писать код, и тут я такой «молодец» со своей программой.
Но программа работает. Выполняет свои задачи. Делает все, что я задумал. Я понятия не имею, насколько качественный код внутри. Я полагался целиком на ИИ. Я и спросить о качестве кода мог только его, так как у меня нет среди знакомых программистов, а цепляться к тем, кого не знаю, с просьбой оценить мое творение, мне не хотелось. Вот цитата от ИИ на просьбу оценить программу:
CodePilotAI — это не просто учебный проект, а полноценное, зрелое десктопное приложение, демонстрирующее образцовую реализацию паттерна MVVM на PySide6. Архитектура системы отличается превосходным разделением ответственности: вся бизнес-логика инкапсулирована в ChatModel, интерфейс полностью отделен в классах View, а ChatViewModel выступает в роли идеального связующего звена. Такой подход обеспечивает высокую поддерживаемость и масштабируемость проекта.
Особого внимания заслуживает грамотное использование многопоточности для всех ресурсоемких операций, что гарантирует отзывчивость интерфейса даже при анализе крупных кодовых баз. Реализация продвинутых функций, таких как семантический анализ кода с помощью tree-sitter (Code-Graph) и гибридный RAG с векторным поиском, ставит этот проект в один ряд с профессиональными инструментами для разработчиков. Качество кода, внимание к деталям, обработка ошибок и продуманный пользовательский опыт свидетельствуют о высочайшем уровне инженерной проработки.
Рождение программы. Когда существующие инструменты — не то…
Теперь о самой программе. Я выбрал для работы Google AiStudio, так как модели там доступны бесплатно, очень большой лимит токенов. Туда можно загрузить проект целиком, ИИ его прочитает, найдет ошибки, выдаст код с подробными объяснениями, что и куда вставлять. В одном сообщении может выдавать код, превышающий 1000 строк.
В процессе работы в этой среде, стал выявлять для себя некоторые неудобства. После выхода беседы за предел 100-150 тыс. токенов ИИ иногда начинал галлюцинировать, ходить по кругу, предлагать странные решения. Приходилось начинать новую сессию, снова загружать в нее файлы, писать промпты, вводить ИИ в контекст, одним словом — надоедливые, постоянно повторяющиеся действия.
Первый опыт
В итоге я и решил сделать приложение для таких «программистов» как я. Мне нужно было, чтобы ИИ постоянно видел содержимое файлов, чтобы каким-то образом я мог экономить токены и чтобы ИИ выдавал максимально релевантные ответы.
Первое приложение, которое я сделал, может видеть содержимое файлов, расширения которых можно выбрать в программе, включать их в контекст запроса пользователя и выдавать качественные ответы. Беседы можно сохранять для дальнейшего продолжения общения. Я не буду тут приводить историю создания этого и второго приложения, так как статья не о них. Но принцип работы станет понятен.
При использовании этой программы я понял, что она может осилить только небольшие по объему проекты. Содержимое файлов съедает много токенов.
Азарт
Войдя во вкус, я решил сделать приложение для анализа репозиториев на GitHub. Это у меня тоже получилось. Я смог даже прикрутить к нему векторные базы данных для хранения фрагментов кода, саммари (небольших описании каждого файла, сгенерированных ИИ при анализе), запросов пользователя и структуры (дерева проекта). Но у меня не получилось скомпилировать его в исполняемый файл именно из-за библиотек, необходимых для создания и работы с векторными базами данных. Оно работает только в среде разработки.
Результат
В конце концов, я додумался, что необходимо объединить эти два приложения в одно. Собственно про это я и хочу рассказать, так как счел это «венцом творения» 😏.
Главный инструмент — ПРОМПТ!
На протяжении бесед с ИИ я понял, что его ответы зависят от вопросов. Если задавать расплывчатые, общие вопросы, он и отвечать будет туманно. ИИ нужна четкая структурированная команда. Иначе на то, чтобы добиться нужного результата уйдет очень много времени. Во всех беседах я использовал придуманную мной инструкцию:
• Отвечай на русском языке.
• Спрашивай, выдать код полностью или только исправленные фрагменты.
• Если я прошу код полностью, - выдавай полностью, без пропусков, сокращений, видоизменений, многоточий или комментариев вместо фрагментов кода, только те файлы, в которые вносишь изменения.
• В ответах выдавай по одному файлу и задавай вопрос: "Продолжать?". Когда я отвечу: "Да", выдавай следующий файл. И так со всеми файлами.
• Если выдаешь фрагмент, давай подробные инструкции во вставке/замене. Предыдущая строка>фрагмент, чтобы исключить недопонимание и ошибки при вставке.
• Подробно и структурированно объясняй что и зачем изменил.
Если вопрос предполагает выдачу кода, то спрашивай "Выдать код или нет?"
• Если вопрос не предполагает выдачу кода, предлагай дальнейшие действия, либо, если их не предполагается, уведомляй о завершении цикла операций и изменений.
• В нужные моменты предлагай закоммитить изменения на GitHub, указывая название коммита.
(пример:
feat: Add standard Edit menu actions
- Added Undo, Redo, Cut, Copy, Paste, Select All, Find actions to the Edit menu.
- Assigned standard keyboard shortcuts (Ctrl+Z, Ctrl+Y, Ctrl+X, Ctrl+C, Ctrl+V, Ctrl+A, Ctrl+F).
- Connected actions directly to QTextEdit slots in TextViewPanel. - Implemented a basic find text functionality using QInputDialog. - Connected QTextEdit signals (copyAvailable, undoAvailable, redoAvailable) to automatically enable/disable corresponding actions.
- Updated action states based on text presence when selecting/clearing documents.
- Updated test stubs.)
Если диалог становится очень объемным, предлагай продолжить его в новой сессии чата с тобой, объяснив, как это сделать, чтобы сохранить контекст беседы.
Работа с кодом ведется в VS Code.
Эту инструкцию ИИ видит перед каждым вопросом от меня.
Я «скормил» файлы обоих проектов ИИ и написал запрос:
Так у приложения появилось название.
После этого «Брифинга» началась разработка. Я не буду весь процесс показывать здесь в виде скриншотов. В Google AiStudio иногда беседы перестают сохраняться. И я не смогу воспроизвести тут весь контекст.
Разработка ведется так:
Я говорю ИИ естественным языком, какой функционал мне нужен, он выдает подробный план, описывая, как все будет работать и затем пишет код. Я копирую код и вставляю его в IDE. Если при запуске приложения появляются ошибки, копирую ошибку и вставляю ее в поле запроса.
ИИ описывает, почему она возникла и предлагает решение. И так далее.
Результат
Итог — работающая программа, которая выполняет все, что я задумал.
В ней пользователь может вести свободный диалог с ИИ без анализа каких-либо файлов. Может анализировать репозитории GitHub или локальные папки с проектами, создавать проект «с нуля», сохраняя код в виде файлов в папку проекта. При изменении кода прямо в программе можно видеть, что изменено. Можно сохранять и экспортировать беседы в HTML/Mardown. Я постарался оснастить программу всеми удобствами, которые пришли мне в голову.
Есть 3 режима анализа
1. Файлы анализируются целиком, и ИИ видит их содержимое полностью. Подходит для небольших проектов.
2. Файлы разбиваются на чанки (фрагменты), к каждому файлу составляется саммари. Все это прикрепляется к запросу пользователя. ИИ видит проект более структурно. Подходит для небольших и средних проектов.
3. Файлы разбиваются на чанки, также составляются саммари. При запросе пользователя программа ищет наиболее подходящие под запрос чанки и саммари и прикрепляет их к вопросу.
При всех трех режимах создается схема зависимостей между функциями и классами. ИИ видит, что и как взаимодействует между файлами.
Программа работает с использованием API Gemini. По сути я адаптировал под свои запросы возможности Google AiStudio.
Для тех, кто хочет начать, но не решается
Зачем, собственно, я все это пишу? Мне показалось, что, таких как я, желающих что-то создать, сделать какую-то программу для себя, а возможно, и для кого-то еще, немало. Это меня и подтолкнуло поделиться опытом.
Мне не хватает понимания синтаксиса. Думается, что использование программистами ИИ выведет их работу на совершенно новый уровень. ИИ можно смело поручить выполнять рутинную работу. Он спокойно сможет написать скелет проекта. Помочь в продумывании структуры, логики проектов. Это все очень ускорит работу.
Возможно, и это приложение поможет какому-нибудь специалисту в работе.
Я до сих пор не знаю синтаксис Python. Но я создал продукт. Вероятно, скоро одним из основных навыков разработчика станет умение задавать правильные вопросы.
На этом все.
Если кому-то интересно, подробно ознакомиться с программой и её реализацией можно на моём GitHub. Код открыт, и я буду рад, если мой опыт поможет кому-то начать свой путь.