Локальный контур начинается до первого запроса

Когда компания говорит «мы запускаем ИИ у себя», она обычно имеет в виду, что клиентские документы не отправляются внешнему API во время работы модели. Это важное свойство, но оно не отвечает на другой вопрос: что именно попало на сервер при установке? Веса, конфигурация, токенизатор, адаптеры, код модели и зависимости приходят извне. Их загрузка — часть цепочки поставки программного обеспечения. OWASP относит сторонние предобученные модели, данные, адаптеры и платформы запуска к рискам этой цепочки.

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

Три разных вопроса, которые часто смешивают

Первый — может ли файл выполнить код при загрузке. Hugging Face прямо предупреждает о рисках десериализации pickle; многие старые PyTorch-чекпойнты используют этот формат. `safetensors` хранит тензоры без механизма выполнения произвольных pickle-инструкций и потому предпочтительнее для весов. Но безопасный формат одного файла не делает безопасными остальные компоненты пакета. Если запуск требует `trust_remote_code=True`, приложение доверяет пользовательскому коду из репозитория модели. Такой код надо читать и одобрять отдельно либо выбирать модель, которую поддерживает установленная библиотека без удалённого кода.

Второй вопрос — целостность и происхождение. SHA-256 показывает, что локальный файл совпадает с выбранным эталоном; он не доказывает добросовестность автора. Если хеш и файл взяты из одной скомпрометированной страницы, совпадение мало помогает. Надёжнее зафиксировать официальную организацию разработчика, адрес исходного репозитория, полный идентификатор коммита и собственный список хешей после приёмки. Hugging Face Hub позволяет скачать снимок конкретной ревизии; в документации отдельно сказано, что для hash-ревизии нужен полный commit hash, а не его короткая форма.

Третий вопрос — пригодность самой модели. Она может быть честно опубликована, иметь безопасный формат и всё же не подходить для коммерческой задачи: неясная лицензия, ограничения на использование, неудовлетворительное качество на русском языке, неподъёмное требование к памяти или ошибки на ваших документах. Формат файла не является сертификатом качества, а антивирусный значок не подтверждает права на использование.

Маршрут приёмки без тяжёлой бюрократии

Для одного пилота достаточно карточки поставки, которую можно вести в обычном внутреннем реестре. В ней должны быть:

  • исходная организация и точный URL репозитория, а не похожая по названию чужая квантизация;
  • модельная карточка, лицензия и коммерческие ограничения, включая условия для адаптера, если он нужен;
  • полный commit исходной ревизии, перечень фактически нужных файлов и их контрольные суммы;
  • версия движка запуска, библиотеки, токенизатора, шаблона чата и зависимостей;
  • оценка памяти, требуемой среды и допустимого сетевого доступа;
  • владелец проверки, дата одобрения, результаты теста и способ отката.

Сначала скачивайте пакет в отдельную зону без рабочих документов и секретов. Не запускайте произвольные установочные команды из README на продакшен-сервере. Используйте фильтр списка файлов, если формат и среда позволяют брать только нужное: в клиентской библиотеке Hub для этого предусмотрены `allow_patterns` и `ignore_patterns`. Однако фильтр не заменяет просмотр конфигурации и зависимостей. Если библиотека или загрузчик запрашивает исполнение удалённого кода, это отдельное решение, а не незаметная галочка для удобства.

Проверяйте сканирование площадки, но понимайте его предел. Hugging Face сообщает, что запускает malware-сканирование файлов на каждом коммите; отсутствие отметки может означать ожидание или ошибку сканирования. В документации по pickle отдельно оговорено, что соответствующие проверки и списки импортов не являются полноценным аудитом пакета. Поэтому «площадка не ругается» — полезный сигнал, но не разрешение запускать скачанное с правами к рабочей базе.

После первичного просмотра разверните пакет в ограниченной среде: без исходящих соединений, если они не требуются и не одобрены; без ключей к CRM и без реальных персональных данных; с малым набором синтетических проверочных запросов. Проверьте, какие файлы фактически читает процесс, не тянет ли он при старте дополнительные зависимости, сколько памяти занимает и воспроизводятся ли ответы на контрольных примерах. Потом перенесите ровно утверждённый набор файлов во внутреннее хранилище артефактов и разрешите рабочему сервису получать модели только оттуда.

Такой внутренний «шлюз» не обязательно должен быть отдельной дорогой платформой. Для небольшого контура это могут быть защищённая папка или существующее хранилище с правами записи у одного ответственного и журналом изменений. Важно разделить роли: разработчик предлагает обновление, проверяющий утверждает пакет, рабочий сервис читает только утверждённую версию. Не полагайтесь на плавающий тег `main` в производственной конфигурации: завтра под тем же адресом может оказаться другой набор файлов.

Проверка поведения — отдельно от проверки файлов

Ни хеш, ни `safetensors` не отвечают, как модель ведёт себя в бизнес-процессе. OWASP отмечает также риск модифицированных или нежелательных весов и слабых гарантий происхождения. Поэтому к технической приёмке добавьте короткий предметный тест: 20–50 типовых и пограничных запросов из выбранного процесса, обезличенных или синтетических. Включите русскоязычные формулировки, отказ при недостатке данных, ссылки на источники для RAG и случаи, где модель должна передать решение человеку. Результаты сравните с ранее утверждённой версией, если она есть.

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

Цена контроля и конкретный первый шаг

Главная стоимость такого порядка — время ответственного и место под одну проверяемую копию, а не новый GPU. Для одной модели с редкими обновлениями карточка поставки и короткий тест обычно дешевле, чем выяснение после запуска, почему изменилась версия весов или кто дал коду доступ к данным. Это управленческое сравнение, не расчёт окупаемости для конкретной компании: реальные трудозатраты зависят от числа моделей, частоты обновлений и требований к изоляции.

Возьмите одну модель, которую команда собирается ставить локально на этой неделе. Попросите показать официальный источник, лицензию, полный commit, список файлов, необходимость `trust_remote_code` и путь отката. Если любой из этих пунктов неизвестен, не переносите пакет в рабочий контур до выяснения. Локальность защищает данные во время инференса только тогда, когда сам контур и его входящие артефакты управляемы.