Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Copilot – система автодополнения кода от GitHub на основе модели Codex. Модель завернули в API и дали доступ через расширение для IDE (среды разработки). Я регулярно пользуюсь Copilot – экономит время и заменяет поиск кода в интернете. Делюсь советами разной степени очевидности, которые собрал за это время.
Tldr: Copilot подходит для повторяющихся задач и как замена поиску по документации популярных библиотек. Не подходит для решения узких сложных задач и проектов с нуля.
Структура статьи:
Установка и оплата Copilot
Как работает Codex
Для чего удобно использовать Copilot
Лайфхаки по использованию
Ограничения Copilot и как их решить?
Установка и оплата Copilot
Войти на страницу через гитхаб аккаунт и привязать карту. Скорее всего страница оплаты у вас будет заблокирована, поэтому лучше всего зайти с нового аккаунта и их под ВПН (можно использовать, например, 1.1.1.1). С Российских карт оплата не пройдет. Если нет не-РФ карты, попробуйте Pyypl. Это виртуальная карта, которая пополняется usdt. Я ребятам особо не доверяю, но для случаев, где нужно привязать карту – работает нормально. Поэтому держу там 5$ и регаю на эту карту пробные версии продуктов.
Copilot дает пробные 2 месяца, потом оплата по 10$ в месяц.
Код на питоне я пишу в VSCode, а на Go в GoLand, в обеих IDE расширение ставится без проблем.
Как работает Codex
Под капотом Copilot модель под названием Codex (Статья: Evaluating Large Language Models Trained on Code). Codex – это GPT-3, которую зафайнтюнили генерировать код программы по её докстрингу (комментарий описание функции). По сути Codex учился предсказывать продолжение текста в виде кода, на основе её начала в виде названия функции, аргументов и описания. Обучались на датасете открытого кода с Гитхаба, больше всего в выборке было питона.
Метрик для таких моделей нет, поэтому придумали свою. Взяли задачу на питоне, сгенерировали K решений моделью, пропустили решения через юнит-тесты для функции. Если одно из решений прошло все тесты, то решение засчитывается. Задач в тестовой выборке было 160.
Про горячие клавиши
Принять/Отклонить автодополнение — Tab/Esc
Показать следующий/предыдущий вариант саджеста — Alt или Option + ] и Alt или Option + [
Показать саджест (если отключили автоматические подсказки) — Alt или Option (⌥) + \
Открыть 10 саджестов, в окне — Ctrl + Enter
Долгое время сам не знал про фичу с Ctrl+Enter, оказалось удобнее для ряда случаев. Так можно быстрее выбрать верное решение.
Способы применения Copilot
Конвертация комментария в код. Обычный порядок действий: я пишу комментарий с описанием работы функции -> получаю её реализацию. Можно начать с небольших функций/утилит, а потом написать основную логику с их использованием.
Разберем пример на задаче с литкода Two sum.
Для массива целых чисел nums и целого числа target, найдите индексы двух чисел так, чтобы их сумма равнялась target.
Первый вариант саджеста предлагает рабочее решение перебором. Сложность такого решения O(n^2)
Давайте попробуем получить более быструю реализацию. В комментарии и названии функции можно задать разные свойства, которые хотим получить. Для некоторых функций, так можно получить более быстрый вариант со сложностью O(n).
Замена поиска по документации библиотеки или апи. Я не запоминаю названия методов из библиотек или как рисовать графики в matplotlib. Copilot с этим здорово помогает, к тому же помнит методы из разных популярных апи. Однако, я бы всего равно перепроверял Copilot. Можно провалиться в сам метод из библиотеки после автодополнения и прочитать докстринг функции.
Генерация повторяющегося кода. Когда надо написать N одинаковых по смыслу строк, например, пишешь датакласс или название колонок кодируешь в константы.
Написание тестов. Сгенерируем юнит-тесты для функций, которые написали выше.
Перевод кода из одного языка в другой. Я сейчас пишу код на python и go. Иногда препроцессинг данных или инференс простых моделей с питона переписываю на Go. Copilot выручает с быстрым переносом кода. Пишу в комментариях код на питоне, начинаю код на Go. Быстро получаю неплохой драфт, который дорабатываю. Учитывая, что на Go нет некоторых встроенных в питон фич, вроде посчитать union или intersection между сетами, помогает быстрее переписать код на новом языке.
Советы по использованию Copilot
Основные рекомендации на основе статьи про Codex, такие:
Задачу разделить до функции в 1-2 смысловых действия и генерировать их Copilot.
Писать читаемые названия функци, описания, примеры без багов.
Проверять и тестировать код, которые сгенерировали.
Используйте название функции для модификаторов. Если хочешь функцию побыстрее, пишешь под старой функцией fast_func. А в комментах, что это более быстрая версия старой функции и получаешь версию быстрее. Например, вместо того, чтобы получать строки из БД в виде объектов – сырой sql запрос. Либо пишешь в названии функции на питоне typed – получаешь аннотации типов аргументов и результата.
Если функция сложная, пишите в комментариях шаги выполнения. Можно даже не все этапы, а только первые. Это называется step-by-step reasoning. Важный момент, не писать сразу все шаги в один комментарий, а описать первый шаг → получить код → второй шаг → код.
Модель лучше работает в моно репозитории, потому что тогда ваш код будет доступен для контекста. На странице https://openai.com/blog/openai-codex/ написано, что для питона они используют контекст в 14KB, это значит, учитывают 14 000 токенов. В самой статье пруфов не нашел, но даже в худшем случае, контекст будет 4 096 токенов, как у Longformer. Неплохо, учитывая что для отступов пробелами, там отдельный токен.
Ограничения модели Codex и Copilot и что с ними делать
Авторы сами пишут, что Codex не умеет в цепочку действий, поэтому если нужно совершить больше одного действия – на каждое дополнительное действие работоспособность кода падает раза в 2-3. Под действием понимается фраза вида: “remove all instances of the letter e from the string” или “convert the string s to lowercase”.
Также ошибки возникают при использовании разных переменных и операций над ними.
"Add 3 to y, then subtract 4 from both x and w. Return the product of the four numbers."
Какого вида ошибки чаще всего возникают?
Пропуск переменных
Использование методов и переменных, которые не определены или находятся за областью видимости
Использование синтаксически неверного кода.
Как с этим бороться? Использовать описанные выше рекомендации.
Еще есть такая штука, называется alignment failure. Задача Codex – предсказывать следущий токен на основе предыдущих, учитывая статистику распределения в обучающей выборке. Поэтому, если в контексте есть небольшой баг (некорректный пример, например). Codex сгенерирует код, который будет неправильным, но будет максимально подходить под контекст, даже несмотря на то, что может сгенерировать верное решение. Грубо говоря, Codex не будет исправлять ошибки, а наоборот их использует. Такая же проблема есть и в ChatGPT.
Альтернативы Copilot
Раньше пробовал бесплатную версию TabNine, но он больше мешал, чем помогал.
Если вы не хотите, чтобы у сторонних ресурсов был доступ к вашему код, можно захостить Fauxpilot – аналог Codex у себя. Правда, там GPT-J, который ощутимо слабее.
Вместо генерации кода, можно по старинке использовать поиск. Например, есть phind, который ищет сниппетам кода.
Еще для некоторых кейсов я использую ChatGPT, обычно это что-то вроде написать большой запрос в Clickhouse. Есть разные кустарные аддоны, которые позволяют встроить ChatGPT в vscode, но я ими не пользовался, если есть подобный опыт – пишите в комментариях.
Выводы
Copilot – ускоряет разработку, особенно если знать про базовые принципы использования Codex.
Разбивайте задачу на атомарные действия и генерируйте код для их выполнения из комментариев.
Copilot помогает тратить меньше времени на повторяющиеся действия и поиск по документации.
Код Copilot все равно нужно перепроверять.
P.S.
Если статья была полезной, буду благодарен за подписку на канал commit history