
Наверняка многие из вас наслышаны о ChatGPT — чат-боте с искусственным интеллектом, разработанным компанией OpenAI, который способен работать в диалоговом режиме и поддерживать запросы на естественных языках.

Наиболее привлекательной для разработчиков особенностью ChatGPT является его способность генерировать код на любом языке программирования, но будет ли такой код полезен в разработке?

Картинка создана ИИ
Попытаемся это выяснить, заставив ChatGPT решать простые задачи, которые могут встретиться в CAD проектах.
Следует заметить, что это небольшое исследование проводилось весной 2023 года. На данный момент ChatGPT мог стать гораздо умнее.
В ходе эксперимента мы предложили ChatGPT решить три задачи:
- Написать код геометрического алгоритма c нуля
- Написать код алгоритма с использованием open source библиотеки
- Дать краткое руководство по реализации алгоритма
Для решения первых двух задач требовалось написать код на С++.
1. Алгоритм нахождения пересечения двух прямых в 3D пространстве
Задание 1: написать код на С++
В ответ на первый запрос
“For the following task use C++ code.
Create structures describing 3D points, vectors and lines.
Write a function which finds the intersection point between two 3D lines.”
чат-бот написал следующий код:

Он также предоставил тесты для данной функции:

Главное достоинство этого кода — он компилируется, в остальном же алгоритм написан неправильно. Даже “expected output” в тесте не соответствует действительности.
По всей видимости, ChatGPT решил использовать метод Крамера для решения системы уравнений, однако запутался в коэффициентах, а глядя на вычисления определителя матрицы (переменная denom) и координат x и y, можно сделать вывод, что произошел «мэшап» алгоритма для двухмерных и трехмерных прямых.
Мы попросили ChatGPT объяснить написанный код, однако даже после нескольких попыток получалось что-то вроде комментариев к коду, но не объяснение сути используемого подхода:
“Этот код находит точку пересечения двух 3D линий с помощью решения системы уравнений. В данной части кода рассчитываются коэффициенты для вычисления параметров t1 и t2.
–Сначала вычисляется знаменатель denom = a1 * b2 - a2 * b1, где a1, b1 и a2, b2 - компоненты направляющих векторов первой и второй линий соответственно. Если знаменатель равен 0, значит, линии параллельны, и функция возвращает невалидную точку.
– Если знаменатель равен 0, значит, линии параллельны, и функция возвращает невалидную точку.”
И так далее. В ответ на просьбу исправить этот код было получено «альтернативное решение»:

Однако снова не получилось ничего дельного. Попытки «намекнуть» на проблемы тоже не увенчались успехом:




Самым сложным для чат-бота было оперирование различными похожими переменными типа “t1”, “line1” и т. д. На картинках выше можно наблюдать, как, например, появляется переменная “line3”, хотя в пересечении участвуют только 2 кривые.
С каждой новой попыткой исправления написанного кода получалось всё больше ошибок, код не компилировался, и, получив код, изображенный на картинке ниже, мы решили прекратить «мучить» ChatGPT этой задачей.

Задание 2: написать код на Python
WВ ходе экспериментов появилась гипотеза, что проблемы в решении этой задачи могут возникать из-за сложности языка С++, поэтому была предпринята попытка решить эту задачу на Python:

Этот код, как и весь предыдущий, не работал, однако выглядел он уже гораздо лучше, а ошибки возникали из-за попытки использовать функционал библиотеки NumPy, при том что она не была импортирована.
Разрешив использовать NumPy, мы получили работающий код уже со второй попытки!

