Вот как GitHub Copilot выполняет собеседования по программированию

Обзор

Github Copilot - это новый продукт, созданный OpenAI как «Программист вашей пары AI». Это плагин, который вы устанавливаете в VSCode, он прост в использовании и установке. Я тестировал его на прошлой неделе и хотел проверить, насколько он эффективен, поэтому я ответил на 3 вопроса по кодированию в Интернете, которые представляют собой набор подготовленных вопросов для собеседования с ним, чтобы увидеть, как он будет работать.

Как работает GitHub Copilot? Copilot работает на глубокой языковой модели нейронной сети под названием Кодекс. Codex - это отлаженная модель GPT, обученная на основе кода Github.

Github Copilot тестировался на тестовом наборе под названием HumanEval, созданном OpenAI специально для измерения функциональной корректности для синтеза программ из строк документов. При тестировании модель решает 28,8% проблем.

Тот факт, что Copilot обучается на общедоступном коде под различными лицензиями, привел к многочисленным дискуссиям о его юридических последствиях. Мы просто проанализируем это с технической точки зрения кодовой базы.

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



Прохождение

Я искал проблемы, которые технические гиганты, такие как Facebook, задавали новым кандидатам, и как они их решали. Три вопроса из набора 40 вопросов для собеседования по программированию в Facebook, которые кандидаты могут использовать для подготовки к собеседованию в Facebook, чтобы увидеть, насколько мощным является Github Copilot.

Сначала, чтобы увидеть, насколько мощен Github Copilot

Проблема первая: переместите нули влево

Первый был следующим:

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

Во-первых, я начал добавлять комментарии, чтобы описать, что хотел сделать код, который я писал. Copilot подобрал и предложил несколько хороших предложений автозаполнения.

Но, как вы можете видеть, он предложил, например, неправильный вывод для описанной проблемы, хотя его предложение было довольно близко к тому, что я хотел. Интересно, что вывод примера отличается от того, что мы хотели, но все же довольно близко. Кажется, что Copilot не «понимает», о чем просят, что имеет смысл.

Также было замечательно замечание о том, что код должен быть на месте. Именно о чем спрашивал вопрос.

Интересно, является ли это результатом вопроса, который я выбрал из Интернета, и если алгоритм научился через него, и он просто запомнил его. Затем я пишу определение функции и определение теста в виде скелета, чтобы посмотреть, что генерирует Copilot.

Кажется, что решение, которое дал Copilot, было близко к тому, что мы хотели, но не совсем так. Функция изменения массива сдвигает ноль вправо, а не влево, но с небольшими изменениями она может заставить функцию сдвигать нули влево, а не вправо. Нам просто нужно изменить начальную точку, чтобы она находилась в конце массива, а не в начале, и уменьшить указатели вместо их увеличения. Для этого будет достаточно следующего кода:

Кажется, что решение, которое дал Copilot, было близко к тому, что мы хотели, но не совсем то, что нам нужно.

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

Я не уверен, что решение Copilot будет оценено на собеседовании, но если бы его использовал кодировщик, это определенно могло бы помочь в поиске правильного решения проблемы.

Интересно то, что Copilot позволяет видеть различные предложения по автозаполнению кода. Все они очень похожи и нуждаются в кодировщике, чтобы выяснить, есть ли правильное решение.

Вторая проблема: интервалы слияния

Теперь перейдем к следующей задаче, где мы хотим выяснить, как объединить перекрывающиеся интервалы. Описание проблемы следующее:

Вам предоставляется массив (список) пар интервалов в качестве входных данных, где каждый интервал имеет отметку времени начала и окончания. Входной массив сортируется по начальным отметкам времени. Вам необходимо объединить перекрывающиеся интервалы и вернуть новый выходной массив

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

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

Проблема третья: обратные слова

Для третьей проблемы, которую мы тестировали GitHub Copilot, мы использовали более сложную задачу. Мы хотели перевернуть каждое слово. Так, например, для ввода «Hello World» мы хотели вернуть «olleH dlroW».

В этом примере GitHub Copilot сначала испытывал трудности с заданными входными данными, выдавал нужные нам выходы, а для решения он не рекомендовал правильное решение.

Ввод: «Привет, мир»

Выход: «olleH dlroW».

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

Правильное решение состоит из двух шагов, и согласно статье OpenAI о Кодексе:

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

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

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

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

Юзабилити

Что больше всего впечатляет в Github Copilot, так это то, что он никогда не зависал в пользовательском интерфейсе, пока я его использовал, а когда я использовал другие инструменты в том же пространстве, они либо забирали память, либо процессор. У меня не было резких скачков в использовании ЦП или памяти. Я также не заметил всплеска использования сети в мониторе активности. В целом, это было очень гладко, чего не было с другими помощниками кода.

Заключение

Исходя из моего опыта решения этих проблем и тестирования его в течение недели с Github Copilot, кажется, что этот инструмент определенно не выдержит собеседования с техническим гигантом по программированию.

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

Однако Copilot кажется сверхмощным инструментом, который может повысить продуктивность разработчиков и ускорить разработку с использованием его на VSCode. И я полагаю, что со временем он станет лучше, поскольку OpenAI и Github получат отзывы пользователей и улучшат модель. Он определенно может стать лучше по мере того, как языковые модели станут более мощными и если сообщество разработчиков программного обеспечения примет Github Copilot.

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

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