İçeriğe atla
megapromotingHadi konuşalım

Çözümler · Ulaşım & lojistik

Müşteri kolinin nerede olduğunu sorduğunda, ajan tahmin etmez: kuryeyi arar, ona sorar ve cevapla geri döner.

Sesle dispeçerleme, bir vaat olarak değil bir mekanizma olarak kuruldu: açık durumlara sahip bir tablo, iki dakika arayla üç deneme, arama sonucunun yapılandırılmış olarak yazılması ve modele ulaşan her şeyden sürücü numarasını çıkaran bir filtre, böylece müşteriye dikte edilemesin.

Zaten kurduklarımızMecanismul de dispecerizare e scris și migrat în platforma noastră vocală: tabela `courier_calls` cu șapte stări posibile, trei încercări implicite, pauză de 120.000 ms între ele și rezultatul apelului păstrat structurat, plus cinci funcții de server care o folosesc — inițierea apelului către curier, verificarea rezultatului, mătura pentru apelurile rămase agățate, identificarea celui care sună înapoi și webhookul de după apel. A doua implementare e filtrul de ieșire scris pentru un client din transport, care elimină recursiv câmpurile de contact ale șoferului din rezultatul uneltei, păstrând numerele dispeceratului. Rezerva, spusă înainte să întrebi: partea de telefon trece printr-o gazdă SIP, iar gazda prin care merg liniile noastre de test nu răspunde la data scrierii — nu-ți dăm un număr de demonstrație pe care nu l-am putea ridica în fața ta.

Bir nakliye veya teslimat şirketinde gelen aramaların çoğu, farklı kişilerin sorduğu aynı sorudur: yük nerede, saat kaçta varır, neden varmadı. Yanıt bir belgede değildir ve bir sistemde değildir — araç kullanan şoförün kafasındadır. Dispeçer bağlantıyı kurar: müşterinin aramasını alır, şoförü arar, müşteriye geri döner. Bu iş bir tam kişiyi meşgul eder ve günde yüz kez, aynı üç cümleyle yapılır.

Biz tam bu zinciri, pazarlama işlevi olarak değil, durumları olan bir mekanizma olarak kurduk. Bir ajan müşteriyle konuşur. Sahip olmadığı bir cevaba ihtiyaç duyduğunda, kurye ile ilgili ikinci bir aramayı başlatan bir fonksiyonu çağırır — çıktığı konuşmayla bağlantılı olarak. O aramanın kendi satırı bir tabloda yer alır; `calling`, `in_progress`, `retrying`, `completed`, `failed`, `no_answer`, `timeout` durumlarından geçer, deneme numarası vardır, en fazla üç deneme yapılır ve aralarında iki dakika beklenir. Sonuç yapılandırılmış olarak yazılır: kuryenin söylediklerinin özeti, tahmini süre, konum.

Kolayca gözden kaçan ve bizim bir önlem değil bir gereklilik olarak ele aldığımız kısım: sürücünün telefon numarası müşteriye ulaşmamalıdır. Bu, ajan promptuna yazılmış bir talimat değildir; çünkü bir prompttaki talimat aşılabilir. Bu, aracın çıktısını yinelemeli olarak tarayan ve sürücünün iletişim alanlarını, o çıktı modele ulaşmadan önce kaldıran bir filtredir — dispeçer numaralarını koruyarak. Kaldırılan şey, ajan nasıl sorgulanırsa sorgulansın, dikte edilemez.

Ve en önemli sınır zekâ değil, altyapı sınırıdır: telefondaki bir sesli ajan, operatörünüz ile platform arasında bir SIP sunucusuna bağlıdır. O sunucu çöktüğünde, aramalar çıkmaz ve hatanın imzası tanınabilir olur — zaman aşımı isteği, boş çağrı kimliği, sıfır süre. Test hatlarımızın geçtiği sunucu, bu sayfanın yazıldığı tarihte yanıt vermiyor. Web’de ses yolu bugün doğrulanabilir; telefonda ise herhangi bir çalışmanın ilk aşaması, numaralarınızın hangi sunucuya girdiğini belirlemektir.

