Рішення · Транспорт та логістика
Коли клієнт запитує, де посилка, агент не вгадує: дзвонить кур’єру, запитує його і повертається з відповіддю.
Диспетчеризація голосом, побудована як механізм, а не як обіцянка: таблиця з явними станами, три спроби з інтервалом у дві хвилини, структурований запис результату дзвінка та фільтр, що прибирає номер водія з усього, що потрапляє до моделі, щоб його не можна було продиктувати клієнту.
Вже збудованоМеханізм диспетчеризації написаний і перенесений у нашу голосову платформу: таблиця `courier_calls` із сімома можливими станами, трьома стандартними спробами, паузою 120.000 ms між ними та результатом дзвінка, що зберігається структуровано, плюс п’ять серверних функцій, які її використовують — ініціювання дзвінка кур’єру, перевірка результату, мітла для дзвінків, що зависли, визначення того, хто передзвонює, і webhook після дзвінка. Друга реалізація — це фільтр вихідних даних, написаний для клієнта з транспорту, який рекурсивно вилучає контактні поля водія з результату інструмента, зберігаючи номери диспетчерської. Застереження, сказане до того, як ви спитаєте: телефонна частина проходить через SIP-хост, а хост, через який ідуть наші тестові лінії, не відповідає на момент написання — ми не дамо вам демонстраційний номер, який не змогли б підняти перед вами.
У транспортній або доставковій компанії більшість вхідних дзвінків — це те саме запитання, поставлене різними людьми: де вантаж, о котрій годині прибуде, чому не прибув. Відповідь не в документі і не в системі — вона в голові водія, який за кермом. Диспетчер з’єднує ланцюг: приймає дзвінок клієнта, телефонує водієві, повертається до клієнта. Ця робота займає одну людину повністю і виконується сто разів на день, тими самими трьома реченнями.
Ми побудували саме цей ланцюг, як механізм зі станами, а не як маркетингову функцію. Агент розмовляє з клієнтом. Коли йому потрібна відповідь, якої він не має, він викликає функцію, що запускає другий дзвінок — до кур’єра — пов’язаний із розмовою, з якої він вийшов. Той дзвінок має власний рядок у таблиці, зі статусом, що переходить через `calling`, `in_progress`, `retrying`, `completed`, `failed`, `no_answer`, `timeout`, із номером спроби, максимум трьома спробами та паузою у дві хвилини між ними. Результат записується структуровано: підсумок того, що сказав кур’єр, орієнтовний час, місцезнаходження.
Частина, яку легко не помітити і яку ми трактуємо як вимогу, а не як пересторогу: номер телефону водія не має права потрапити до клієнта. Це не інструкція, написана в prompt агента, бо інструкцію в prompt можна обійти. Це фільтр, який рекурсивно проходить результат інструмента й видаляє поля контактів водія до того, як цей результат потрапить до моделі — зберігаючи номери диспетчерської. Те, що було видалено, не можна продиктувати, незалежно від того, як питають агента.
А найважливіше обмеження — інфраструктурне, а не інтелектуальне: голосовий агент по телефону залежить від SIP-хоста між вашим оператором і платформою. Коли цей хост падає, дзвінки не йдуть, а ознака збою впізнавана — запит прострочений, ідентифікатор дзвінка порожній, тривалість нульова. Хост, через який проходять наші тестові лінії, не відповідає на дату написання цієї сторінки. У вебі голосовий маршрут перевіряється сьогодні; по телефону перший етап будь-якої роботи — встановити, на якому хості входять ваші номери.