Спойлер: он плохо понимает Голанг. Но все равно впечатляет.
В Интернете есть много ресурсов для подсказок 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.
Пока еще очень хорошо. Следующей задачей было попросить его исправить ошибки. Я намеренно добавил две ошибки в приведенный выше код для последующих вопросов.
- Я изменил обратные функции в
add
иmul
, чтобы переопределить дочерние градиенты, а не добавлять к ним. На самом деле это распространенная ошибка при реализации обратного распространения. Градиент переменной должен учитывать производные от всех путей. - Я изменил вызов
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 и найдите прекрасную работу