Пять сторожей
Третьим кандидатом на роль Асиного мозга был Gemini. Пилот продержался двенадцать дней — и это были самые насыщенные двенадцать дней за всю историю проекта. К финалу, чтобы движок просто не умирал посреди звонка, вокруг него дежурили пять сторожевых таймеров одновременно. Спойлер: сторожа не спасли.
На бумаге всё выглядело серьёзно. За движком — компания с самыми большими данными и мощностями на планете, цена — пять центов за минуту, ровно наш бюджет. Мы подключили его к телефонии и начали учить тому же, что уже умели предыдущие: узнай абонента, проверь тариф, переведи на человека, попрощайся.
Первый сюрприз: движок молча выбрасывал часть наших инструкций. Есть служебный канал, по которому агенту передают контекст конкретного звонка — номер телефона абонента, маршрут, техническую обвязку. Gemini этот канал просто не читал. Без ошибки, без предупреждения — данные уходили в пустоту, и мы днями гадали, почему агент не знает того, что ему явно сказали.
Второй сюрприз был из области мистики. Сессия умирала сразу после приветствия — полная тишина до конца звонка, — если описание одного из инструментов было написано кириллицей в несколько строк. Перепишешь то же самое латиницей в одну строку — работает. Объяснения этому мы не нашли до сих пор; просто приняли как погоду.
Третий сюрприз стоил бы нам клиентов, дойди он до боевой линии. В инструкциях у нас был учебный пример: «звонок с номера, например, 067Х...». Gemini не понял, что это пример, — и начал реально искать абонентов по учебному номеру из инструкции. А однажды, не сумев выяснить имя человека, вписал в поле «ФИО» настоящей заявки фразу «Клиент отказался назвать ФИО» — и отправил её в работу. Формально — не придерёшься. По сути — заявка от призрака.
Дальше пошли зависания. Движок замирал посреди генерации фразы, замирал после вызова инструмента, замирал, не дождавшись первого слова абонента. На каждый вид замирания мы вешали отдельного сторожа — таймер, который толкает агента в бок, если тот молчит подозрительно долго. К концу пилота сторожей было пять. Пять нянек вокруг одного голоса — только чтобы он доживал до конца разговора. А попрощаться голосом он так и не научился: клал трубку молча, и это ограничение мы так и не пробили.
Отдельным открытием стал потолок памяти: заявленный размер контекста на практике оказался вчетверо меньше — без специальной настройки сессия просто падала с ошибкой, когда разговор становился длинным. Мы и это обошли. Мы вообще всё обошли — в этом и была ловушка.
В какой-то момент мы посмотрели на конструкцию со стороны: пять сторожей, обходные пути вместо служебного канала, инструкции латиницей в одну строку, примеры, вычищенные из промпта, чтобы их не приняли за правду. Каждый костыль по отдельности — мелочь. Вместе — сооружение, которое держится на честном слове и падает от любого чиха. И всё это ради движка, который не делал ничего такого, чего не делали бы конкуренты за те же деньги — без пяти нянек.
Закрыли без драмы, одним решением вместе со следующим героем нашей серии. О нём разговор будет короткий — потому что и роман был самым коротким в нашей истории: приговор мы вынесли меньше чем за двое суток. Про Grok — в следующем выпуске.