3,583 papers
arXiv:2601.12951 72 19 янв. 2026 г. FREE

Почему LLM ломаются на коде: длина важнее сложности

КЛЮЧЕВАЯ СУТЬ
Парадокс: То, что кажется сложным кодом (вложенные циклы, ветвления, высокая цикломатическая сложность), LLM щёлкает как орехи. А вот длинный, но логически простой код её ломает. Исследование проверило 300 метрик сложности – из них работает только одна: количество символов. Остальные 299 почти не предсказывают провал модели. Это позволяет перестать гадать где модель ошибётся, и использовать простое правило: код длиннее 50 строк = зона риска, короче 30 = безопасная зона. Раздели длинный скрипт на фрагменты по 20-30 строк – точность модели перестанет проседать. При этом модели с одинаковой общей точностью (93% vs 92%) пересекаются только в 75% решённых задач – каждая сильна в своём, поэтому перепроверка разными моделями снижает риск промаха.
Адаптировать под запрос

TL;DR

Исследование показало: традиционные метрики сложности кода (цикломатическая сложность, структура дерева синтаксиса, количество ветвлений) почти не предсказывают, справится ли LLM с пониманием кода. Единственная метрика с заметной корреляцией — длина кода: чем длиннее программа, тем выше шанс ошибки модели. При этом модели с похожей общей точностью (93% vs 92%) могут пересекаться только в 75% решённых задач — каждая сильна в своём.

Команда обучила два предиктора успеха LLM: классификатор на 300 человеческих метриках кода (размер, сложность, структура) дал точность предсказания AUROC 0.63 — чуть лучше случайного угадывания. "Shadow model" (обученная предсказывать успех напрямую из сырого кода) достигла AUROC 0.86 — лучше, но всё равно 14% ошибок остаются необъяснимыми. Из 300 метрик значение имели только 17 (5.8%), и все они так или иначе связаны с длиной.

Вывод: LLM "видят" сложность иначе, чем люди. То, что кажется человеку сложным (много вложенных циклов, запутанная логика), может быть простым для модели. А длинный, но структурно простой код — сломать её. Кроме того, разные модели ломаются на разных задачах по непредсказуемым причинам — даже самые продвинутые предикторы не могут объяснить все паттерны.


📌

Ключевые находки для работы в чате

📌

1. Длина кода — главный предиктор ошибок

Что обнаружили: Единственная традиционная метрика с заметной корреляцией — количество символов/строк кода. Цикломатическая сложность, глубина вложенности, количество переменных — всё это почти не влияет на шанс ошибки LLM.

Для тебя это значит: - 200-строчный линейный скрипт опаснее 50-строчной функции с тремя вложенными циклами - При работе с длинным кодом — разбивай на фрагменты по 20-30 строк - Не полагайся на интуицию "этот код простой" — для LLM важнее длина контекста

📌

2. Разные модели сильны в разном

Что обнаружили: Две модели с похожей общей точностью (93.1% vs 92.2%) решили по 230-234 задачи, но пересеклись только в 175 из них. Каждая уникально справилась с ~55-59 задачами, где другая провалилась.

Для тебя это значит: - Если GPT-4 дала странный ответ на важную задачу — проверь в Claude - Модели специализируются по-разному, хотя бенчмарки показывают похожие цифры - Для критичных задач (код в продакшн, важное решение) — перепроверка разными моделями снижает риск

📌

3. LLM ломаются не там, где сложно людям

Что обнаружили: Традиционные метрики сложности (ветвления, циклы, граф зависимостей) не предсказывают провалы LLM. Shadow model нашла паттерны, но они model-specific — у UniXcoder свои слабости, у GPT-4 свои, и предсказать их человеческими понятиями не получается.

Для тебя это значит: - "Простая задача" может сломать модель, "сложная" — пройти легко - Не расслабляйся на простых запросах — проверяй вывод - При ошибке не пытайся "упростить логику" — попробуй укоротить контекст или сменить модель


📌

Практические техники

📌

Техника 1: Дробление длинного кода

Проблема: LLM чаще ошибается на длинном коде, независимо от его сложности.

Решение:

Задача: Проанализировать 150-строчный скрипт парсинга данных

❌ Плохо:
"Вот 150 строк кода, найди баги"