Neleri kapsıyor

Taşıma & lojistikte somut olarak ne değişir

Müşteriyle konuşan ajan ikinci bir arama başlatabilir

Yanıt elindeki bilgide yoksa, ajan kuryeyi arayan bir sunucu işlevini çağırır. Kuryeye yapılan arama, geldiği konuşmayla bağlantısını bir üst konuşma tanımlayıcısı üzerinden korur — böylece kimin için ve neden arandığı her zaman bilinir. Sipariş bağlamı, sisteminizdeki sipariş sisteminden yapı olarak iletilir, yeniden dikte edilmez.

Kuryeye yapılan aramanın durumları vardır, sadece “aranmış” değildir

Veritabanında kısıt olarak yazılmış yedi durum: `calling`, `in_progress`, `retrying`, `completed`, `failed`, `no_answer`, `timeout`. Buna mevcut deneme numarası da eklenir. “Cevap vermedi” ile “sistem çöktü” arasındaki fark verilerde görünür, günlüklerden tahmin edilmez — ve bu, biri yarın müşterinin neden yanıt almadığını sorduğunda önemlidir.

Yeniden denemeler yapılandırılmıştır, doğaçlama değildir

Varsayılan: üç deneme, aralarında 120.000 milisaniye — iki dakika — olmak üzere, her ikisi de tabloda ve süreç yapılandırmasında varsayılan değerler olarak yazılıdır. Sinyalin olmadığı bir yolda araç süren bir sürücü ilk denemede yanıt vermez. Bir kez arayıp başarısızlık ilan eden bir sistem, tam olarak bunun için kurulduğu durumda işe yaramaz.

Arama sonucu yapılandırılmış olarak döner, hikâye olarak değil

Kurye ne dediyse, arama satırına bağlı yapılandırılmış bir alanda özet, tahmini süre ve konum olarak yazılır. Oradan daha ileri gidebilir: müşteriyle konuşan ajana, sevkiyat merkezine, sizin sisteminize. Arama sonrası bir webhook ve takılı kalan aramalar için bir süpürme işlevi, bir çağrı kaybının `calling` durumunda sonsuza kadar kalmamasını sağlamak için zinciri tamamlar.

Sürücünün numarası dikte edilemez, çünkü modele ulaşmaz

Çıkış filtresi, aracın sonucunu özyinelemeli olarak dolaşır ve sürücünün iletişim alanlarını kaldırırken sevkiyat merkezinin numaralarını korur. Bu, kodda yazılıdır, sorunun ortaya çıktığı entegrasyona noktasal olarak uygulanır. Sebep basittir: sağlayıcı arayüzü yanıtında sürücü numaralarını döndürüyordu ve şirket politikası ajanın bunları müşterilere vermesini yasaklıyordu. Prompt’taki bir yönerge iyi formüle edilmiş bir soruyla aşılabilirdi; kaldırılmış bir alan aşılamaz.

Geri arayan kişi numarasına göre tanınır

Geri arama yapan kurye, özel bir işlevle tanımlanır; bu yüzden genel müşteri akışına girmez ve menüsü baştan okunmaz. Küçük bir ayrıntı gibi görünür; ama sürücülerin kullandığı bir sistem ile onu atlayıp doğrudan sevkiyat merkezini aradıkları için sistemin boşa çıkması arasındaki fark budur, ki bu da tüm emeği geçersiz kılar.

Sevkiyata devretme, konuşanın elinin altında

`##` ile kör aktarım ve `*2` ile destekli aktarım; dört haneli iç uzantılar ile dış numaraları ayıran arama planına iniş bağlamıyla birlikte. Müşteri ısrarla bir insan istiyorsa — taşımada ister, çünkü yükü gecikmiştir — aktarım bir menüden geçmemelidir.

Ajan kesilebilir ve bu rakamlarla ayarlanır

