Спойлер: он плохо понимает Голанг. Но все равно впечатляет.

В Интернете есть много ресурсов для подсказок ChatGPT о коде Python. Думаю, я бы попробовал Golang, так как это мой основной язык программирования. И тайно, я хочу посмотреть, достаточно ли это хорошо, чтобы устареть как человек-программист.

Простая программа Golang

Я начал с очень простой программы Golang:

Я попросил ChatGPT написать сводку кода. Это сделало довольно приличную работу. См. ответ ChatGPT ниже. Его ответ также включал подробное объяснение того, как работает программа, но я не буду утомлять вас этими подробностями.

ChatGPT Response:
......
In summary, this program defines a function that calculates the sum of two
integers and demonstrates how to call and print the result of that function
in the main function.

Затем я бросил вызов, изменив строку a + b на a — b и посмотрев, не запутается ли она. Он был удивительно хорош в обнаружении одного варианта линии и полностью изменил свой ответ, чтобы отразить значимость.

ChatGPT Response
......
In summary, this program defines a function that calculates the difference
between two integers and demonstrates how to call and print the result of
that function in the main function.

Теперь очевидно, что a — b внутри функции sum выглядит как ошибка. Итак, я попросил ChatGPT найти ошибки в проблеме. Он правильно определил несоответствие между арифметикой и именем функции.

ChatGPT Response:
The bug in the code is that the sum function is not calculating the sum of
the two integers correctly. Instead, it is calculating the difference
between them using the - operator, which is not consistent with the
function name.
......

Кроме того, ChatGPT распечатал исправленную программу, которая была идентична той, что была выше. Пока что не плохо!

Более сложная программа Golang

Приведенный выше тест был слишком простым. На самом деле программа была просто программой «Hello World». Кроме того, это также был типичный пример Golang, который, вероятно, уже существовал в Интернете, а это означало, что ChatGPT, вероятно, видел его в обучающих данных. И последнее, но не менее важное (на самом деле это было довольно тонко), все вышеперечисленные вопросы были заданы в одной и той же ветке ChatGPT. Таким образом, у ChatGPT была возможность установить правильный контекст для более сложных вопросов о a — b позже.

Для более интересного теста я написал немного более сложную программу на Golang. Программа построила вычислительный график и рассчитала градиенты для всех переменных на графике. Он вдохновлен Python MicroGrad. На самом деле было несколько репозиториев Github, в которых реализована версия MicroGrad для Golang. Но, по крайней мере, это было нетипично для людей в Голанге. Итак, мы надеемся, что он эмулировал более реалистичную ситуацию использования ChatGPT для понимания нового кода Golang.

Полная программа выглядит следующим образом. Я намеренно не добавлял в код никаких комментариев, чтобы сделать его более сложным для ChatGPT.

ChatGPT на самом деле выдал довольно впечатляющее описание того, что делает программа:

ChatGPT Response:
The code defines a Value struct, which represents a value in a computational
graph, with a data field, a gradient field, a backward function field, and
a children field that contains the values that this value depends on. The
code also defines two methods on the Value struct, add and mul, which create
a new value by performing addition or multiplication of two values,
respectively, and set the backward function for the new value. The code also
defines a backprop function, which performs backpropagation on a given value
by building a topological order of the graph, setting the gradient of the
output value to 1, and then computing the gradients of the input values by
traversing the graph in reverse topological order and calling the backward
function for each value. Finally, the main function creates three values,
performs a computation using the add and mul methods, calls backprop to
compute gradients, and prints the result.

Пока еще очень хорошо. Следующей задачей было попросить его исправить ошибки. Я намеренно добавил две ошибки в приведенный выше код для последующих вопросов.

  1. Я изменил обратные функции в add и mul, чтобы переопределить дочерние градиенты, а не добавлять к ним. На самом деле это распространенная ошибка при реализации обратного распространения. Градиент переменной должен учитывать производные от всех путей.
  2. Я изменил вызов newValue как в add, так и в mul, чтобы пропустить настройку дочерних элементов для нового Value. Вычислительный граф фактически не связан после этого изменения.

Обновленный код ошибки для add и mul выглядит следующим образом:

Затем я попросил ChatGPT найти ошибки. Обратите внимание, что это было сделано в новом потоке ChatGPT, чтобы избежать «утечки» исходной правильной программы в ChatGPT через контекст. ChatGPT обнаружил кое-что о проблеме += и =:

ChatGPT Response:
The bug is in the backward function of the add method. When computing the
gradients during backpropagation, the grad of nv should be added to both
v.grad and v1.grad.
......

Но следующая его фраза в ответе противоречила сама себе:

ChatGPT Response:
......
However, the current implementation adds nv.grad to both v.grad and
v1.grad, which is incorrect.

The logical response should be:
However, the current implementation overrides both v.grad and v1.grad with
nv.grad, which is incorrect.

Тем не менее, ChatGPT продолжал генерировать правильный код как для add, так и для mul, хотя в своих рассуждениях выше он неправильно объяснил ошибку в add и даже ничего не упомянул о mul. Итак, в данном случае ChatGPT — это всего лишь языковой автодополнитель.

Затем я нажал и попросил найти другую ошибку. Это невозможно. Но, по крайней мере, он признал это и попросил больше контекста.

ChatGPT Response:
I couldn't find any other bug in the code you provided. If you can provide
me with more information or context, I can try to help you find any other
bugs.

Итак, я намекнул, что «обратное распространение не распространяется обратно на конечные узлы». Это дало ChatGPT несколько зацепок, но, к сожалению, не нашло нужного места.

ChatGPT Response:
You're right, there seems to be another bug in the code. The backpropagation
function (backprop) is not propagating gradients back to the leaf nodes,
which is causing the grad values of the leaf nodes to remain 0. This is
because the buildTopo function, which is used to build the topological
order of nodes to traverse during backpropagation, only visits nodes that
have not been visited before. Therefore, the leaf nodes, which do not have
any children, are not being visited by this function, and their gradients
are not being computed.

Этот ответ был полной чушью. Итак, я дал более прямой намек на то, что «ошибка на самом деле заключается в том, что children не заполняется». ChatGPT быстро вернулся с чем-то более близким, но все еще неверным.

ChatGPT Response:
You're correct, the bug is in the newValue function where the children
parameter is not being correctly assigned to the children field of the
Value struct. Instead, the children field is being initialized to nil.

Итак, в конце концов, я дал очень прямой и сильный отзыв: «нет, я имел в виду дочерние элементы newValue внутри функций add и mul». Теперь ChatGPT наконец нашел проблему:

ChatGPT Response:
I apologize for the confusion. You are correct that there is a bug in the
add and mul functions where the children field of the newly created Value
instance is not being correctly set. To fix the bug, we can update the add
and mul functions to correctly set the children field of the newly created
Value instance.

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

ChatGPT Response:
o.data=11.000000, a.grad=2.000000, b.grad=1.000000, c.grad=2.000000

Correct output should be:
o.data=8.000000, a.grad=2.000000, b.grad=1.000000, c.grad=2.000000

Заключение

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

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу