Kompletny system, który analizuje dane, prowadzi rozmowy telefoniczne po litewsku i automatycznie realizuje ustalone działania po zakończeniu połączenia.
Klient: litewska firma zarządzająca nieruchomościami
Zakres: produkt end-to-end: od hurtowni danych do rozmowy i dokumentów
Technologie: Python, Django, FastAPI, MSSQL, konwersacyjne AI (Free AI Voice Generator & Voice Agents Platform | ElevenLabs), telefonia SIP (Infrastructure for realtime agents | Telnyx), GPT-5.5 – analiza post call
Problem
Zarządca nieruchomości co miesiąc rozlicza dziesiątki tysięcy lokali. Nawet niewielki odsetek opóźnionych płatności oznacza dużą liczbę telefonów: trzeba potwierdzić tożsamość rozmówcy, wyjaśnić należność, ustalić termin zapłaty i udokumentować rozmowę.
To powtarzalna praca wykonywana w krótkim oknie czasowym. Zespół nie był w stanie zadzwonić do wszystkich, dlatego celem było zautomatyzowanie rutynowej części procesu – w języku litewskim, z pełną kontrolą operatora i możliwością prześledzenia każdej decyzji.
Rozwiązanie
Zbudowaliśmy system realizujący pełny cykl raz w każdym dniu roboczym. Rano sprawdza niespełnione obietnice wpłat. O 12:30 pobiera aktualne salda z hurtowni danych, wybiera sprawy do obsługi i tworzy kolejkę. Między 13:00 a 18:00 prowadzi do czterech rozmów jednocześnie.
Po każdym połączeniu model językowy analizuje cały zapis rozmowy, rozpoznaje jej wynik i zwraca ustrukturyzowaną listę działań. System może zmienić status sprawy, wysłać SMS, przekazać fakturę e-mailem, wygenerować dokument albo utworzyć zadanie dla pracownika. Wieczorem powstaje raport z przebiegu kampanii.
Operator widzi nagranie, transkrypcję, klasyfikację, podsumowanie i dokładną treść każdej wysłanej wiadomości. Automatyzacja nie jest więc „czarną skrzynką” – wszystkie działania można sprawdzić następnego dnia na jednym ekranie.
Jak przebiega rozmowa
- Pobranie sprawy. Usługa głosowa otrzymuje dane potrzebne do rozmowy: imię i nazwisko, adres, kwotę, termin płatności, scenariusz oraz właściwe biuro obsługi.
- Połączenie. Telefon wykonywany jest przez łącze SIP z litewskiego numeru.
- Obowiązkowe informacje. Agent przedstawia się jako asystent cyfrowy, informuje o nagrywaniu i prosi o zgodę na kontynuowanie. Ten fragment jest stały i nie jest tworzony przez model.
- Weryfikacja tożsamości. Zanim rozmówca potwierdzi, że jest właściwą osobą, agent nie podaje kwoty ani żadnych informacji o koncie.
- Rozmowa. Agent przedstawia należność i obsługuje typowe scenariusze: deklarację zapłaty, informację o dokonanej wpłacie, prośbę o fakturę, raty, spór lub kontakt z pracownikiem.
- Analiza i działanie. Podpisany webhook dostarcza nagranie i transkrypcję. Model klasyfikuje wynik, a system od razu wykonuje dozwolone działania.
Co dzieje się po połączeniu
| Wynik rozmowy | Automatyczne działanie |
|---|---|
| Ustalono termin zapłaty | Wstrzymanie sprawy do wskazanej daty i SMS z potwierdzeniem |
| Wpłata została już wykonana | Pięć dni przerwy, ponowna kontrola i SMS z adresem do przesłania potwierdzenia |
| Brak faktury | Wysłanie najnowszej faktury e-mailem |
| Prośba o raty | Wygenerowanie dokumentu i przekazanie go opiekunowi |
| Spór dotyczący należności | Zamknięcie sprawy dla agenta i utworzenie zadania dla pracownika |
| Żądanie zakończenia kontaktu lub agresja | Grzeczne zakończenie rozmowy bez kolejnych prób |
| Brak jednoznacznego wyniku | Brak automatycznego działania i oznaczenie sprawy do weryfikacji |
Najważniejsze decyzje projektowe
Prosta kolejka w bazie danych
System importuje dane raz dziennie i dzwoni w pięciogodzinnym oknie. Kolejka jest tabelą ze statusem, a rekordy są pobierane transakcyjnie. Przy tej skali broker wiadomości zwiększyłby złożoność bez realnej korzyści.
Istotnym przypadkiem brzegowym okazało się rozróżnienie komunikatów „nie ma już spraw” i „wszystkie linie są zajęte”. Zrównanie tych stanów sprawiło podczas jednej kampanii, że zawieszone połączenie przedwcześnie zatrzymało dalsze wybieranie numerów.
Model prowadzi rozmowę, ale reguły pozostają w kodzie
Agent głosowy nie zapisuje ustrukturyzowanych danych w trakcie rozmowy. Daty, scenariusze i działania są wyodrębniane dopiero po połączeniu z pełnej transkrypcji. Taki podział poprawił dokładność i pozwolił ponowić analizę bez ponownego kontaktu z klientem.
Wszystko, co można jednoznacznie obliczyć – porządkowanie współwłaścicieli, normalizacja adresów czy wybór właściwego biura – wykonuje backend. Model otrzymuje gotowe dane i nie improwizuje. Na pytania spoza zatwierdzonej instrukcji i bazy wiedzy odpowiada przekazaniem sprawy pracownikowi.
Jedna analiza, spójny zestaw działań
Jeden przebieg modelu zwraca klasyfikację rozmowy, wyodrębnione dane i listę konsekwencji. Są one zapisywane razem, dzięki czemu nie powstaje stan, w którym rozmowa została zrozumiana, ale wynik nie został wykonany.
Bezpieczeństwo i kontrola
Informacja o nagrywaniu pojawia się na początku rozmowy, a dane o należności dopiero po potwierdzeniu tożsamości. Webhook jest podpisany i weryfikowany, a połączenie z hurtownią danych ma dostęp wyłącznie do odczytu. Nagrania, listy spraw i wygenerowane dokumenty są traktowane jako dane osobowe.
Tryb testowy przekierowuje wszystkie telefony, SMS-y i e-maile do testera. Jeżeli brakuje testowego odbiorcy, system bezwarunkowo odmawia wysyłki – nie może przypadkowo skontaktować się z prawdziwym klientem.
Wyniki oparte na pomiarach
- Wstęp rozmowy skróciliśmy z 304 do 181 znaków, a jego średni czas z 21 do około 12,5 sekundy, zachowując wszystkie wymagane informacje.
- Mediana czasu od zakończenia wypowiedzi klienta do pierwszego dźwięku agenta wyniosła 2,0 sekundy na podstawie 204 zmierzonych tur rozmowy.
- Analiza znaczników czasu wykazała, że długie pauzy powodowało sporadyczne pomijanie krótkich odpowiedzi przez detekcję końca wypowiedzi. Pozwoliło to poprawić konkretną konfigurację zamiast eksperymentować z całym systemem.
- W przypadku znikających litewskich znaków porównanie bajtów i liczby segmentów SMS wykazało, że konwersja zachodziła po stronie trasy operatora, a nie aplikacji.
Stan projektu
System pracuje na danych produkcyjnych w kontrolowanym trybie pilotażowym: operator wybiera prawdziwe sprawy i ręcznie uruchamia kampanię. Zespół może zmieniać treść instrukcji w panelu administracyjnym bez wdrażania nowej wersji aplikacji.
Najważniejszym wyzwaniem nie był sam głos, lecz właściwy podział odpowiedzialności między modelem językowym a kodem. Model odpowiada za rozmowę i interpretację języka; kod – za reguły, bezpieczeństwo i przewidywalne konsekwencje.
Najpierw testowaliśmy model głosowy od Open AI ale działał zbyt słabo, nie potrafił prowadzić rozmów zgodnych ze skomplikowanym scenariuszem. Jego plus był taki, że odpowiadał bardzo szybko, i przy kolejnym projekcie, gdzie rozmowa będzie miała prostszy scenariusz, myślę, że do tego modelu wrócę.
