👾 Советы по использованию Copilot на основе оригинальной статьи Codex

Copilot – система автодополнения кода от GitHub на основе модели Codex. Модель завернули в API и дали доступ через расширение для IDE (среды разработки). Я регулярно пользуюсь Copilot – экономит время и заменяет поиск кода в интернете. Делюсь советами разной степени очевидности, которые собрал за это время.

Tldr: Copilot подходит для повторяющихся задач и как замена поиску по документации популярных библиотек. Не подходит для решения узких сложных задач и проектов с нуля.

Структура статьи:

  1. Установка и оплата Copilot
  2. Как работает Codex
  3. Для чего удобно использовать Copilot
  4. Лайфхаки по использованию
  5. Ограничения Copilot и как их решить?

Установка и оплата Copilot

Войти на страницу через гитхаб аккаунт и привязать карту. С Российских карт оплата не пройдет. Если нет неРФ карты, попробуйте Pyypl. Это виртуальная карта, которая пополняется usdt. Я ребятам особо не доверяю, но для случаев, где нужно привязать карту – работает нормально. Поэтому держу там 5$ и  регаю на эту карту пробные версии продуктов.

Если вдруг привязали РФ карту и вам заблокировали страницу оплаты, пишете в поддержку и говорите, что есть другая карта – разблокируют форму оплаты. Сам так делал, когда появилась зарубежная карта.

Copilot дает пробные 2 месяца, потом оплата по 10$ в месяц.

Код на питоне я пишу в VSCode, а на Go в GoLand, в обеих IDE расширение ставится без проблем.

Как работает Codex

Статья: Evaluating Large Language Models Trained on Code

Под капотом Copilot модель под названием Codex. 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.

Выделение – сгенерированный Copilot код

Первый вариант саджеста предлагает рабочее решение перебором. Сложность такого решения O(n^2)

Давайте попробуем получить более быструю реализацию. В комментарии и названии функции можно задать разные свойства, которые хотим получить. Для некоторых функций, так можно получить более быстрый вариант со сложностью O(n).

Замена поиска по документации библиотеки или апи. Я не запоминаю названия методов из библиотек или как рисовать графики в matplotlib. Copilot с этим здорово помогает, к тому же помнит методы из разных популярных апи. Однако, я бы всего равно перепроверял Copilot. Можно провалиться в сам метод из библиотеки после автодополнения и прочитать докстринг функции.

Генерация повторяющегося кода. Когда надо написать N одинаковых по смыслу строк, например, пишешь датакласс или название колонок кодируешь в константы.

Написание тестов. Сгенерируем юнит-тесты для функций, которые написали выше.

Перевод кода из одного языка в другой. Я сейчас пишу код на python и go. Иногда препроцессинг данных или инференс простых моделей с питона переписываю на Go. Copilot выручает с быстрым переносом кода. Пишу в комментариях код на питоне, начинаю код на Go. Быстро получаю неплохой драфт, который дорабатываю. Учитывая, что на Go нет некоторых встроенных в питон фич, вроде посчитать union или intersection между сетами, помогает быстрее переписать код на новом языке.

Советы по использованию Copilot

Основные рекомендации на основе статьи про Codex, такие:

  1. Задачу разделить до функции в 1-2 смысловых действия и генерировать их Copilot.
  2. Писать читаемые названия функци, описания, примеры без багов.
  3. Проверять и тестировать код, которые сгенерировали.
  4. Используйте название функции для модификаторов. Если хочешь функцию побыстрее, пишешь под старой функцией fast_func. А в комментах, что это более быстрая версия старой функции и получаешь версию быстрее. Например, вместо того, чтобы получать строки из БД в виде объектов – сырой sql запрос. Либо пишешь в названии функции на питоне typed – получаешь аннотации типов аргументов и результата.
  5. Если функция сложная, пишите в комментариях шаги выполнения. Можно даже не все этапы, а только первые. Это называется step-by-step reasoning. Важный момент, не писать сразу все шаги в один комментарий, а описать первый шаг → получить код → второй шаг → код.
  6. Модель лучше работает в моно репозитории, потому что тогда ваш код будет доступен для контекста. На странице 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

Альтернативы Copilot

  • Раньше пробовал бесплатную версию TabNine, но он больше мешал, чем помогал.
  • Если вы не хотите, чтобы у сторонних ресурсов был доступ к вашему код, можно захостить Fauxpilot – аналог Codex у себя. Правда, там GPT-J, который ощутимо слабее.
  • Вместо генерации кода, можно по старинке использовать поиск. Например, есть phind, который ищет сниппетам кода.
  • Еще для некоторых кейсов я использую ChatGPT, обычно это что-то вроде написать большой запрос в Clickhouse. Есть разные кустарные аддоны, которые позволяют встроить ChatGPT в vscode, но я ими не пользовался, если есть подобный опыт – пишите в комментариях.

Выводы

  1. Copilot – ускоряет разработку, особенно если знать про базовые принципы использования Codex.
  2. Разбивайте задачу на атомарные действия и генерируйте код для их выполнения из комментариев.
  3. Copilot помогает тратить меньше времени на повторяющиеся действия и поиск по документации.
  4. Код Copilot все равно нужно перепроверять.

P.S.

Если статья была полезной, буду благодарен за подписку на канал https://t.me/c0mmit


EDIT