✅ Хорошо:
"Вот функция parse_header (строки 1-25). Что она делает?"
→ Разобрался
"Вот функция validate_data (строки 26-60). Как она проверяет входные данные?"
→ Разобрался
"Вот основной цикл (строки 61-120). Как он связан с предыдущими функциями?"

Рычаги: - Размер фрагмента: 20-30 строк — безопасно, 50+ — риск растёт - Перекрытие: дай 5 строк контекста из предыдущего фрагмента для связности - Явные связи: в каждом запросе напомни "это часть скрипта для парсинга логов"

📌

Техника 2: Перепроверка разными моделями

Проблема: Модели с похожей точностью сильны в разном — ошибка в GPT не значит ошибку в Claude.

Решение:

Критичная задача: Код для обработки платежей, нужно проверить логику

1. GPT-4:
"Вот функция process_payment. Есть ли в ней логические ошибки или edge cases, которые не обработаны?"

2. Claude:
[Тот же запрос]

3. Сравни выводы:
- Где выводы совпадают → скорее всего верно
- Где расходятся → копай глубже, это зона риска

Когда применять: - Код для продакшна - Важные бизнес-решения - Анализ безопасности - Когда цена ошибки высока

📌

Техника 3: Сброс контекста при странных ответах

Проблема: Длинный диалог = длинный контекст = выше шанс ошибки.

Решение:

Ситуация: В длинном чате с анализом кода модель вдруг дала странный ответ

❌ Плохо:
Продолжать в том же чате: "Нет, ты ошибся, посмотри ещё раз"

✅ Хорошо:
1. Открой НОВЫЙ чат
2. Скопируй только нужный фрагмент кода (не всю историю)
3. Задай вопрос с нуля

Принцип: Сбрасывай накопленный контекст, возвращайся к короткому запросу

🧠

Почему это работает

Слабость LLM: Модели обрабатывают код не как люди — они видят поток токенов, не абстрактную логику. Длинный контекст усложняет attention mechanism (механизм внимания к разным частям ввода), даже если логика проста. Исследование показало: из 300 метрик сложности кода только длина имеет значение.

Сильная сторона LLM: Модели отлично справляются с локальными паттернами в коротких фрагментах. 20-30 строк — в зоне уверенности, 100+ — в зоне риска. При этом разные модели обучены на разных данных с разными приоритетами, поэтому их слабости не совпадают.

Как техники используют это: Дробление кода снижает нагрузку на attention, фрагменты попадают в "безопасную зону" длины. Перепроверка разными моделями использует разницу в специализации — вероятность что обе ошибутся одинаково низка. Сброс контекста убирает накопленный "шум" из истории диалога.

Ментальная модель: Представь, что LLM — это студент, который лучше решает 10 коротких задач, чем одну длинную, даже если длинная проще по логике. И у каждого студента (модели) свои слепые зоны, которые не предсказать заранее — поэтому перепроверка работает.


⚠️

Ограничения

⚠️ Непредсказуемость остаётся: Даже лучший предиктор (shadow model с точностью 86%) оставляет ~14% ошибок необъяснёнными. LLM могут "сломаться" на неожиданных местах, которые не предсказать ни длиной, ни сложностью, ни другими метриками.

⚠️ Только код: Исследование фокусировалось на понимании кода. Неясно, насколько выводы про длину vs сложность переносятся на другие домены (анализ текста, данных, изображений).

⚠️ Разбиение требует понимания: Дробить код на осмысленные фрагменты — нужно самому понимать структуру. Если ты не знаешь Python, разбить скрипт правильно сложно.


🔍

Как исследовали

Команда из University of Luebeck взяла 800 тысяч троек (программа, вход, выход) из CodeNet — массивного датасета с миллионами решений алгоритмических задач на Python. Для каждой тройки проверяли: правильно ли модель определяет, соответствует ли выход входу для данной программы — бинарная классификация вместо генерации кода.

Ключевая идея: если модель понимает код, она должна предсказать его поведение. Это работает и для классификационных моделей (UniXcoder), и для генеративных (GPT-4, Claude) — универсальный тест.

Затем обучили два предиктора успеха: 1. Классификатор на человеческих метриках — экстрактили 300 фичей: размер (строки, символы, токены), опкоды байткода Python, структура AST (дерево синтаксиса), цикломатическая сложность, граф зависимостей. Обучили XGBoost предсказывать: справится ли модель с этой задачей? 2. Shadow model — файн-тюн UniXcoder на сыром коде без фичей. Задача: предсказать успех модели напрямую из текста программы, входа и выхода.