OpenAI Realtime hattında: 0,5 eşik değeriyle anlamsal konuşma algılama, 300 ms tampon, 500 ms sessizlik, varsayılan olarak izin verilen kesme. ElevenLabs hattında, kesme olayı oynatmayı durdurması için merkeze iletilir. `turn_timeout` ajan bazında belirlenir. Konuşma ortağının çoğu zaman gürültülü bir kabinde olduğu bir taşıma çağrısında, bu eşikler algılanan kalitenin yarısıdır.

Bir sesli ajanın taşımada yapmadıkları

Rota belirlemez ve teslimatları yeniden optimize etmez. Hesaplayan kaynağa bağlı değilse ücret söylemez. Ne kurye ne de sisteminiz söylemediyse yükün nerede olduğunu bilmez. Ve sevkiyat merkezinin yerini almaz: tekrar eden çağrıları alır, istisnaları bırakır; çünkü tam da bunun için ücret alır.

Traseul

Bir talep sistemden nasıl geçer.

01

Önce numaralarınızın hangi SIP host’a gireceğini belirliyoruz

İlk aşama ajan senaryosu değil, telefonidir: numara hangi trunk üzerinden girer, bunu kim kontrol eder, sunucu yanıt vermediğinde ne olur. Yolun yazılı bir doğrulamasını teslim ederiz ve yol güvenli değilse, onun üzerine bir şey inşa etmeden önce bunu söyleriz. Çöken bir sunucuya sahip mükemmel bir ajan, yanıt vermeyen bir ajandır.

02

Sevkiyat senaryosunu, istisnalarıyla birlikte yazıyoruz

Kuryeye ajanın ne sorduğu, hangi sırayla, kurye üçüncü denemede yanıt vermediğinde ne yaptığı, yanıt belirsiz olduğunda ne olduğu, ne zaman insan sevkiyatçısına aktardığı. Yazılı senaryoyu ve bir aramanın ulaşabileceği durumların listesini teslim ederiz — kötü olanlar da dahil.

03

Sipariş kaynağını bağlıyor ve çıkış filtrelerini yerleştiriyoruz

Sipariş bağlamı sizin sisteminizden gelir ve bir aracın sonucunun modele ulaşmasından önce, çıkmasına izin verilmeyen alanlar listesinden geçiririz. Entegrasyonu, filtrelenen alanların yazılı listesini ve filtrenin talimatlara değil sonuca uygulandığının kanıtını teslim ederiz.

04

Küçük bir hacimde çalıştırıyoruz, transcriptleri bir insan okuyor

Aramaların bir kısmıyla başlıyoruz, sevkiyatçıya aktarım geniş yapılandırılmış halde ve transcriptleri okuyoruz. Oradan kesme eşikleri, `turn_timeout`, soruların formülasyonu ve ajanın vazgeçtiği eşik ayarlanır. Yalnızca çalıştırılmış ajanı değil, bu aramaların kararlarını içeren raporu teslim ederiz.

1Clientul întreabă2agentul cheamăfuncția de apel3apel către curier, custare proprie4până la treiîncercări, la douăminute5rezultat structurat(rezumat, timpestimat, poziție)6răspuns la client, cunumărul șoferuluifiltrat din drum
Traseul, în 6 pași

Veriler

Neye dokunuyoruz, nerede duruyorlar ve ne kadar kalıyorlar

Kurallar sektörden sektöre değişir. Bunlar taşımacılık & lojistik için geçerli olanlardır.

