← Вернуться SAID v1.0
SAID, март 2026

Все AI-модели галлюцинируют пакеты: как это становится оружием

Исследование «Importing Phantoms» впервые систематически измерило галлюцинации пакетов в 11 языковых моделях. Результат: ни одна модель не застрахована, а злоумышленники уже эксплуатируют эту уязвимость через slopsquatting.

11 моделей протестировано
0.22%–46.15% диапазон галлюцинаций
23.14% галлюцинаций в Python
26.9% кодовые модели хуже общих

Проблема, которую никто не измерял

Когда разработчик просит AI-ассистента написать код, модель генерирует не только логику, но и список зависимостей — import и require для пакетов, которые предположительно существуют. Проблема в том, что иногда эти пакеты не существуют. Модель галлюцинирует правдоподобное имя библиотеки, которой нет ни в npm, ни в PyPI, ни в crates.io.

До января 2025 года масштаб этой проблемы оставался неизвестным. Были отдельные наблюдения, анекдотические случаи, обсуждения на форумах. Но системного исследования — с контролируемыми экспериментами, несколькими моделями и языками программирования — не существовало.

Статья «Importing Phantoms: Measuring and Mitigating LLM Package Hallucinations», представленная на ICML 2025 (arXiv:2501.19012), заполнила этот пробел. И результаты оказались хуже, чем предполагалось.

Дизайн эксперимента

Исследователи протестировали 11 языковых моделей — как специализированные кодовые (CodeLlama, StarCoder2, Granite), так и общего назначения (GPT-4o, Claude 3.5, Llama 3.1). Тестирование проводилось на трёх языках программирования: Python, JavaScript и Rust.

Методология была строгой: 7 различных шаблонов промптов, 13 задач программирования, каждый эксперимент повторялся 5 раз для контроля стохастичности. Это дало 455 точек данных на каждую модель — достаточно для статистически значимых выводов.

Каждый сгенерированный пакет проверялся по реальным реестрам: PyPI для Python, npm для JavaScript, crates.io для Rust. Если пакет не существовал — это фиксировалось как галлюцинация.

Все модели галлюцинируют

Главный вывод исследования прост и тревожен: все 11 протестированных моделей производят галлюцинированные пакеты. Это не баг конкретной модели — это системное свойство текущего поколения языковых моделей.

Диапазон оказался широким: от 0.22% у Nemotron на JavaScript до 46.15% у Granite на Python. Но даже лучшие модели не смогли показать нулевой результат. В реальном использовании, где разработчик генерирует десятки фрагментов кода в день, даже 0.22% означает регулярное появление несуществующих пакетов.

Модель Python JavaScript Rust
Granite Code 46.15% 18.72% 34.88%
CodeLlama 35.21% 22.41% 28.33%
StarCoder2 29.87% 15.63% 25.14%
GPT-4o 5.71% 2.34% 8.92%
Claude 3.5 4.88% 1.95% 7.41%
Nemotron 3.42% 0.22% 5.18%

Парадокс кодовых моделей

Один из самых контринтуитивных результатов: модели, специально обученные для генерации кода, галлюцинируют пакеты значительно чаще, чем модели общего назначения. Средний показатель галлюцинаций у кодовых моделей составил 26.9%, тогда как у общих — 13.6%.

Объяснение кроется в механизме обучения. Кодовые модели обучаются на огромных корпусах кода из GitHub, включая устаревшие, переименованные, удалённые и никогда не существовавшие пакеты (из учебников, черновиков, экспериментального кода). Модель запоминает паттерны именования и уверенно генерирует имена, которые выглядят как настоящие пакеты, но таковыми не являются.

Модели общего назначения, обученные на более разнообразных данных, оказываются более «осторожными» в генерации имён пакетов — они чаще используют реально существующие, популярные библиотеки, потому что именно они чаще встречаются в обучающих данных наряду с их описаниями и документацией.

Python — самый рискованный язык

Среди трёх протестированных языков Python показал наибольшую долю галлюцинаций — 23.14% в среднем по всем моделям. JavaScript оказался на втором месте с 14.73%, а Rust — где-то между ними.

Это объясняется экосистемой: PyPI содержит более 500 000 пакетов с относительно свободными правилами именования. Модели, обученные на Python-коде, видели огромное разнообразие имён и легко генерируют новые, правдоподобно звучащие, но не существующие. JavaScript-экосистема npm, несмотря на ещё больший размер, имеет более строгие паттерны именования (scoped packages, namespace-конвенции), что снижает вероятность галлюцинации.

Размер имеет значение, но не решает проблему

Исследование подтвердило интуитивное предположение: более крупные модели (70B+ параметров) галлюцинируют реже, чем малые. Это логично — больший объём параметров позволяет лучше запоминать реальные имена пакетов.

Однако даже самые крупные модели не достигают нулевого уровня галлюцинаций. GPT-4o и Claude 3.5, одни из самых мощных доступных моделей, показали 2-9% галлюцинаций в зависимости от языка. Это означает, что увеличение размера модели — необходимое, но недостаточное решение.