Результат удивил: человеческие метрики дали AUROC 0.63 (едва лучше случайного 0.5), shadow model — 0.86 (хорошо, но не идеально). Применили SAGE (метод из теории игр для оценки важности фичей) — выяснилось, что из 300 метрик значимы только ~17 (5.8%), и все они коррелируют с длиной кода.

Ещё интереснее: топ-фичи различаются между моделями. UniXcoder смотрит на лексику (количество токенов, идентификаторов), GPT-OSS-120B — на опкоды и плотность графа. Это объясняет, почему модели с похожей точностью решают разные наборы задач.

Финальный инсайт: shadow model предсказывает лучше, но 14% ошибок остаются необъяснимыми. LLM имеют model-specific паттерны провалов, которые не сводятся ни к человеческим метрикам, ни к простым learned features. Это означает фундаментальную непредсказуемость — даже продвинутые методы не дают гарантий.


🔗

Ресурсы

"Beyond Accuracy: Characterizing Code Comprehension Capabilities in (Large) Language Models"

Felix Mächtle, Jan-Niclas Serr, Nils Loose, Thomas Eisenbarth

ITS, University of Luebeck, Germany

GitHub репозиторий: https://github.com/UzL-ITS/code-comprehension-capabilities-llms


📋 Дайджест исследования

Ключевая суть

Парадокс: То, что кажется сложным кодом (вложенные циклы, ветвления, высокая цикломатическая сложность), LLM щёлкает как орехи. А вот длинный, но логически простой код её ломает. Исследование проверило 300 метрик сложности – из них работает только одна: количество символов. Остальные 299 почти не предсказывают провал модели. Это позволяет перестать гадать где модель ошибётся, и использовать простое правило: код длиннее 50 строк = зона риска, короче 30 = безопасная зона. Раздели длинный скрипт на фрагменты по 20-30 строк – точность модели перестанет проседать. При этом модели с одинаковой общей точностью (93% vs 92%) пересекаются только в 75% решённых задач – каждая сильна в своём, поэтому перепроверка разными моделями снижает риск промаха.

Принцип работы

Не оценивай сложность кода для LLM человеческими метриками (циклы, ветвления, граф зависимостей) – для модели важна длина контекста, а не логическая запутанность. 150-строчный линейный скрипт опаснее 40-строчной функции с тремя вложенными условиями. Attention mechanism перегружается количеством токенов, а не сложностью алгоритма. Модель отлично держит локальные паттерны в 20-30 строках, но на 100+ начинает терять связи даже в простой логике.

Почему работает

Команда обучила два предиктора провалов LLM. Классификатор на 300 человеческих метриках (цикломатическая сложность, глубина дерева синтаксиса, количество переменных) дал точность AUROC 0.63 – чуть лучше случайного угадывания. «Shadow model», обученная предсказывать успех напрямую из сырого кода, достигла AUROC 0.86 – лучше, но 14% ошибок остались необъяснимыми. Из 300 проверенных метрик значение имели только 17 (5.8%), и все они прямо или косвенно связаны с длиной кода. LLM обрабатывает код как поток токенов, не как абстрактную логику – длинный контекст перегружает механизм внимания, даже если логика примитивна. При этом две модели с похожей точностью решили по 230-234 задачи, но пересеклись только в 175 из них – у каждой свои слепые зоны, которые не предсказать заранее.

Когда применять

Работа с кодом в LLM → конкретно для анализа, отладки, рефакторинга, особенно когда скрипт длиннее 50 строк или задача критичная (код в продакшн, обработка платежей, логика безопасности). Также для перепроверки важных выводов – если GPT-4 дала странный ответ, Claude может увидеть правильное решение. НЕ подходит: Если нужно проанализировать архитектуру целиком (связи между модулями, глобальные зависимости) – дробление на фрагменты потеряет контекст.

Мини-рецепт

1. Дробление длинного кода: Раздели скрипт на логические фрагменты по 20-30 строк (функция, класс, основной цикл). В каждом запросе давай 5 строк контекста из предыдущего фрагмента для связности. Напоминай: это часть скрипта для парсинга логов.

