Как мы отдали ИИ отбор тендеров и что поняли про доверие к нему за четыре месяца
Резюме за минуту для тех, кто вечно занят. Отбор закупок мы передали связке: ИИ читает и выносит суждение, а обычная программа делает все остальное и проверяет то, что он выдал. Первые две попытки решить нестабильность деньгами, то есть увеличением лимитов нейросети, только отодвигали обрыв обработки на неделю, поэтому мы перешли к трем приемам: дробление на пачки по десять писем, выбор ссылки из готового списка вместо генерации и встречный счетчик. Утренний разбор занимает шесть минут. Сколько нужных закупок система выбросила, мы сейчас проверяем срезами и считаем этот вопрос первым, который стоит задать любому подрядчику по ИИ.
На связи Максим Голубов, руководитель AI-проектов в ALP ITSM. Последние месяцы я занимался тем, чтобы ИИ приносил в нашей работе измеримую пользу, которую видно в рабочем дне.
Об ALP ITSM. Уже 30 лет наша команда строит и сопровождает ИТ-инфраструктуру для бизнеса: серверы, сети, поддерживает пользователей в 900+ городах.
Что приходило и сколько это занимало
Ящик отдела продаж подписан на шесть площадок: ЭТП ГПБ, Bidzaar, Контур.Закупки, B2B-Center, Фабрикант, Росэлторг. На эту шестерку приходится 91% всего потока. Письмо от площадки приходит сводкой, и закупок в ней бывает от одной до нескольких десятков. Две трети писем содержат внутри одну процедуру и читаются за секунду. Зато 11% писем несут по пятнадцать позиций и больше, и на эту часть уходит больше половины всего времени. Рекорд августа: 68 закупок в одном письме.
За август пришло 679 писем, в них 3 650 закупок. В пересчете на рабочий день это 31 письмо и 166 закупок. В среднем три закупки в день оказывались нашими.
В идеальных условиях разбор занимал тридцать-сорок минут, только таких условий не бывает: звонки, задачи, шесть площадок с разной версткой и повторы, которые узнаешь не с первого взгляда. По факту каждое утро уходил час-полтора, а бывало и два.
Чем это грозило? Зарплата менеджера уходила на чтение чужих закупок, а человек, который каждое утро листает одно и то же, со временем начинает листать по диагонали, и рано или поздно свой тендер обнаруживается уже после закрытия приема заявок.
Почему ключевые слова здесь не спасают
Здравый смысл советует настроить отбор по словам, у нас этот способ работал слабо.
Одно и то же слово бывает то нашим, то чужим. «Сопровождение» мы берем, но «сопровождение регионального портала госуслуг» уже не наш профиль, как и «поддержка медицинской информационной системы», хотя «поддержка» тоже наше слово. И наоборот, «аутсорсинг рабочих мест в филиальной сети» попадает в наши, хотя знакомых слов там может не быть вовсе.
Из-за лишней строки продавец потеряет минуту, а из-за пропущенной закупки компания потеряет контракт и узнает об этом, когда прием заявок уже закрыт.
Почему лимиты не лечат нестабильность
Первую версию мы запустили 24 апреля и сделали максимально простой: утром вся почта уходила модели одним куском, а модель возвращала готовый список. Все шло нормально, потом писем стало больше, и схема сломалась.
В мае мы дважды чинили это одним и тем же способом: удваивали лимит расходов и поднимали отведенное время, сначала вдвое, потом вчетверо. Каждый раз хватало на неделю.
К концу мая до нас дошло, что мы покупаем отсрочку сбоя. Чем больше писем уходит в одном заходе, тем длиннее ответ модели, а длинный ответ чаще обрывается. Оборвался на середине, и пропала вся работа, включая письма, которые модель уже успела разобрать правильно.
Чтобы это увидеть, нам понадобились две недели и две попытки.
Три правила, которые сработали
Дробить работу, чтобы при сбое были меньшие потери. Утренняя почта режется на пачки по десять писем, и каждая идет своим заходом. Упавшая пачка уносит только себя. Ее письма придут снова завтра, а остальные доедут до списка.
Не давать ИИ придумывать то, что уже есть в исходных данных. Выдуманная ссылка на вид ничем не отличается от настоящей, а выясняется это уже после перехода по ней. Мы вынесли ссылки из зоны творчества нейросети: программа сама собирает справочник «номер закупки: адрес на площадке», модель в своей сводке только указывает номер. Нет адреса в справочнике, строка выходит без ссылки. Пустое поле хотя бы не отправит продавца по несуществующему адресу.
Проверять ИИ независимо от него самого. Счет закупок в письме программа ведет сама, до того как письмо попадет к модели, и сверяет цифры свои + чужие после ответа. Если цифры не сошлись, письмо уходит на завтра, а после третьего расхождения подряд ответственный получает уведомление.
Правда, сам счетчик тоже ошибается: как-то он принял заводской номер оборудования за номер закупки и три дня подряд заворачивал совершенно нормальное письмо. Так что предохранитель нужен и модели, и самому счетчику.
Две ошибки, которых сразу не видно
Вердикт попал не к тому тендеру. Разбирая одну пачку, модель подставила идентификатор письма из соседней. Причина — сохранение контекста. Ошибка ничем себя не выдает: в списке она выглядит обычной строкой, поэтому здесь автоматика и опаснее ручной работы.
Один и тот же тендер висел неразобранным восемь дней. Площадка присылала по нему утреннюю сводку и вечернее напоминание, а система видела два разных письма, логика ломалась. Узнали мы об этом от пользователя, то есть худшим из возможных способов.
Общее у двух этих историй одно: все время, пока они длились, система выглядела исправной.
Что изменилось
Было: утренний разбор час-полтора, иногда два; продавец открывал почтовый ящик; через него проходили 166 закупок в день.
Стало: шесть минут, готовый список (1 сентября — четыре строки).
Возьмем утро 1 сентября. Пришло 35 писем, внутри 165 закупок. Нашими признаны 5, после снятия повторов в списке осталось 4 строки. Все это заняло шесть минут: с 09:13 до 09:19.
Заодно у каждой строки появился свой номер, на который можно сослаться в переписке, не пересказывая, о какой закупке речь.
Как мы проверяем качество отбора
Все цифры выше показывают, сколько система отсеяла, но ничего не говорят о том, правильно ли она это сделала.
Пропуск заметить нечем. Человек открывает готовый список и видит только то, что в него попало. Все замечания, из которых выросли наши правила отбора, приходили от лишних строк, потому что лишнее видно. Обратная ошибка — выброшенное нужное — сама о себе не сообщает, и мерить ее приходится отдельным действием.
Устроено это просто. Из отброшенного берется случайная выборка, ее читает человек и считает, сколько нужного оказалось за бортом. Такие срезы идут сейчас, и по ним мы правим правила отбора.
Это первый вопрос, который стоит задать любому подрядчику по ИИ-автоматизации, потому что показать объем обработанного легко, а доказать, что ничего нужного не потерялось, гораздо труднее.
Три вопроса до того, как вы начнете автоматизацию
Что теряется, когда упало? Хороший ответ звучит так: небольшой блок информации, и он вернется завтра. Плохой: весь результат за день.
Как вы проверяете ответ ИИ? Хороший ответ: независимой сверкой с исходными данными. Плохой: мы написали подробное задание. Даже подробное задание модель может выполнить не так, как просили.
Как вы поймете, что он пропустил нужное? Самый неудобный из трех. Если внятного ответа нет, то закладывайте выборочную ручную проверку.
Что это значит на практике
Если процесс держится на внимательности одного человека, начинать стоит с вопроса «где в этом процессе должен остаться человек и что он там делает», а выбор модели подождет. От ответа зависит и устройство решения, и то, какие обещания о качестве вы сможете защитить.
Такие разборы из практики мы регулярно публикуем в телеграм-канале ALP ITSM.