👾 Советы по использованию Copilot на основе оригинальной статьи Codex
Copilot – система автодополнения кода от GitHub на основе модели Codex. Модель завернули в API и дали доступ через расширение для IDE (среды разработки). Я регулярно пользуюсь Copilot – экономит время и заменяет поиск кода в интернете. Делюсь советами разной степени очевидности, которые собрал за это время.
Tldr: Copilot подходит для повторяющихся задач и как замена поиску по документации популярных библиотек. Не подходит для решения узких сложных задач и проектов с нуля.
Структура статьи:
- Установка и оплата Copilot
- Как работает Codex
- Для чего удобно использовать Copilot
- Лайфхаки по использованию
- Ограничения 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.
Первый вариант саджеста предлагает рабочее решение перебором. Сложность такого решения 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
Альтернативы Copilot
- Раньше пробовал бесплатную версию TabNine, но он больше мешал, чем помогал.
- Если вы не хотите, чтобы у сторонних ресурсов был доступ к вашему код, можно захостить Fauxpilot – аналог Codex у себя. Правда, там GPT-J, который ощутимо слабее.
- Вместо генерации кода, можно по старинке использовать поиск. Например, есть phind, который ищет сниппетам кода.
- Еще для некоторых кейсов я использую ChatGPT, обычно это что-то вроде написать большой запрос в Clickhouse. Есть разные кустарные аддоны, которые позволяют встроить ChatGPT в vscode, но я ими не пользовался, если есть подобный опыт – пишите в комментариях.
Выводы
- Copilot – ускоряет разработку, особенно если знать про базовые принципы использования Codex.
- Разбивайте задачу на атомарные действия и генерируйте код для их выполнения из комментариев.
- Copilot помогает тратить меньше времени на повторяющиеся действия и поиск по документации.
- Код Copilot все равно нужно перепроверять.
P.S.
Если статья была полезной, буду благодарен за подписку на канал https://t.me/c0mmit
EDIT