Wszystkie projekty

Agent obsługi przesyłek, który wie, kiedy przekazać sprawę człowiekowi

Agent obsługi klienta w aplikacji i na stronie sieci kurierskiej, który odpowiada na podstawie aktualnych danych przesyłki, bada zgłoszenia „doręczono, ale nie otrzymałem” dokładnie tak jak dział operacyjny i przekazuje właściwe rozmowy konsultantom.

Klient
Krajowa sieć kurierska
Branża
Logistyka
Rok
2025
Agent paczkowyApp and website → Agent; Agent → Conversation state; Agent → Parcel record; Agent → Knowledge; Agent → Gemini; Gemini → Dispute investigation (dispute); Gemini → Live agent (hand-off); Agent → Tracingdisputehand-offApp and websiteApp and website: chat widgetAgentAgent: LangGraph, Cloud FunctionsConversation stateConversation state: Cloud SQLParcel recordParcel record: status, events, GPS, photosKnowledgeKnowledge: 16k words of rules, 223 booksGeminiGemini: Vertex AIDispute investigationDispute investigation: photo check, GPS distanceLive agentLive agent: hand-off flagTracingTracing: LangSmith
Agent paczkowy
Agent paczkowyApp and website → Agent; Agent → Conversation state; Agent → Parcel record; Agent → Knowledge; Agent → Gemini; Gemini → Dispute investigation (dispute); Gemini → Live agent (hand-off); Agent → Tracingdisputehand-offApp and websiteApp and website: chat widgetAgentAgent: LangGraph, Cloud FunctionsConversation stateConversation state: Cloud SQLParcel recordParcel record: status, events, GPS, photosKnowledgeKnowledge: 16k words of rules, 223 booksGeminiGemini: Vertex AIDispute investigationDispute investigation: photo check, GPS distanceLive agentLive agent: hand-off flagTracingTracing: LangSmith
Agent paczkowy

Kontekst

Odbiorcy przesyłek masowo zadają sieci kurierskiej te same pytania: gdzie jest paczka, dlaczego się spóźnia, co wydarzyło się podczas nieudanej próby doręczenia, gdzie znajduje się punkt odbioru, skąd wzięła się opłata celna i - najtrudniejsze z nich - „w statusie jest doręczona, a ja jej nie mam”. Sieć wdrożyła w swojej aplikacji i na stronie internetowej agenta, który odpowiada na podstawie aktualnego rekordu przesyłki, stosuje te same zasady co konsultanci i wie, kiedy przerwać oraz przekazać rozmowę człowiekowi.

Ograniczenia

  • Agent wypowiada się wyłącznie o przesyłce, której dotyczy rozmowa. Identyfikator paczki pochodzi z żądania systemowego, a nie z wyboru modelu, natomiast pola, których klient nie powinien widzieć, są usuwane, zanim cokolwiek trafi do promptu.
  • Niektóre informacje nigdy nie są ujawniane: miejsce błędnego doręczenia paczki, nazwisko kuriera, współrzędne GPS czy obietnica odszkodowania.
  • Spory są rozstrzygane tak samo, jak robi to dział operacyjny - według udokumentowanej procedury weryfikującej dowody, a nie na podstawie wyczucia modelu.
  • Konsultant musi być na wyciągnięcie jednej wiadomości: w przypadku skarg, podejrzenia oszustwa, uszkodzenia przesyłki oraz każdego klienta, który dopytuje trzy razy. Poza godzinami pracy agent informuje, kiedy wrócić, zamiast obiecywać kontakt, którego nie może zrealizować.
  • Każda tura rozmowy jest śledzona, dzięki czemu weryfikator widzi dokładnie to, co wiedział agent w momencie udzielania odpowiedzi.

Co zbudowaliśmy

Agenta opartego na LangGraph, serwowanego z Cloud Functions w regionie klienta, ze stanem rozmowy w Cloud SQL, modelem Gemini na Vertex AI oraz pełnym śledzeniem każdej tury w LangSmith.

