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.