Sürücünün numarası, teknik bir alan değil, bir insanın kişisel verisidir
Bir kurye veya taşeron sürücü gerçek kişidir. Onun numarası, konumu ve ses kaydı onun verileridir. Bu yüzden çıkış filtresi bir güvenlik kaprisi değil, kaynaktan uygulanan minimizasyondur: alan modele ulaşmaz, dolayısıyla konuşmaya ve transcript’e de ulaşamaz.
Bir aramadan ne kalır
Arayanın numarası ve aranan numara, zaman, süre, sonuç, ses kaydı, transcript ve arama sonrası analiz. Cevaplanmayan aramalar için numara, zaman ve yanıt eksikliğinin nedeni vardır — ses kaydı yoktur, çünkü oluşmamıştır. Hepsi sizin şirketinizin çalışma alanına bağlıdır; müşteriler arasında ortak bir depo yoktur.
Aramanın başındaki bildirim sizin kararınızdır, bir ayar değil
Görüşmecinin otomatik bir sistemle konuştuğu, aramanın kaydedildiği ve hangi hukuki temelde olduğu — bunlar sizinle birlikte belirlenir ve senaryoya her iki yönde de girer: hem müşteriye hem kuryeye. Bir ajan tarafından aranan kurye, neyle konuştuğunu müşteri kadar bilmelidir.
İstek üzerine silme vardır; süre dolunca otomatik silme henüz yok
Bunu olduğu gibi söylüyoruz, çünkü bir vaat ile bir işlev arasındaki fark budur. Talep üzerine silme uygulanmıştır: özel bir işlev, dosya deposundaki nesneleri siler, veritabanındaki silme prosedürünü çağırır ve oturumları geçersiz kılar. Çalışma alanı başına yapılandırılabilir saklama süresi uygulanmamıştır — hiçbir migrasyonda değil, bir tasarım belgesinde yer alır. O zamana kadar, süresinde silme prosedürle yapılır.
Verilerin nerede bulunduğu
Supabase üzerinden PostgreSQL, kendi altyapımızda; bir kısmı satır izolasyonunu etkinleştiren sürümlenmiş migrasyonlarla. Dosyalar — kayıtlar, bilgi belgeleri, ses örnekleri — ayrı depolarda tutulur, yol çalışma alanı kimliğiyle başlar.

Bir vaka

Yalnızca bir sonuç değil, durumu olan bir arama

Durum

Bir teslimat akışında, “siparişim nerede” sorusunun hiçbir sistemde yanıtı yoktur: yanıt kuryededir. Basit sürüm — ajan kurye’ye bir mesaj yazar ve umut eder — araba kullanıp telefona bakmayan ilk kuryeyle çöker.

Ne kurduk

Dispeçerlemeyi bir işlev olarak değil, bir tablo olarak kurduk. Kurye için yapılan her aramanın yedi olası durum, deneme numarası, en fazla üç deneme, aralarında iki dakikalık bir ara ve yapılandırılmış biçimde saklanan sonuç — özet, tahmini süre, konum — içeren bir satırı vardır. Satır, çıktığı müşteri konuşmasıyla bağlantıyı korur. Tablonun çevresinde: aramayı başlatan işlev, sonucu kontrol eden işlev, takılı kalan aramalar için süpürücü, geri arayan kuryenin kimliğini belirleme ve arama sonrası webhook.

Ne çıktı

Bir dispeçerlik biriminin günlük aldığı sorulara her an, verilerden yanıt verilebilir: arama yapıldı mı, kaç kez, ne yanıt verildi, neden arama yapılmadı. Kaçan bir arama artık ara bir durumda kilitli kalmaz, çünkü onu süpürecek biri vardır.

Vakanın söylemedikleri

Mekanizma yazıldı ve platforma taşındı; telefon kısmı bir SIP sunucusuna bağlıdır, test hatlarımızın geçtiği sunucu ise yazıldığı tarihte yanıt vermemektedir. Dispeçerliği bugün bizim bir numaramızı arayarak deneyebileceğiniz bir şey olarak sunmuyoruz.

Sorular

Taşımacılık ve lojistik alanından biri ne sorar

Ajan kurye ile bizzat kendisi mi konuşur, yoksa ona yalnızca bir mesaj mı gönderir?

Konuşur. Kuryeyi aramayı başlatan bir sunucu işlevi vardır; bu işlev, çıktığı konuşmaya bağlıdır ve sipariş bağlamını bir yapı olarak iletir. Aramanın kendi bir tablodaki kendi satırı vardır; durum, deneme numarası ve sonuçla birlikte — yani her an şu soruya yanıt verilebilir: “arama yapıldı mı, ve ne dedi”.

Sürücü yanıt vermezse ne olur?

