[Перевод] Что не так с вашим кодом, сгенерированным большими языковыми моделями?

Тип A: Синтаксическая ошибка.

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

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

67fb64eb832b97b02e606063bf68c307.png

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

965e4a65182751eba634fcdfd8d4b575.png

A.3 Ошибка импорта библиотеки. Импорт библиотеки позволяет программам Python использовать внешний код, избегая избыточной разработки. К распространенным ошибкам импорта относятся отсутствующие операторы импорта и неверные уровни импорта. В следующем примере сгенерированный код неправильно импортирует все публичные функции из библиотеки heapq в теле функции. Однако эта операция разрешена только за пределами тела функции.

acf1f97ec95b71e3ac9a5f7f26bd1a72.png

Тип B: Ошибка во время выполнения.

Ошибки времени выполнения относятся к ошибкам, которые возникают, когда код не соответствует спецификации времени выполнения, которая обнаруживается во время выполнения. Согласно таксономии, существует пять вторичных ошибок времени выполнения:  API Misuse ,  Definition Missing ,  Incorrect Boundary Condition Check ,  Incorrect Argument и Minors .

B.1 Неправильное использование API. LLM используют API для повышения эффективности выполнения кода и достижения желаемых функций. Однако неправильная интерпретация атрибутов вызывающего, неправильное использование API или неправильная идентификация типа аргумента могут привести к неправильному использованию API, что приведет к ошибкам времени выполнения в сгенерированном коде. Следующий пример иллюстрирует ошибку атрибута, возникающую из-за неправильной интерпретации типа переменной tup .

2097cd2cb1d329ce84eaa8c940a73297.png

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

3d540f23d6b6cc084e493a16f170edc6.png

B.3 Неправильная проверка граничных условий. Неправильная проверка граничных условий относится к неправильной реализации логики обработки краев или границ диапазона в программе. Как показано в коде ниже, программа не может проверить длину списка перед выполнением операции остатка, что приводит к ошибке ZeroDivisionError при обработке пустого списка.

ae95aa42745cdfefc029aa5b67b6af00.png

B.4 Неправильный аргумент. LLM иногда игнорируют указанный формат ввода в описаниях задач, что приводит к несоответствиям в количестве или типе аргументов в сгенерированном коде. Как показано в коде ниже, задача включает два ввода: первый указывает количество элементов, а второй представляет элементы для обработки. Однако сгенерированный код устанавливает только один параметр для получения элементов.

4e0f2f41b47cb65d138adc28d3e5b99b.png

B.5 Незначительные. Незначительные ошибки в ошибках времени выполнения включают ошибки тайм-аута и исключения, определяемые LLM . Программы, превышающие этот предел из-за высокой сложности алгоритма или чрезмерного количества итераций цикла, помечаются как содержащие ошибку тайм-аута. Исключения, определяемые LLM, относятся к исключениям, устанавливаемым LLM для условных ветвей в задаче, которые не имеют явно предоставленных решений.

Тип C: Функциональная ошибка.

Функциональные ошибки относятся к ошибкам в программе, которые заставляют ее вести себя неправильно или не так, как предполагалось в соответствии с ее функциональными требованиями ( т. е. код выполняется успешно, но не проходит все модульные тесты). Согласно таксономии, существует четыре вторичных функциональных ошибки:  Непонимание и логическая ошибка ,  Галлюцинация ,  Ошибка формата ввода/вывода и Незначительные .

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

5679bef7e1e82d3b88bd9b57e8c29d42.png

C.2 Галлюцинация. Галлюцинация относится к случаям, когда LLM генерирует код, который синтаксически правдоподобен, но фактически неверен или семантически бессмыслен. Как показано в коде ниже, код, сгенерированный LLM, вообще не соответствует требованиям задачи.

2eac9d3cf2a4930929120d3416c2a2b5.png

C.3 Ошибка формата ввода/вывода. В отличие от ошибки типа B.4 ( т.е. неверный аргумент), ошибка формата ввода/вывода относится к неправильному порядку входов и выходов, а также к неправильной точности выходных данных. Как показано в коде ниже, LLM неправильно преобразует вывод с плавающей точкой в ​​целое число.

aa595581ec27d492e7e411f2e6dbd7c2.png

C.4 Незначительные ошибки. Незначительные ошибки в функциональных ошибках включают неверную инициализацию ,  неоптимальный код и бесконечный цикл . Неправильная инициализация указывает на то, что логика кода верна, но неверные значения инициализации для некоторых переменных не позволяют коду проходить модульные тесты. Как показано в коде ниже, переменная max_sum неправильно инициализируется значением 0. Неоптимальный код относится к случаям, когда LLM генерирует код с использованием неоптимальных алгоритмов ( например,  жадных алгоритмов) для решения проблемы, в результате чего код может пройти только некоторые модульные тесты, но не все. Бесконечный цикл относится к коду, который не соответствует условиям выхода из цикла при определенных входных данных, что приводит к бесконечному выполнению кода.

© Habrahabr.ru