'Любая достаточно развитая технология неотличима от магии.' Артур С. Кларк
В Нейронная сеть SBC post мы видели сеть с весами 1k, обученную с 10k образцами для аппроксимации функции синуса. В этом посте мы будем использовать веса 175G, обученные сэмплами 450G, которые могут программировать лучше, чем средний программист. Размеры этих моделей впечатляют, но на самом деле никто не знает, как они работают и каковы их ограничения.
GitHub Copilot — это инструмент искусственного интеллекта, который ускоряет разработку программного обеспечения, позволяя программисту делать многие вещи, которые раньше были невозможны. На первый взгляд это похоже на использование StackOverflow, веб-сайта, куда программисты отправляют вопросы, когда не знают, как что-то сделать, но Copilot идет гораздо дальше, он способен синтезировать новый ответ для нашей проблемы.
Copilot включен в код Microsoft Visual Studio и постоянно предлагает коды, выделенные серым цветом, которые можно принять, нажав кнопку табуляции. Этот предлагаемый код можно приблизительно определить как «наиболее распространенное» совпадение между вашим запросом (вашим кодом) и набором обучающих данных (код GitHub).
Пример 1

В этом примере мы определяем нашу функцию и ее строку документации и запрашиваем завершение Copilot. Как мы видим, завершение соответствует строке документации. Первая интуиция заключается в том, что Copilot действует как поисковая система и просто сопоставляет ваш запрос со своим обучающим набором данных (150 ГБ проектов с открытым исходным кодом), но это не так.
Пример 2

Здесь мы создаем случайную/сумасшедшую строку, которой не может быть в тренировочном наборе. Результат по-прежнему выглядит как наиболее последовательное решение, которое может быть предоставлено в данном случае: сумма входных параметров.
Пример 3

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

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

Однако, если мы спрашиваем о несуществующей стране, Copilot также дает свой лучший ответ, который тоже выглядит «правильным».
Пример 6

В этом примере мы обращаем процесс, мы даем ответ, чтобы попытаться сгенерировать вопрос. Второй пилот генерирует вопрос, которого мы не ожидали. Мы ожидали: «Какая столица Франции?» и второй пилот спросил: «Каков результат следующего кода?» но все же мы можем понять правильное предложение.
Пример 7

Здесь мы заставляем второго пилота спрашивать, что мы хотим изменить на более распространенный язык и добавить первую букву. Однако возникает еще один вопрос, на этот раз совершенно неправильный и не имеющий никакого отношения к ответу.
Подводя итоги, второй пилот:
- Строит предложение на основе наиболее распространенного решения.
- Обычно правильно просто, если ваш запрос имеет смысл.
- Обычно неправильно, когда ваш запрос выглядит как обычная проблема, но это не так, и на самом деле он имеет совсем другую цель.
Copilot с использованием библиотек с открытым исходным кодом
Второй пилот прошел обучение на проектах с открытым исходным кодом. Он включает в себя миллионы вариантов использования любой библиотеки с открытым исходным кодом, такой как numpy, opencv, qt… Это делает Copilot действительно полезным, потому что он помогает программисту с наиболее распространенным предложением, которое обычно является лучшим.
Пример 8

В этом примере мы используем модульный тест модуль python, и второй пилот знает, что unittest.TestCase имеет метод с именем утверждать равно а также знает, что фу( 1, 2 ) должно быть 3.
Пример 9

Сверху создаем более сложный Foo функцию (которую мы предполагаем, что она не может быть в обучающих данных), чтобы увидеть, действительно ли второй пилот понимает код. После запуска кода с 17 тестовыми примерами только 6 не прошли, что дает коэффициент успеха 65%.
Это может показаться не таким уж большим, но имейте в виду, что Copilot не является интерпретатором Python, он не выполнял функцию для получения результата… Copilot использовал то, что узнал во время обучения, для преобразования нашего запроса в вывод, который имеет идеальный синтаксис Python и также хорошо работает в 65% случаев.
Пример 10