Każda wiadomość klienta trafia najpierw do klasyfikatora: czy to spór dotyczący doręczenia lub próby doręczenia? Jeśli nie, pojedyncze wywołanie generuje odpowiedź na podstawie statusu przesyłki, historii zdarzeń oraz bazy wiedzy obejmującej 16 000 słów reguł biznesowych i komunikacyjnych, a także 223 instrukcje - po jednej dla każdego statusu przesyłki i kodu zdarzenia. Agent zwraca ustrukturyzowaną odpowiedź wraz z flagami obsługiwanych przez frontend akcji: przekazanie do konsultanta, kontakt poza godzinami pracy, wiadomość dla kuriera czy opcje dostępne, gdy przesyłka jest w drodze. Jeśli sprawa dotyczy sporu, pętla wyjaśniająca realizuje schemat działania zespołu operacyjnego: sprawdza zgodność zdjęcia wykonanego przez kuriera z wymogami, mierzy odległość GPS od adresu doręczenia, dopytuje o brakujące informacje i kończy proces jednym z pięciu rezultatów - od uznania przesyłki za prawidłowo doręczoną po przekazanie sprawy konsultantowi.

Agent wyłącznie odczytuje dane i nigdy ich nie modyfikuje. Jedyną akcją, jaką inicjuje, jest przekazanie wiadomości kurierowi, gdy paczka jest w doręczeniu - a i to odbywa się za pośrednictwem frontendu. Zmiany parametrów doręczenia pozostają w kanałach, z których klient już korzysta.

Modele zmieniają się szybciej niż reguły biznesowe, dlatego agent został wyposażony w środowisko testowe do ich podmiany. Punktem odniesienia są zakończone, prawdziwe rozmowy. Testowany model odtwarza każdą z nich od pierwszej wiadomości, operując na zamrożonej migawce danych przesyłki i zatrzymanym zegarze, budując własną historię konwersacji. Każda tura jest oceniana na trzy sposoby: czy pięć flag pokrywa się z bazą referencyjną, w jakim stopniu sformułowania pokrywają się w obu kierunkach oraz jaką ocenę w skali 0–100 wystawia model-sędzia pod kątem tego, czy klient otrzymuje ten sam rezultat, te same fakty, ten sam kolejny krok i ten sam ton wypowiedzi (odpowiedzi bezużyteczne otrzymują zero punktów). W ten sposób nowe modele - w tym małe modele open-weights - są porównywane z produkcją, zanim zobaczy je jakikolwiek klient.

Rezultat

Rozwiązanie działa produkcyjnie w aplikacji i na stronie sieci od 2025 roku: obsługuje od 10 000 do 15 000 rozmów dziennie, z czego 73% kończy się bez udziału człowieka, a czas odpowiedzi wynosi zazwyczaj poniżej 20 sekund. Projekt został zaprojektowany i poprowadzony przez Jakuba. Środowisko ewaluacyjne jest używane na co dzień do weryfikacji kolejnych modeli przed ich wdrożeniem.

Technologia

Python, LangGraph, Gemini na Vertex AI, Cloud Functions, Cloud SQL, LangSmith.

Jak wygląda przebieg działania agenta

Odtworzenie jednego żądania z produkcji krok po kroku - dokładnie tak, jak rejestruje je nasz tracing.

turn_7f3a9cGemini na Vertex AI3,13 s łącznie
  1. 0 msużytkownikKlient: Status mówi „doręczono 14:12”, a pod drzwiami nic nie ma.
  2. +410 msnarzędzieclassify_turn({ "parcel": "<from request>" })dispute: yes, type: delivered_not_received
  3. +180 msnarzędzieget_parcel_events({ "parcel": "<from request>" })status: delivered 14:12, location: front door, driver photo: available, GPS: recorded
  4. +640 msnarzędziecheck_evidence({ "photo": true, "gps": true })zdjęcie: paczka pod drzwiami, zgodne. odległość od adresu doręczenia: 11 m
  5. +1900 msasystentWidzę, że kurier sfotografował paczkę pod Twoimi drzwiami o 14:12, 11 metrów od Twojego adresu. Czy możesz sprawdzić u domowników i wokół wejścia? Jeśli nadal jej nie ma, daj znać, a przekażę sprawę konsultantowi, który ją wyjaśni. 118 tokenów