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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читать далее ‘Local-first-приложения’ »

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

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

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

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

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

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

Начал писать книжку про Python

А расскажу-ка я вам об одной авантюре, в которую недавно ввязался. Ну, может это и не совсем авантюра, но по крайней мере дело, которое требует к себе особого внимания. Если совсем коротко, то несколько месяцев назад я начал писать книгу про Python.

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

Ориентируюсь на наших студентов, которые учатся не на программистов, но с расчетом на то, что Python они будут использовать для инженерных задач и обработки данных. Поэтому в книге не будет ничего про веб-программирование, глубоко копать ООП тоже не будем (никакого множественного наследования и метаклассов), но при этом надо будет поподробнее рассказать про библиотеки Numpy, SciPy, Matplotlib и Pandas. При этом подразумевается, что студенты уже имеют представление о том, что такое программирование, переменные и циклы, и, возможно, даже поверхностно знают C.

Я думаю, что в телеграм-канале я буду периодически рассказывать, как продвигаются дела.

Книга Алекса Сюя «System Design»

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

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

Кандидату в этой книге предстоит построить такие высоконагруженные системы, как поискового робота, систему сокращения URL-адресов, систему для отправки уведомлений пользователям (push-уведомления, SMS-уведомления, через почту и т.п.), ленту новостей блога, чаты, систему автозаполнения поисковых запросов, а в завершение ему предлагается нарисовать архитектуру будущих конкурентов для Youtube и Google Drive. Есть еще несколько глав, где требуется спроектировать один из компонентов таких систем — хранилище типа «ключ-значение», ограничитель трафика и распределенный генератор уникальных идентификаторов.

Читать далее ‘Книга Алекса Сюя «System Design»’ »

Книга Тиаго Антао «Сверхбыстрый Python»

Недавно дочитал книгу Тиаго Антао, которая в русскоязычном варианте называется «Сверхбыстрый Python», а в оригинале более скромно — «Fast Python». Ее подзаголовок — «Эффективные техники для работы с большими наборами данных». Сразу скажу, что книга мне очень понравилась и я ее всячески рекомендую тем, кто занимается обработкой данных или большими вычислениями с использованием Python.

Как известно, Python обладает репутацией медленного языка, и к сожалению, заслуженно. Его главное преимущество — это удобство работы. Но иногда требуется скорость, которую чистый Python обеспечить не может, а переписывать всю программу на C / C++ / Rust не хочется. К счастью, для таких случаев в Python есть обходные пути, позволяющие вроде бы писать на языке Python (или его подобии), но при этом значительно повысить скорость расчета или обработки данных. Тут надо оговориться, что книга посвящена приемам и библиотекам, работающим с реализацией CPython, не затрагивая другие реализации Python, такие как PyPy, IronPython, JPython и др.

По сути эта книга является сборником приемов, позволяющих подойти с разных сторон к решению задач оптимизации работы скриптов на Python. В основном внимание сосредоточено не на сложные математические вычисления, а на обработку больших данных. Каждая глава посвящена своей теме: асинхронное и многопроцессное программирование, использованию таких инструментов как Cython (не путайте с CPython) и Numba для компиляции скрипта в более низкоуровневый код, использованию видеокарт и распределенных вычислений. И везде на очень простых примерах, как правило не превышающих страницу, автор показывает основные идеи, используя разные библиотеки, и сравнивая между собой разные решения одной и то же задачи по скорости выполнения.

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

Далее я коротко пробегусь по главам книги и расскажу о чем они.

Читать далее ‘Книга Тиаго Антао «Сверхбыстрый Python»’ »

Книжные итоги 2023

Книжные итоги 2023

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

Читать далее ‘Книжные итоги 2023’ »

Переписал еще одну статью про Matplotlib

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

Новую версию по сути переписанной заново статьи вы можете прочитать по ссылке — Как рисовать графики в разных окнах.

Все статьи про рисование графиков в Python с помощью библиотеки Matplotlib можно увидеть по ссылке — Использование библиотеки Matplotlib.

Новая версия статьи про Matplotlib

Переписал еще одну древнюю статью про использование библиотеки Matplotlib — Применение объектно-ориентированного стиля.

В ней рассказывается о том, какие есть способы ее использования, начиная с устаревшего модуля pylab, использование функций из модуля matplotlib.pyplot и использование более низкоуровневых объектов Figure, Axes, Line2D, Legend и др.

И кажется, это последняя статья, которую нужно было обновить. Теперь можно писать новые, и у меня уже есть наброски для будущих статей на эту тему.

Продолжаю обновлять старые статьи про библиотеку Matplotlib для построения графиков на Python.

В этот раз практически полностью переписал статью про то, как работать с календарными данными, откладываемыми по оси.

С момента написания первоначальной версии статьи прошло 10 лет (ужас какой!) и принципы работы с календарными данными в Matplotlib кардинально изменились (в лучшую сторону). Старые примеры там вообще уже не работали, и не только потому, что были рассчитаны на Python 2.x, но еще потому, что из Matplotlib одни используемые функции исчезли, а другие стали считаться устаревшими. Кроме того, внешний вид графиков в новых версиях Matplotlib намного симпатичнее.