Yeniden denenir. Varsayılan olarak üç kez, iki dakika arayla; bu değerler tabloda ve süreç yapılandırmasında yazılıdır. Üçüncü denemede de yanıt vermezse, arama `no_answer` durumunda kalır — bu, bizim tarafımızda bir şeyin çöktüğü anlamına gelen `failed` durumundan ayrı bir durumdur. Bu ayrım, kayıt değil tablo kullanmaya değmesinin nedenidir.

Ajan müşteriye sürücünün numarasını verebilir mi?

Hayır, ve bunun nedeni ona yapmamasını söylememiz değil. Sürücünün iletişim alanları, sonuç modele ulaşmadan önce araç sonucundan özyinelemeli olarak çıkarılır. Dispeçerin numaraları kalır. Modele ulaşmayan şey, soru ne kadar ustaca sorulursa sorulsun, dikte edilemez.

Paketin şu anda nerede olduğunu söyleyebilir mi?

Kuryenin son aramada ona ne söylediğini, o aramanın saatiyle birlikte söyleyebilir; ya da sisteme bağlıysa sizin sisteminizden okuduğunu söyleyebilir. Yapmadığı şey — ve bu bir sınırlama değil, bir karardır — kendi başına tahmin etmektir. Bir ajan tarafından uydurulan tahmin, kapıda sürücünün katlanmak zorunda kalacağı bir vaade dönüşür.

Şimdi bir demo numarasını arayabilir miyim?

Bugün değil. Telefon kısmı bir SIP sunucusu üzerinden geçiyor ve test hatlarımızın geçtiği sunucu, bu sayfanın yazıldığı tarihte yanıt vermiyor. Sitede, sizin önünüzde kaldıramayacağımız bir numara koymuyoruz. Web üzerindeki ses yolu başka bir hikâye: orada hemen doğrulanabilir.

Müşteriyle Rusça, dispeçerle Romence mi konuşur?

Ajan yapılandırması 32 dili destekler ve Romence yeni bir ajanın varsayılan dilidir. Dil, her ajan için ayrı belirlenir; dolayısıyla müşteriyle konuşan ajan ve kuryeyi arayan ajan farklı şekilde yapılandırılabilir. Bilinmesi gereken şu: İngilizce dışındaki dillerde ses sentezi için varsayılan model hızlı olandır ve daha iyi kaliteye sahip sürüm belirgin biçimde daha yavaştır — ödün bilinçli olarak seçilir.

Müşteri onu böldüğünde ne olur?

Durur. Konuşmanın anlamsal algılanması eşiği 0,5, tamponu 300 ms ve 500 ms sessizliktir; kesintiye varsayılan olarak izin verilir; diğer hatta ise kesinti olayı çalmayı durdurması için merkeze iletilir. Bir ajan kesintiye uğratılamıyorsa, bu bir ton sorunu değil, yapılandırma sorunudur — ve fazla uzun yanıtlardır.

Şoförlerle yapılan çağrı kayıtları ne kadar süre saklanır?

Siz ne kadar belirlerseniz, çünkü veri sorumlusu sizsiniz. Platformun bugünkü durumu hakkında bilmeniz gereken: talep üzerine silme bir işlev olarak uygulanmıştır, süre sonunda otomatik silme ise, çalışma alanı başına yapılandırılabilir şekilde, uygulanmış değildir — prosedürle yapılır. Bunu bir denetimden değil, bizden öğrenmenizi tercih ederiz.

Sevk memurunun yerini alıyor mu?

Hayır. Tekrarlayan kısmını alır — aynı soru, aynı arama, aynı yanıt — ve istisnaları ona bırakır. Ona aktarım hâlâ klavyeden bir kodla yapılır ve taşımacılıkta istisnalar sık görülür: reddedilen yük, yanlış adres, cevap vermeyen müşteri. Orada bir insana ihtiyaç vardır ve daha önce yüz kez “kargo nerede” sorusuna cevap vermemiş bir insan olması daha iyidir.

Neyin daha iyi çalışmasını isterdiniz?

Bize sürecinizi anlatın. Neyin kurulmaya değer olduğuna, neyi bağlayabileceğimize ve sonucu nasıl doğrulayacağımıza birlikte karar verelim.

Hadi konuşalım