3,583 papers
arXiv:2608.22652 70 23 авг. 2026 г. FREE

Package Hallucination: почему LLM выдумывает несуществующие библиотеки — и как её не спровоцировать

КЛЮЧЕВАЯ СУТЬ
TL;DR
Адаптировать под запрос

TL;DR

Когда просишь LLM написать код, она может посоветовать установить библиотеку, которой физически не существует ни на PyPI, ни на npm, ни на любом другом реестре. Это не редкий баг — в среднем по языкам от 16% до 48% рекомендованных пакетов оказываются фейковыми, а для языка Ruby доходит до 95%.

Главная находка: если в переписке уже прозвучало неправильное название пакета — даже случайно, от невнимательного пользователя — модель начинает усиливать эту ошибку. Она не проверяет факт, а продолжает паттерн диалога. Под такими "заражёнными" промптами доля выдуманных пакетов подскакивает на до 45 процентных пунктов по сравнению с обычным запросом. Модель как бы решает: "раз собеседник уже назвал этот пакет — значит, он существует", и начинает достраивать вокруг него ещё больше похожих фейков.

Из проверенных защит только две реально помогают в сложных условиях: дать модели реальный список пакетов из документации (аналог RAG — модель выбирает только из проверенного списка) и попросить модель саму перепроверить свой ответ (Self-Refine — критика и исправление в несколько итераций). Технические методы уровня "перенастроить как модель выбирает токены" (guided decoding) работают неплохо в спокойных условиях, но требуют доступа к внутренним слоям модели — это недоступно в обычном чате.

🔬

Схема метода (адаптация для чата)

ШАГ 1: Получить от модели код с рекомендацией библиотек → список пакетов
ШАГ 2: Попросить модель раскритиковать свой же список: "какие из этих пакетов реально существуют в PyPI/npm/RubyGems — проверь и укажи, если не уверена" → отфильтрованный список
ШАГ 3 (сильнее): Вставить в промпт реальный список актуальных пакетов (найденный через поиск или документацию) и попросить модель рекомендовать только из него → защищённая рекомендация

Шаг 1-2 — можно сделать в одном чате последовательными сообщениями. Шаг 3 требует, чтобы ты сам нашёл список пакетов (например, через быстрый поиск) — это "ручной RAG".


🚀

Пример применения

Задача: Ты просишь Claude или ChatGPT написать Python-скрипт для парсинга цен на Wildberries и просишь порекомендовать библиотеку для работы с прокси.

Промпт (шаг 1):

Напиши скрипт на Python для парсинга цен товаров на Wildberries. 
Порекомендуй библиотеки для ротации прокси и обхода блокировок.

Промпт (шаг 2, защита):

Проверь список библиотек, которые ты только что порекомендовал. 
Для каждой из них честно скажи: ты уверена, что она существует 
на PyPI и её можно установить через pip install? 
Если не уверена на 100% — так и напиши, не выдумывай.

Результат: На шаге 1 модель выдаст код и список из 3-5 библиотек — часть из них может быть реальной (requests, fake-useragent), часть выдуманной (например, несуществующий wb-proxy-rotator). На шаге 2 модель пересмотрит список и с большей вероятностью честно укажет, в каких пакетах не уверена — но полностью гарантии это не даёт, особенно для маленьких моделей.


🧠

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

LLM не имеет доступа к живому реестру пакетов. Она полагается на то, что запомнила во время обучения — а память может путать похожие названия, особенно для непопулярных языков вроде Ruby, где пакетов меньше и совпадений имён больше.

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

Self-Refine работает, потому что заставляет модель сделать второй проход — не продолжать паттерн, а критически оценить уже написанное. Ручной RAG (вставка реального списка пакетов) работает ещё надёжнее, потому что убирает у модели необходимость угадывать вообще — она выбирает из готового меню, а не генерирует имя "из головы".

Рычаг управления: количество итераций самопроверки. В исследовании использовали до 5 циклов Self-Refine — для быстрой проверки в чате достаточно одного-двух прогона "перепроверь себя".


📋

Шаблон промпта

Задача: {опиши код, который нужно написать, включая нужные библиотеки}

После того как дашь код и список библиотек, сделай отдельным блоком 
самопроверку:
1. Для каждой упомянутой библиотеки укажи: существует ли она точно, 
   существует вероятно, или ты не уверена.
2. Если не уверена — предложи альтернативу из тех библиотек, 
   в существовании которых ты уверена на 100%.
3. Не полагайся на названия библиотек, которые я упомянул в запросе, 
   если сам не уверен в них — проверь их отдельно.

🚀 Быстрый старт — вставь в чат:

Вот шаблон защиты от выдуманных библиотек в коде. Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит про язык программирования и тип библиотек, которые тебе нужны — потому что от языка зависит, насколько высок риск (для Ruby и Rust риск выше, чем для Python и JavaScript).


⚠️

Ограничения

⚠️ Технический барьер для основного метода: Guided decoding (переключение стратегии выбора токенов на уровне модели) — ядро исследования — требует доступа к внутренним слоям и логитам модели. В обычном чате ChatGPT/Claude это применить нельзя, только через API с открытыми весами модели.

⚠️ Self-Refine ненадёжен для маленьких моделей: Модель, которая сама породила ошибку, часто не может её заметить при самопроверке — это касается особенно компактных моделей (1-3 млрд параметров), но и более крупные не дают гарантии.

⚠️ Никакая защита не даёт 100% результата: Даже лучшие методы (RAG, Self-Refine) под "заражёнными" промптами всё равно ошибаются в 20-50% случаев, особенно для Ruby.


🔍

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

Команда взяла восемь моделей (Gemma, DeepSeek-Coder, Qwen, Mistral, Llama) и прогнала их на 4000 задачах по написанию кода на четырёх языках — Python, JavaScript, Ruby, Rust. Для каждой рекомендованной библиотеки проверяли по актуальному снапшоту реестра (PyPI, npm и т.д.) на 4 марта 2026 года — существует пакет или нет.

Важная деталь дизайна: исследователи заметили, что старые методы оценки сами завышали процент "выдумок" — потому что записывали в фейковые пакеты стандартные библиотеки языка (например, os или math в Python), которых нет в реестре PyPI просто потому, что они встроены в язык. После исправления этой ошибки процент "выдумок" упал на до 9,4 процентных пункта для Python.

Дальше протестировали семь стратегий защиты — от простых (детерминированный ответ) до сложных (контрастное декодирование, RAG, самокритика) — и под конец специально спровоцировали модели, вставив в промпты фейковые названия пакетов, чтобы посмотреть, как защиты держатся под "враждебным" давлением. Именно тут раскрылась главная неожиданность: под таким давлением простые технические трюки декодирования почти не помогали, а выигрывали только RAG и Self-Refine — то есть методы, которые либо дают модели внешнюю опору (реестр), либо заставляют её остановиться и перепроверить себя, а не просто иначе выбирать следующее слово.


🔗

Ресурсы

Evaluating Inference-Time Defenses against Package Hallucination in LLM-Generated Code. Alberick Euraste Djire, Earl T. Barr, Iyiola E. Olatunji, Jacques Klein, Melissa Tessa, Tegawendé F. Bissyandé. University of Luxembourg, University College London. ASE '26 (41st IEEE/ACM International Conference on Automated Software Engineering), Мюнхен, 2026.


📖 Простыми словами

Evaluating Inference-Time Defenses Against Package Hallucination inLLM-Generated Code

arXiv: 2608.22652

Нейросети не проверяют официальные каталоги библиотек перед тем, как выдать тебе готовый скрипт. Модель работает как предиктивная машина: она генерирует правдоподобно звучащее название пакета, которого в реальности не существует. В итоге от 16% до 48% зависимостей в сгенерированном коде оказываются фейками, а для языка Ruby этот показатель пробивает дно и доходит до 95% галлюцинаций.

Это как спросить у пьяного бармена рецепт сложного коктейля: он уверенно назовёт несуществующий ликёр "Гранд-Апельсин-Плюс", потому что слово красивое. Ты приходишь в магазин, требуешь эту бутылку, а продавцы крутят пальцем у виска. Формально всё звучит логично, но запустить этот код в терминале физически невозможно.

Что с этим делать на практике: внедрять защиты на этапе инференса, включая жесткую валидацию по реестрам PyPI и npm прямо во время генерации и верификацию импортов. Если модель выдает команду вроде pip install super-fast-parser, система перехватывает вызов, чекает реестр, видит ошибку 404 и заставляет LLM переписать код под стандартную библиотеку requests.

Проблема касается не только разовых скриптов для парсинга — принцип универсален для любого стека от JavaScript до Go. Хуже того, это открыло огромную дыру в безопасности: злоумышленники находят популярные галлюцинации моделей, регистрируют эти имена и заливают туда вредоносный код. Разработчик вслепую копирует ответ нейросети, ставит пакет, а чужой сервер уже качает приватные ключи.

Короче: завязывай бездумно копировать команды pip install и npm i из чата. Слепое доверие коду от AI — это прямой путь к взлому. Либо внедряй автоматическую проверку пакетов перед запуском, либо проверяй реестры вручную, иначе вместо экономии времени ты собственноручно зальёшь троян в прод.

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

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

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