Rozwiązania · Transport i logistyka
Gdy klient pyta, gdzie jest przesyłka, agent nie zgaduje: dzwoni do kuriera, pyta i wraca z odpowiedzią.
Dyspozytornia głosowa, zbudowana jako mechanizm, a nie jako obietnica: tabela z jednoznacznymi stanami, trzy próby w odstępach dwóch minut, strukturalnie zapisany wynik połączenia i filtr, który usuwa numer kierowcy ze wszystkiego, co trafia do modelu, aby nie dało się go podyktować klientowi.
Już zbudowaneMechanizm dyspozycji jest napisany i zmigrowany w naszej platformie głosowej: tabela `courier_calls` z siedmioma możliwymi stanami, trzema domyślnymi próbami, przerwą 120.000 ms między nimi i wynikiem połączenia przechowywanym strukturalnie, plus pięć funkcji serwerowych, które z tego korzystają — inicjacja połączenia do kuriera, sprawdzenie wyniku, miotła dla pozostałych zawieszonych połączeń, identyfikacja osoby oddzwaniającej i webhook po połączeniu. Druga implementacja to filtr wyjścia napisany dla klienta z branży transportowej, który rekurencyjnie usuwa pola kontaktowe kierowcy z wyniku narzędzia, zachowując numery dyspozytorni. Zastrzeżenie, powiedziane zanim zapytasz: część telefoniczna przechodzi przez host SIP, a host, przez który idą nasze linie testowe, nie odpowiada w dniu pisania — nie damy ci numeru demonstracyjnego, którego nie moglibyśmy podnieść przed tobą.
W firmie transportowej lub dostawczej większość odebranych połączeń to to samo pytanie zadane przez różne osoby: gdzie jest towar, o której godzinie dotrze, dlaczego jeszcze nie dotarł. Odpowiedź nie jest w dokumencie i nie jest w systemie — jest w głowie kierowcy, który prowadzi. Dyspozytor łączy te elementy: odbiera połączenie klienta, dzwoni do kierowcy, wraca do klienta. Ta praca zajmuje jedną osobę w pełni i wykonuje się ją sto razy dziennie, używając tych samych trzech zdań.
Zbudowaliśmy dokładnie taki łańcuch, jako mechanizm ze stanami, a nie jako funkcję marketingową. Agent rozmawia z klientem. Gdy potrzebuje odpowiedzi, której nie ma, wywołuje funkcję, która uruchamia drugie połączenie — do kuriera — powiązane z rozmową, z której wyszła. To połączenie ma własny wiersz w tabeli, ze statusem przechodzącym przez `calling`, `in_progress`, `retrying`, `completed`, `failed`, `no_answer`, `timeout`, z numerem próby, z maksymalnie trzema próbami i z dwu-minutową przerwą między nimi. Wynik zapisuje się strukturalnie: podsumowanie tego, co powiedział kurier, szacowany czas, pozycja.
Część, którą łatwo przeoczyć, a którą traktujemy jako wymóg, nie jako ostrożność: numer telefonu kierowcy nie może trafić do klienta. To nie jest instrukcja zapisana w promptcie agenta, bo instrukcję w promptcie można obejść. To filtr, który rekurencyjnie przechodzi przez wynik narzędzia i usuwa pola kontaktowe kierowcy, zanim ten wynik trafi do modelu — zachowując numery dyspozytorni. To, co zostało usunięte, nie może zostać podyktowane, niezależnie od tego, jak agent zostanie zapytany.
A najważniejszym ograniczeniem jest infrastruktura, nie inteligencja: agent głosowy w telefonie zależy od hosta SIP między Twoim operatorem a platformą. Gdy ten host przestaje działać, połączenia nie wychodzą, a sygnatura błędu jest rozpoznawalna — wygasłe żądanie, pusty identyfikator połączenia, zero czasu trwania. Host, przez który przechodzą nasze linie testowe, nie odpowiada na dzień sporządzenia tej strony. W sieci ścieżka głosowa jest dziś weryfikowalna; w telefonie pierwszym etapem każdej pracy jest ustalenie, na jakim hoście wchodzą Twoje numery.