Можно было бы ожидать, что длинный вводимый текст приведет к сбою второго пилота, но это не так: чем больше информации мы даем, тем лучшие ответы может генерировать второй пилот.
В приведенном выше примере мы просим сложную задачу, полную программу, для решения которой требуется разное понимание, например: навыки программирования на Python, специальные библиотеки для микропитона и способы их правильного использования даже в понимании описания человеческого текста.
Полная подсказка отображается в следующей ячейке. Обратите внимание, что это очень хорошо соответствует описанию программы. Класс приложения имеет смысл, и даже библиотеки micropython (PIN, UART, ADC, PIN.irq…) используются правильно. Это не на 100% идеально, например в этом случае temp_senor является объектом ADC, который не имеет temp_sensor.init() метод, и другие небольшие ошибки могут быть сгенерированы, но вся структура программы определенно правильная, и небольшие ошибки могут быть легко исправлены.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Импортировать время Импортировать машина класс Область применения: защиту __init__(себя): себя.кнопка = машина.Штырь(0машина.шпилька.В) себя.temp_sensor = машина.АЦП(машина.Штырь(1)) себя.УАПП = машина.УАПП(1, 115200) себя.УАПП.в этом(115200, биты=8, паритет=Ничто, стоп=1) себя.последнее_событие = 0 себя.последняя_темп = 0 себя.последний раз = 0 себя.кнопка.прерывание (триггер=машина.шпилька.IRQ_FALLING, обработчик=себя.кнопка_нажата) себя.кнопка.прерывание (триггер=машина.шпилька.IRQ_RISING, обработчик=себя.кнопка_выпущено) себя.temp_sensor.в этом() защиту кнопка_нажата(себя, штырь): себя.последнее_событие = 1 себя.последний раз = время.тики_мс() себя.УАПП.написать (б'{}, {}, {}\n'.формат(себя.последний раз, себя.последнее_событие, себя.последняя_темп)) защиту button_released(себя, штырь): себя.последнее_событие = 0 себя.последний раз = время.тики_мс() себя.УАПП.написать (б'{}, {}, {}\n'.формат(себя.последний раз, себя.последнее_событие, себя.последняя_темп)) защиту read_temp(себя): себя.последняя_темп = себя.temp_sensor.читать() себя.УАПП.написать (б'{}, {}, {}\n'.формат(себя.последний раз, себя.последнее_событие, себя.последняя_темп)) защиту пробег(себя): в то время как Правда: себя.время read_temp().спать(0.1) |
Пример 11
Наконец, в приведенном ниже примере мы используем Copilot для добавления комментариев к предыдущему коду. Мы дважды скопируем класс и добавим какое-нибудь руководство по Copilot, например «Docstring version of the вышеупомянутый класс». Copilot генерирует класс и комментарии для каждой строки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # Строковая версия вышеуказанного класса класс Область применения: """ Краткий: Это простое приложение, которое считывает датчик температуры и отправляет данные на UART. Данные отправляются в формате: время, событие, температура Время — это время в миллисекундах с момента запуска приложения. Событие равно 1, если кнопка нажата, и 0, если кнопка отпущена. Темп - это температура в градусах Цельсия. «»» защиту __init__(себя): # Создаем объект кнопки себя.кнопка = машина.Штырь(0машина.шпилька.В) # Создаем объект датчика температуры себя.temp_sensor = машина.АЦП(машина.Штырь(1)) # Создаем UART-объект себя.УАПП = машина.УАПП(1, 115200) # Инициализировать объект UART себя.УАПП.в этом(115200, биты=8, паритет=Ничто, стоп=1) # Создаем переменную для хранения последнего события себя.последнее_событие = 0 # Создаем переменную для хранения последней температуры себя.последняя_темп = 0 # Создаем переменную для хранения последнего времени себя.последний раз = 0 # Зарегистрировать обработчик события нажатия кнопки себя.кнопка.прерывание (триггер=машина.шпилька.IRQ_FALLING, обработчик=себя.кнопка_нажата) # Зарегистрируем обработчик события отпускания кнопки себя.кнопка.прерывание (триггер=машина.шпилька.IRQ_RISING, обработчик=себя.кнопка_выпущено) # Инициализируем датчик температуры себя.temp_sensor.в этом() защиту кнопка_нажата(себя, штырь): # Установить последнее событие равным 1 себя.последнее_событие = 1 # Установить последнее время на текущее время себя.последний раз = время.тики_мс() # Отправляем последнее время, последнее событие и последнюю температуру на UART себя.УАПП.написать (б'{}, {}, {}\n'.формат(себя.последний раз, себя.последнее_событие, себя.последняя_темп)) защиту button_released(себя, штырь): # Установить последнее событие равным 0 себя.последнее_событие = 0 # Установить последнее время на текущее время себя.последний раз = время.тики_мс() # Отправляем последнее время, последнее событие и последнюю температуру на UART себя.УАПП.написать (б'{}, {}, {}\n'.формат(себя.последний раз, себя.последнее_событие, себя.последняя_темп)) защиту read_temp(себя): # Установить последнюю температуру на текущую температуру себя.последняя_темп = себя.temp_sensor.читать() # Отправляем последнее время, последнее событие и последнюю температуру на UART себя.УАПП.написать (б'{}, {}, {}\n'.формат(себя.последний раз, себя.последнее_событие, себя.последняя_темп)) защиту пробег(себя): в то время как Правда: # Чтение температуры себя.read_temp() # Подождите 0.1 секунды время.спать(0.1) |
и
