Про генерацию кода искусственным интеллектом

Про генерацию кода искусственным интеллектом

Понадобилось мне для OutWiker сделать новый контрол для выбора цвета. Это должен быть выпадающий список (в простонародье — ComboBox), который вместо текста отображал бы прямоугольники разных цветов. Я очень не люблю делать свои контролы, но в какую сторону копать было понятно. Решил эту задачу переложить на братьев наших меньших (а в перспективе — больших), то есть на искусственный интеллект, и попросить его сгенерировать код.

Начал с Copilot. Результат меня прям очень впечатлил. Первоначальный запрос был такой:

«Напиши код компонента на Python с использованием библиотеки wxPython, который использует wx.adv.OwnerDrawnComboBox, чтобы выбирать цвет с помощью выпадающего списка. Каждый элемент выпадающего списка должен отображаться в виде прямоугольника своего цвета. Напиши код приложения, который этот компонент использует.»

Код получился почти сразу рабочий, в течение нескольких запросов поправили некоторые косяки и даже улучшили внешний вид. Через полчаса в первом приближении я получил то, что хотел и потом буду исходники допиливать напильником. После этого даже не особо надеясь, что ИИ поймет, что мне надо, написал ему еще одну хотелку:

«Пусть теперь нулевой элемент будет обозначать «цвет по умолчанию» и выводиться текстом, а последний элемент списка — «Выбрать цвет» и тоже выводиться текстом.»

Удивительно, но он сделал именно то, что я имел в виду. В процессе общения поправили некоторые мелочи, и оно заработало.

После этого мне стало интересно сравнить результат с другими нейронками. Начал с Яндекс GPT 4. Результат получился унылый. Работающего контрола от него я так и не добился. В выпадающем списке цветные прямоугольники он не смог нарисовать (хотя честно пытался, но все время что-то было не то).

Попробовал после этого нейронку от Сбера — GigaChat. С ним пришлось помучиться подольше, чем с Copilot, — приходилось часто указывать конкретные строки, где ИИ был не прав, и что там должно быть. Но в итоге контрол начал делать то, что от него требуется, хотя некоторые оформительские моменты придется за ним все-таки править руками. А на дополнительной хотелке нейронка ушла в бесконечный цикл и начала писать без передыху по три одинаковые строчки, которые к делу вообще не относятся. В другой раз по этому же запросу у нее перепутались код и комментарии к нему. Ну ладно, с бонусом она не справилась, но в целом тоже молодец.

Еще я на днях локально себе поставил опенсорсную нейронку Llama 3 (запускал через ollama). Код, который она генерила, тоже с ходу не заработал. Но еще у меня и комп для нее слабоват. Сначала ИИ отвечал относительно шустро, но если надо было исправить ошибку, то он начинал думать минут 10, и результат совсем не впечатлял. В общем, у меня не хватило терпения заставить эту нейронку написать рабочий код.

PS. Если кому интересно, то вот код, который в итоге получился у Copilot. Для получения этого кода понадобилось 7 запросов. И код, который получился у GigaChat . Сколько понадобилось запросов для получения этого кода не знаю, потому что история не сохранилась.

Для запуска этих исходников нужна библиотека wxPython.

Книга про Python. Прогресс написания за ноябрь

Закончился ноябрь, надо подвести месячный итог написания книги про Python.

За этот месяц написал три с половиной главы:

  • про исключения — 21 страница;
  • про запись и чтение файлов, и тут же про двоичные строки — 24 страницы.
  • про работу с файловой системой (модули os.path, shutil и pathlib) — 25 страниц.
  • часть главы про обработку параметров командной строки — пока это скромные 6 страниц.

Итого, за месяц написал 76 страниц. Это очень много для этих глав. Изначально на исключения я закладывал 10 страниц, и все, что касается работы с файлами должно было занимать 20 страниц.

Всего на сегодняшний день написано 402 страницы. Потом во время вычитки придется все это сокращать раза в два.

По планам в декабре хочу написать главы про регулярные выражения и unit-тесты. После этого, наконец, можно будет перейти к описанию библиотек NumPy, Matplotlib и Pandas.

OutWiker 4.0.0.946 alpha 3

OutWiker 4.0.0.946 alpha 3

Хотя с момента выхода прошлой альфа-версии OutWiker прошла всего неделя, в этот раз я решил не затягивать с выкладыванием новой версии, к тому же изменения, которые я успел внести за это время, видны пользователям. Поэтому сегодня выложил новую нестабильную версию под номером 4.0.0.496.

Читать далее…

OutWiker 4.0.0.944-alpha-2 с новым деревом заметок

Выложил новую альфа-версию OutWiker под номером, указанным в заголовке. Эта версия для тех, кто не боится пробовать совсем свежие версии с не до конца доделанными возможностями. Зато вы первые увидите, куда катится мир движется программа. Вроде бы каких-то явных проблем, мешающих пользоваться программой, быть не должно, но кто знает, на то она и альфа-версия.

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

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