По крайней мере, алгоритм прошел несколько тестов с разными кривыми.
Итог
- У ChatGPT не получилось написать рабочий код алгоритма на С++, однако он смог подсказать идею решения задачи, сгенерировав при этом базовый код, который можно довести до ума самостоятельно.
- У ChatGPT лучше получилось сгенерировать код на Python, возможно, из-за простоты его синтаксиса, а также наверняка большем количестве запросов от разных пользователей, на которых он мог обучиться.
2. Реализация функции Imprint с помощью библиотеки OpenCASCADE
Следующим заданием для ChatGPT стало использование готового геометрического ядра (OpenCASCADE) для написания несложного алгоритма. Выбор пал на Imprint, поскольку он еще не реализован в OpenCASCADE, а также является достаточно несложным.
Обычно в геометрических ядрах операция Imprint «отпечатывает» одно тело на другом. Если описать алгоритм общими словами, то получится следующая последовательность действий:
- Пересечь два входных тела между собой
- Найти все кривые и точки пересечения
- «Разбить» грани одного тела этими кривыми и точками, создавая новую топологию на этом теле
Например, на картинке ниже можно наблюдать результат операции Imprint, где красное тело «отпечаталось» на синем, а в результате на передней грани синего куба появились новые ребра.

В первом запросе мы сформулировали, какими инструментами необходимо пользоваться для реализации задачи, а также дали краткое объяснение функционала Impint:

В результате был получен лаконичный код:

К сожалению, такой код не компилировался, так как вызываемый метод Imprinter() не существует.
По всей видимости, чат-бот решил, что функциональность Imprint уже реализована в OpenCASCADE, а способ её использования был просто скопирован у множества похожих операций в этой библиотеке.
Попытки указать на эту ошибку оказались безуспешными:


Мы дали запрашиваемую информацию:

Но на этом скриншоте можно даже видеть выдуманный класс, который должен делать Imprint:

Далее первоначальный запрос (с небольшими уточняющими модификациями и с запретом на использование «готовой» операции Imprint) был сделан еще несколько раз, однако код, который бы можно было скомпилировать, так и не получился. Вот несколько примеров такого кода::


Как видно, чат-бот ошибается не только в том, что вызывает несуществующие методы, но также допускает ошибки в использовании существующих.
Самым близким к правильному решением был следующий код:

Визуально результат очень похож на то, как будто бы произошел Imprint (белые линии на серых гранях кубика — это ребра пересечения этого кубика с другим, который нужно было «отпечатать»), однако кривые пересечения не «разбили» топологию кубика, а значит, полноценного Imprint’а не получилось.

После этого мы сделали еще с десяток запросов, которые также были безуспешными, исходя из чего можно сделать выводы:
- ChatGPT выдумывает API методы и классы OpenCASCADE.
- ChatGPT ошибается в методах классов (использует несуществующие методы). Ошибается в include’ах.
- ChatGPT не может решить задачу, самостоятельно выбирая классы для реализации.
3. Дать краткое руководство по реализации алгоритма 3D Offset
Последняя задача не подразумевала написание кода, однако требовала кратко описать алгоритм, который предстояло реализовать, например, разработчику геометрического ядра.
В качестве такого алгоритма был взят 3D Offset тела, который путем сдвига граней тела на заданную величину получает новое уменьшенное или увеличенное тело в зависимости от направления сдвига. Получающиеся пересечения граней и возможные щели между ними должны быть правильно обработаны, чтобы в результате получилось валидное 3D тело.
Первый совет от ChatGPT, естественно, был — воспользоваться готовым CAD решением:

Однако потом было получено вполне правильное, хотя и очень общее, объяснение, каким образом нужно реализовывать 3D offset тела:

Более того, если спросить более подробно об одном из пунктов плана, то можно получить достаточно развернутый ответ:

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

К сожалению, ссылки оказались бесполезными. Например, книга “Geometric Modelling” by Michael Mortenson не содержала никакой информации про offset, научные статьи из этого списка не существуют, а ссылка на сайт opencascade не открывается.
Итог
- ChatGPT может приблизительно объяснить алгоритм.
- ChatGPT не может дать внятные ресурсы, откуда бы можно было взять более подробную информацию.
Заключение
Хотя чат-бот и не справился с поставленными задачами в полной мере, можно отметить неплохой потенциал использования ChatGPT в качестве помощника, который может подсказать идею решения или сгенерировать рутинный код.
Также стоит заметить, что польза от использования чат-бота пропорциональна тому, насколько грамотно и точно написан запрос, поэтому с теми же задачами более опытный пользователь ChatGPT мог бы справиться лучше.
Ну а пока на самый первый запрос «Сможет ли ChatGPT заменить сотрудника ЛЕДАСа» можно с уверенностью ответить «Нет!».