Коротко. Внедрение ИИ в бизнес проваливается не на выборе модели и не на бюджете. Оно проваливается в тот день, когда система вроде бы работает: контейнеры подняты, проверка состояния отвечает «всё хорошо», а пользователь на любой вопрос получает ошибку. Ниже девять поломок, которые я нашёл за один день деплоя собственного сервиса, и пять из них убили бы проект в проде.
Почему «работает» и «работает» это разные вещи
Обычная картина приёмки: подрядчик показывает, что сервис запущен, адрес открывается, в логах нет ошибок. Заказчик кивает, подписывает акт. Через неделю выясняется, что на настоящих вопросах система молчит.
Я прошёл это на своём проекте, где сам себе и заказчик, и исполнитель: ИИ-помощник по законам, 34 697 фрагментов в базе, шесть контейнеров. Сайт открывался. Поиск по базе шёл. Проверка состояния отдавала зелёный статус. Казалось, готово.
Потом я сел и начал проходить сценарии руками, как обычный человек. За день набралось девять поломок.
Четыре из них ломали сервис целиком
Модель отказывалась отвечать на любой вопрос. Самая коварная. Мой код собирал запрос к модели из четырёх служебных блоков: роль, правила, найденные статьи закона, формат ответа. Провайдер принимает только один такой блок и только первым, остальные отвергает с невнятным кодом ошибки. Наружу это уходило как «сервис временно недоступен».
На практике: поиск по базе работает, документы находятся, проверка состояния зелёная, а ответа человек не получает никогда. Причём отдельный тестовый вызов модели проходил нормально — поломка воспроизводилась только на полном запросе.
Не всплывало раньше, потому что до этого проект жил на другом провайдере, а тот такие запросы проглатывал молча.
В сборке не было корневого сертификата. С сервера порт провайдера открыт, сеть работает, а защищённое соединение падает. В описании проекта было написано, что сертификат надо добавить, и в двух соседних проектах он добавлен. В этом — забыли. Итог был бы такой: сервис поднимается, по базе ищет, а на любом вопросе с персональными данными отвечает ошибкой.
Новый интерфейс вообще не собирался. Его сборка копировала папку, которой в проекте нет. Падало на этом. То есть весь редизайн — 25 страниц, глоссарий, картинки для соцсетей — лежал мёртвым грузом, а публиковалась старая версия. Никто до этого не доходил, потому что сборка запускалась одной командой на весь проект и её вывод никто не читал до конца.
Хранилище файлов не было готово принимать файлы.Генерация документов падала с ошибкой «нет такого хранилища». Это тоже было написано в описании проекта: хранилище не создаёт себе место автоматически. При деплое забылось.
Пятая: ссылки, которые работают только изнутри
Документы генерировались, сохранялись, ссылка возвращалась. Только вела она на внутреннее имя контейнера, которое браузер открыть не может. Внутри системы всё правильно, снаружи — нерабочая ссылка.
Чинится это не переписыванием адреса задним числом: подпись ссылки привязана к адресу, подмените адрес — сломается подпись. Пришлось подписывать ссылку сразу на внешний адрес.
Проверил после починки: документ на 37 КБ и его версия в другом формате на 23 КБ скачиваются по защищённому соединению. Вот так выглядит проверка, а не «в логах чисто».
Девятая поломка была не в коде
Заявки с сайта молча ложились в базу. Форма на странице с ценами обещала «свяжусь в течение дня», а уведомления не приходило никакого. Узнать о заявке можно было единственным способом: открыть базу и посмотреть.
Технически всё исправно: форма отправляется, данные сохраняются, ошибок нет. По делу — человек оставил контакт и не дождался ответа.
Это самый частый вид провала при внедрении. Не «система не работает», а «система работает, но никто не узнаёт о результате». Починка заняла полчаса: отдельный бот, заявка падает в мессенджер сразу.
Что из этого следует для заказчика
Главный вывод, который я записал себе в тот день: «контейнеры поднялись и проверка отдаёт зелёный статус» не значит ничего. Надо проходить сценарии руками, как пользователь.
Что стоит потребовать от подрядчика при приёмке:
- Показать не логи, а сценарий целиком. Не «сервис отвечает», а «я задал вопрос, получил ответ, скачал документ, он открылся».
- Проверить со своего устройства, а не с экрана подрядчика. Половина поломок из списка выглядели нормально изнутри системы.
- Пройти путь, который проходит клиент. Оставить заявку через форму и посмотреть, дойдёт ли она. Это ловит поломки, которые не видны ни в одном логе.
- Спросить, что произойдёт при отказе внешнего сервиса. Модель недоступна — человек увидит осмысленное сообщение или пустой экран?
- Заложить день на приёмку. Девять поломок нашлись за день. Если приёмка длится двадцать минут, вы принимаете не систему, а её внешний вид.
И для того, кто внедряет
Четыре поломки из девяти были описаны в документации собственного проекта. Сертификат, хранилище — всё это было записано словами «не забыть при деплое». Забылось.
Документация не исполняется сама. Если шаг важен, он должен быть в сборке или в проверке, а не в тексте, который читают один раз.
И отдельно про тестирование. Изолированный вызов модели проходил нормально, а на полном запросе всё падало. Тесты на отдельные части не ловят поломок стыка. Ловит только сквозной проход.
Сколько это стоит
Все девять починены за один день, потому что искал их я сам и в своём коде. В чужом проекте, где подрядчик уже получил деньги и ушёл, такой день превращается в недели переписки.
Поэтому я беру оплату по этапам и показываю работающий сценарий, а не логи. Если нужна такая же приёмка на вашем проекте — посмотрите, что я делаю, или проверьте свой сайт бесплатной проверкой: она обходит до 15 страниц и показывает, где теряются заявки и что сломано технически.
Что из этого уже работает и с какими цифрами — на странице работ. А если вопрос в деньгах, разбор цены по уровням — в отдельной статье.