Читать далее…

Local-first-приложения

Local-first-приложения

Попалась мне недавно статья 2019 года с названием Local-first software. В этой статье авторы предлагают идеологию построения софта, которая меня сильно зацепила.

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

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

Читать далее…

Прогресс в написании книги про Python в октябре

Прогресс в написании книги про Python в октябре

Давно не писал о том, как идут дела с написанием книги про Python, а меня об этом в оффлайне уже несколько раз спрашивали. Поэтому решил, что раз в месяц буду писать мини-отчет о прогрессе. Да и самому полезно оглянуться и посмотреть, что за этот месяц было сделано. Картинка с приростом количества страниц от времени прилагается.

Судя по графику, удалось войти в более-менее рабочий ритм. Обычно книгу я пишу вечером после работы и в выходные. В среднем получается в день продвинутся на 2-3 страницы, а за неделю книга увеличивается примерно на 15 страниц. В последнее время прирост немного больше, потому что сейчас начался более длинный код для примеров.

Читать далее…

Узнал про еще один алгоритм глобальной оптимизации

Узнал про еще один алгоритм глобальной оптимизации

Один из моих интересов — это алгоритмы глобальной оптимизации. Классика — это генетический алгоритм, алгоритм имитации отжига и алгоритм роя частиц. Есть еще большое количество алгоритмов, в названии которых упоминается какая-нибудь живность. В своей диссертации для оптимизации я использовал кроме генетического алгоритма еще алгоритм роя пчел (не путайте с роем частиц, их постоянно все путают). Еще часто упоминается алгоритм муравьев (в основном для поиска пути), попадалось упоминание алгоритма кукушки (cuckoo search algorithm).

И вот еще недавно прочитал статью, где для оптимизации использовали алгоритм хаотичных воробьев (chaos sparrow search algorithm). Название уже интригует. Причем если почитать описание этого алгоритма, то там разворачивается прям блокбастерная история, напрашивающаяся на экранизацию. Среди роя воробьев выделяются воробьи-исследователи (explorers), последователи (followers) и мстители (vigilantes), и каждый из них перемещается по своему алгоритму. Дальше, чтобы не спойлерить, чем все это закончится, читайте описание алгоритма.

Даже захотелось попробовать реализовать такой алгоритм. Тем более, что у меня есть заброшенный проект на Rust с библиотекой подобных алгоритмов.

А еще у нас на кафедре должен появиться новый предмет про алгоритмы искусственного интеллекта в задачах оптимизации. Впервые его должны читать через несколько лет студентам, которые поступали к нам в этом году, и есть ненулевая вероятность, что вести его придется мне, по крайней мере я участвовал в составлении учебной программы. Добавлю себе в заметки еще алгоритм воробьев-хаотиков (гугл предлагает перевод «воробьи хаоса», что звучит еще более пугающе), вдруг пригодится.

Работа над OutWiker 4.0 продолжается

Работа над OutWiker 4.0 продолжается

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

Читать далее…

Прогресс с написанием книги про Python

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

На сегодняшний день написал 238 страниц, но тут надо учитывать, что сейчас я нахожусь в режиме «чукча-писатель», в том смысле, что практически не перечитываю то, что получилось. В режим «чукча-читатель» планирую переключиться, когда основной материал уже будет описан. Есть смутное подозрение, что тогда придется многое посокращать, а то что-то много получается страниц по сравнению с тем планом, который был изначально.

А еще на графике можно заметить явно выделяющиеся участки. Первый — с начала и до 2 августа — там я пытался войти в ритм, пытался понять, в каком стиле писать, и там были самые скучные главу — общие слова про язык, базовые типы и Python как калькулятор. В это время график был неровный и дерганный. Второй участок — со 2 по 12 августа был полностью горизонтальный, потому что начался отпуск и я с друзьями уехал в поездку по Пермскому краю. По возвращению график стал заметно быстрее расти — это я из поездки вернулся, но отпуск на работе еще продолжался. Ну и с начала сентября пока растет тем же темпом, но скорее всего сейчас должен немного замедлиться, потому что часть времени сейчас уходит на подготовку к занятиям со студентами (и еще внезапно аспирантами). А так для себя я решил, что если за неделю я продвигаюсь на 15 страниц, то это нормально.

OutWiker 4.0.0.942. Планы и первая альфа-версия

После недавнего релиза решил, что пришло время более глобальных изменений, и поэтому следующая версия будет иметь номер 4.0. На данный момент это единственное глобальное изменение, заметное пользователям. 🙂 Но зато это повод не соблюдать обратную совместимость плагинов, обновить внутреннюю версию API для них и заняться подчисткой кода от древних окаменелостей. Именно с этого я и начал. Еще в прошлой версии я начал переделку внутреннего API и пометил код, который надо будет удалить, как только обратная совместимость станет неактуальной. Вот этот код и поудалял.

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

Читать далее…