2. Перепроверка разными моделями: Для критичных задач (продакшн-код, безопасность) задай одинаковый вопрос GPT-4 и Claude. Где выводы совпадают – скорее всего верно. Где расходятся – зона риска, копай глубже.

3. Сброс контекста при сбоях: Если в длинном диалоге модель вдруг дала странный ответ – не продолжай в том же чате. Открой новый чат, скопируй только нужный фрагмент кода (не всю историю), задай вопрос с нуля. Сброс убирает накопленный «шум» из контекста.

Примеры

[ПЛОХО] : Вот 150-строчный скрипт парсинга логов. Найди баги и предложи улучшения – модель перегружается длиной, высокий риск пропустить ошибку или дать поверхностный анализ.
[ХОРОШО] : Вот функция parse_header (строки 1-25) из скрипта парсинга логов. Что она делает и есть ли логические ошибки? → получил ответ → Вот функция validate_data (строки 26-60, продолжение того же скрипта). Как она проверяет входные данные? → разобрался → Вот основной цикл (строки 61-90). Как он связан с parse_header и validate_data? – каждый фрагмент в безопасной зоне длины, модель держит фокус.
Источник: Beyond Accuracy: Characterizing Code Comprehension Capabilities in (Large) Language Models
ArXiv ID: 2601.12951 | Сгенерировано: 2026-01-21 06:30

Проблемы LLM

ПроблемаСутьКак обойти
Модель ломается на длинном коде, а не на сложномЧеловеческая интуиция: сложная логика = сложно для модели. Реальность: вложенные циклы, ветвления, граф зависимостей почти не влияют на ошибки. Влияет длина — количество строк или символов. 200 строк простого кода опаснее 50 строк запутанной логики. Почему плохо: расслабляешься на "простой" задаче, получаешь ошибку. Или усложняешь "сложную" задачу, хотя проблема в другомРазбивай код на куски по 20-30 строк. Не по сложности, а по длине. Длинный линейный скрипт — режь на фрагменты. Короткая запутанная функция — можно целиком
📖 Простыми словами

Beyond Accuracy: Characterizing Code Comprehension Capabilities in (Large)LanguageModels

arXiv: 2601.12951

AI-модели понимают код не так, как программисты — они не строят в голове сложные логические деревья и не отслеживают вложенность циклов. Для них код — это просто линейный поток токенов, длинная цепочка символов, в которой нужно угадать следующую связь. Пока мы мучаемся с хитрыми алгоритмами, нейронка спотыкается на вещах, которые кажутся нам элементарными. Корень проблемы в том, что механизм внимания (attention) забивается лишним шумом: чем больше текста, тем выше шанс, что модель потеряет нить и выдаст чушь.

Это как пытаться прочитать инструкцию к шкафу из Икеи, которую растянули на сто страниц мелким шрифтом. Сама сборка может быть примитивной — прикрути две доски и готово, — но из-за бесконечного полотна текста ты теряешь фокус и в итоге вкручиваешь шуруп не туда. Модели плевать на интеллектуальную глубину задачи, её убивает чисто физический объем информации, который нужно удержать в памяти одновременно.

Исследование разнесло в щепки классические метрики: цикломатическая сложность, количество ветвлений и структура синтаксического дерева вообще не влияют на результат. Реально работает только один фактор — длина кода. Из 300 проверенных параметров только количество строк предсказывает, облажается модель или нет. Если код длинный, модель «плывет», даже если там написан простейший принт. При этом выяснилось, что модели с одинаковой точностью в 93% могут выдавать разные ответы в четверти случаев — каждая лажает в своих уникальных местах.

Тестировали всё это на понимании кода, но принцип универсален для любой работы с LLM, будь то анализ юридических договоров или написание ТЗ. Неважно, насколько сложную мысль ты заложил, — если ты размазал её по тексту, модель с большой вероятностью потеряет контекст. Старая школа программирования учила нас, что сложность в логике, но в эпоху AI сложность — это объем.

Короче: забудь про заумные метрики сложности, они больше не работают как мерило «трудности» для машины. Главный враг понимания — это избыточность и длина, а не хитровыдуманные алгоритмы. Если хочешь, чтобы нейронка тебя поняла, режь код на куски и избавляйся от воды, иначе даже самая мощная модель превратится в невнимательного стажера. Кто научится упаковывать смыслы компактно, тот и приручит AI, а остальные будут удивляться, почему их «гениальные» промпты выдают мусор.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с