Интересная корреляция обнаружена с бенчмарком HumanEval: модели с высоким показателем HumanEval (то есть лучше решающие задачи программирования) производят меньше галлюцинированных пакетов. Коэффициент корреляции Спирмена составил rho = -0.79, что указывает на сильную обратную связь. Однако даже модели с отличными показателями HumanEval не свободны от галлюцинаций полностью.

Slopsquatting: когда галлюцинация становится оружием

Галлюцинации пакетов сами по себе — неприятность: код не компилируется, разработчик тратит время на отладку. Но в 2025 году эта неприятность превратилась в полноценный вектор атаки, получивший название slopsquatting.

Механизм атаки элегантен: злоумышленник выясняет, какие несуществующие пакеты чаще всего галлюцинируют популярные модели, и регистрирует их в реестрах (PyPI, npm). Внутри пакета — вредоносный код: кража учётных данных, установка бэкдора, криптомайнер. Когда AI-ассистент в следующий раз порекомендует этот пакет разработчику, тот установит его командой pip install или npm install — и скомпрометирует свою систему.

Реальные случаи

Slopsquatting — не теоретическая угроза. Исследователи уже зафиксировали реальные случаи эксплуатации:

Эти случаи показывают, что slopsquatting уже работает в масштабе. Тысячи разработчиков устанавливали вредоносные пакеты, потому что доверяли рекомендации AI-ассистента.

Почему это масштабируется

Исследование «Importing Phantoms» показало важную характеристику галлюцинаций: они воспроизводимы. Если модель галлюцинирует пакет data-sanitizer-pro при определённом промпте, она будет делать это снова и снова. Это означает, что злоумышленнику достаточно протестировать популярные промпты, выявить стабильные галлюцинации и зарегистрировать соответствующие пакеты.

Более того, разные модели часто галлюцинируют одни и те же имена. Правдоподобно звучащие пакеты вроде python-docx-parser или fast-json-validate появляются у нескольких моделей, что увеличивает охват атаки: один вредоносный пакет получает установки от пользователей разных AI-ассистентов.

Цепочка атаки

Полная цепочка slopsquatting-атаки выглядит так:

  1. Разведка: злоумышленник систематически промптит популярные модели, собирая галлюцинированные имена пакетов
  2. Регистрация: самые часто встречающиеся имена регистрируются в PyPI/npm с правдоподобным описанием и README
  3. Ожидание: AI-ассистент рекомендует галлюцинированный пакет реальному разработчику
  4. Установка: разработчик выполняет pip install — пакет существует, устанавливается без ошибок
  5. Компрометация: вредоносный код выполняется при установке или импорте

Каждый шаг этой цепочки технически тривиален. Регистрация пакета на PyPI занимает минуты и не требует верификации. Именно поэтому slopsquatting — одна из самых доступных и масштабируемых атак на цепочку поставок.

Что можно сделать

Исследование предлагает несколько направлений митигации, но ни одно из них не является полным решением:

Фундаментальная проблема

Галлюцинации пакетов — частный случай более общей проблемы: языковые модели генерируют правдоподобный текст, но не обязаны генерировать истинный. Модель не «знает», какие пакеты существуют — она предсказывает наиболее вероятное продолжение текста. Если from dataprep.clean import clean_email выглядит правдоподобно, модель сгенерирует это, вне зависимости от того, существует ли пакет dataprep.

Эта проблема не будет полностью решена увеличением размера моделей или объёма обучающих данных. Она требует архитектурных изменений: интеграции с реальными реестрами, RAG-подхода к генерации зависимостей, верификационных слоёв между генерацией и исполнением кода.

До тех пор каждый import в AI-сгенерированном коде — это потенциальный вектор атаки. И относиться к нему нужно соответственно.

Источники

  1. Importing Phantoms: Measuring and Mitigating LLM Package Hallucinations — arXiv:2501.19012 (январь 2025), принято на ICML 2025
  2. Trend Micro — «Slopsquatting: How AI Hallucinations Poison the Software Supply Chain» (2025)
  3. Socket.dev — «Detecting AI-Hallucinated Packages in npm and PyPI» (2025)
  4. BleepingComputer — «huggingface-cli malicious PyPI package downloaded 30,000 times» (2025)
  5. NIST — «AI-Generated Code and Software Supply Chain Risks» (2025)

Как SAID решает эту проблему

SAID (Safe AI Development) адресует проблему галлюцинаций пакетов через несколько правил:

  • Правило верификации зависимостей: каждый пакет, рекомендованный AI, проверяется по реестру до установки — автоматически, в CI/CD-пайплайне
  • Правило ревью AI-кода: сгенерированный код проходит такой же ревью, как написанный человеком — включая проверку зависимостей
  • Правило lock-файлов: воспроизводимые сборки через фиксацию зависимостей предотвращают внедрение новых пакетов без явного одобрения
  • Правило мониторинга: новые зависимости в проекте автоматически проверяются на возраст, репутацию и историю мейнтейнеров

Галлюцинации невозможно устранить полностью, но можно построить процесс, который их надёжно перехватывает.