Πώς χτίσαμε το Callen AI: η αρχιτεκτονική μιας AI ρεσεψιόν φωνής σε παραγωγή

Τεχνική ανάλυση της φωνητικής ροής του Callen AI: πώς τα Twilio, speech-to-text σε πραγματικό χρόνο, GPT-4 και ElevenLabs κλείνουν πραγματικά ραντεβού.

Μια φωνητική AI ρεσεψιόν είναι ένα κατανεμημένο σύστημα πραγματικού χρόνου με φιλική φωνή. Το Callen AI, το δικό μας προϊόν, απαντά σε ζωντανές εισερχόμενες κλήσεις για κλινικές, καταλαβαίνει τι θέλει ο καλών, ελέγχει ένα πραγματικό ημερολόγιο και κλείνει το ραντεβού, όλα πριν χάσει ο καλών την υπομονή του. Σε αυτό το άρθρο περιγράφω την πραγματική αρχιτεκτονική: το επίπεδο τηλεφωνίας, τη ροή ομιλίας σε πραγματικό χρόνο, την ενορχήστρωση του LLM στη μέση και τις δικλίδες ασφαλείας παραγωγής που το κάνουν αρκετά αξιόπιστο ώστε να μιλά με τους ασθενείς κάποιου άλλου.

Το δημοσιεύουμε γιατί οι περισσότερες παρουσιάσεις του τύπου «χτίζουμε AI agents» σταματούν σε ένα διάγραμμα με τέσσερα κουτιά. Η ενδιαφέρουσα μηχανική βρίσκεται σε όσα συμβαίνουν ανάμεσα στα κουτιά.

Ο βασικός περιορισμός: η καθυστέρηση είναι το προϊόν

Τα πάντα στην αρχιτεκτονική ενός φωνητικού agent εξαρτώνται από έναν αριθμό: τη σιωπή ανάμεσα στη στιγμή που ο καλών τελειώνει μια πρόταση και τη στιγμή που ο agent αρχίζει να απαντά. Οι άνθρωποι ανέχονται περίπου ένα δευτερόλεπτο παύσης σε μια τηλεφωνική συζήτηση πριν τους φανεί ότι κάτι χάλασε. Αυτός ο προϋπολογισμός πρέπει να καλύψει την οριστικοποίηση της απομαγνητοφώνησης από το speech-to-text, την απόφαση του LLM για το τι θα πει, την παραγωγή ήχου από το text-to-speech και κάθε δικτυακή μετάβαση ενδιάμεσα.

Δεν πιάνετε αυτόν τον στόχο με μια αφελή ροή που περιμένει να τελειώσει κάθε στάδιο. Τον πιάνετε κάνοντας streaming σε όλα:

  • Ο ήχος έρχεται συνεχώς μέσω WebSocket, όχι σε ηχογραφημένα κομμάτια.
  • Η απομαγνητοφώνηση είναι σταδιακή, η ροή βλέπει μερικές απομαγνητοφωνήσεις ενώ ο καλών ακόμη μιλά.
  • Η απάντηση του LLM βγαίνει σε streaming, token προς token.
  • Η σύνθεση ομιλίας ξεκινά από την πρώτη πρόταση της απάντησης, όχι από την τελευταία, ο καλών ακούει την αρχή μιας απάντησης της οποίας το τέλος δεν υπάρχει ακόμη.

Μόλις δεσμευτείτε στο streaming σε κάθε στάδιο, η αρχιτεκτονική σε μεγάλο βαθμό σχεδιάζεται μόνη της. Να πώς δένουν τα στάδια μεταξύ τους.

Στάδιο 1: Είσοδος τηλεφωνίας, το Twilio ως κεντρική πόρτα

Ο αριθμός μιας κλινικής (υπάρχων ή νέος) δρομολογείται στο Twilio. Σε μια εισερχόμενη κλήση, το Twilio ανοίγει ένα Media Stream, ένα WebSocket που μεταφέρει τον ακατέργαστο ήχο του καλούντος στο backend μας σχεδόν σε πραγματικό χρόνο και δέχεται ήχο προς την αντίθετη κατεύθυνση. Αυτό το WebSocket είναι η ραχοκοκαλιά ολόκληρης της κλήσης: όλα τα υπόλοιπα, απομαγνητοφώνηση, συλλογισμός, σύνθεση, κρέμονται από αυτό.

Η χρήση μιας πλατφόρμας τηλεφωνίας αντί για ακατέργαστη υποδομή SIP είναι μια σκόπιμη απόφαση μιας μικρής ομάδας. Το Twilio μάς δίνει παροχή αριθμών, διασύνδεση με το δημόσιο τηλεφωνικό δίκτυο, ηχογράφηση κλήσεων και ένα καθαρό μοντέλο αστοχιών, και αφήνει μια μικρή senior ομάδα να ξοδεύει τον προϋπολογισμό μηχανικής της στο κομμάτι που πραγματικά προσέχουν οι καλούντες: τη συζήτηση.

Στάδιο 2: Speech-to-text σε πραγματικό χρόνο

Ο εισερχόμενος ήχος τροφοδοτεί μια μηχανή STT σε streaming που εκπέμπει δύο είδη συμβάντων: μερικές απομαγνητοφωνήσεις (φθηνές, αναθεωρήσιμες εκτιμήσεις ενώ ο καλών είναι στη μέση της πρότασης) και τελικές απομαγνητοφωνήσεις (οριστικό κείμενο). Δύο λεπτομέρειες μετρούν πολύ περισσότερο από την καθαρή ακρίβεια λέξεων:

Endpointing, η απόφαση ότι ο καλών ολοκλήρωσε μια σκέψη. Αν μπει νωρίς, ο agent διακόπτει. Αν περιμένει πολύ, η παύση μοιάζει νεκρή. Είναι ένας ρυθμιζόμενος συμβιβασμός ανάμεσα στην ταχύτητα και την αγένεια, και χρειάζεται ρύθμιση πάνω σε πραγματικά δεδομένα κλήσεων, όχι σε ήχο εργαστηρίου.

Λεξιλόγιο του κλάδου. Ένα γενικό μοντέλο ακούει όρους που αφορούν την κλινική, ονόματα θεραπειών, ονόματα γιατρών, και παράγει δημιουργικές ανοησίες. Η προσαρμογή της απομαγνητοφώνησης στο λεξιλόγιο κάθε κλινικής είναι δουλειά ρύθμισης ανά πελάτη, και κάνει τη διαφορά ανάμεσα στο «κλείστε μου έναν καθαρισμό» και σε ένα μυστήριο που ακούστηκε λάθος.

Στάδιο 3: Ο εγκέφαλος, GPT-4 με εργαλεία, όχι σενάριο

Η μέση της ροής είναι ένας βρόχος ενορχήστρωσης LLM χτισμένος γύρω από μοντέλα κλάσης GPT-4. Τρεις σχεδιαστικές αποφάσεις τον ορίζουν:

Η πολιτική συνομιλίας ζει στο system prompt, τα δεδομένα ζουν στα εργαλεία. Το μοντέλο ξέρει ποιο είναι, τι προσφέρει η κλινική και, εξίσου σημαντικό, τι δεν πρέπει να κάνει (να κάνει διάγνωση, να αναφέρει τιμές που δεν είναι καταχωρημένες, να υποσχεθεί ένα ραντεβού που δεν έχει επιβεβαιώσει). Δεν του ζητείται όμως ποτέ να θυμάται το ημερολόγιο. Ό,τι είναι γεγονός ανακτάται τη στιγμή της κλήσης.

Κλήση εργαλείων αντί για ελεύθερη παραγωγή κειμένου. Όταν ο καλών θέλει ραντεβού, το μοντέλο δεν απαντά από φαντασία, εκπέμπει μια δομημένη κλήση συνάρτησης: check_availability(service, window), μετά book_appointment(...) πάνω στο πραγματικό σύστημα κρατήσεων της κλινικής. Το LLM αποφασίζει πότε θα καλέσει. Ντετερμινιστικός κώδικας TypeScript αποφασίζει τι πραγματικά συμβαίνει. Αυτός ο διαχωρισμός, το μοντέλο προτείνει και ο κώδικας αποφασίζει, είναι το πιο σημαντικό μοτίβο στη μηχανική agents για παραγωγή.

Περιορισμένο εύρος συνομιλίας. Η δουλειά του Callen AI είναι η υποδοχή: χαιρετισμός, κατανόηση, αναζήτηση, κράτηση, λήψη μηνύματος, μεταβίβαση. Ρητά δεν είναι ιατρικό chatbot. Ο περιορισμός του εύρους είναι αυτό που κάνει διαχειρίσιμη τη μεγάλη ποικιλία μιας ζωντανής τηλεφωνικής κλήσης, και γι' αυτό ένας εξειδικευμένος agent μπορεί να είναι έτοιμος για παραγωγή ενώ ένα bot που «κάνει τα πάντα» μένει demo.

Το επίπεδο ενορχήστρωσης γύρω από το μοντέλο χειρίζεται τα υπόλοιπα, τα μη λαμπερά: ρυθμίσεις ανά πελάτη (κάθε κλινική έχει τις δικές της υπηρεσίες, ωράρια, προσωπικό και φωνή), κατάσταση συνομιλίας, επαναλήψεις σε προσωρινές αστοχίες API, και χρονικά όρια ώστε μια αργή εξάρτηση να υποβαθμίζει την απάντηση αντί να παγώνει την κλήση.

Στάδιο 4: Text-to-speech, ElevenLabs, πρόταση προς πρόταση

Η απάντηση ρέει από το LLM στο ElevenLabs για σύνθεση, πρόταση προς πρόταση, και ο ήχος που προκύπτει επιστρέφει κατευθείαν μέσω του WebSocket του Twilio. Ο φυσικός τονισμός μετράει εμπορικά, όχι μόνο αισθητικά: οι καλούντες κλείνουν το τηλέφωνο σε ρομποτικές φωνές, και μια ρεσεψιόν που ακούγεται σαν ρεσεψιόν αντιμετωπίζεται σαν ρεσεψιόν.

Η λεπτή μηχανική εδώ είναι το barge-in. Οι πραγματικοί καλούντες διακόπτουν. Η ροή πρέπει να αντιληφθεί νέα εισερχόμενη ομιλία ενώ ο agent μιλά, να σταματήσει την αναπαραγωγή, να απορρίψει το υπόλοιπο της απάντησης που πλέον δεν ισχύει και να επιστρέψει σε ακρόαση, με όλη τη στοίβα να καθαρίζει σωστά στη μέση της φράσης. Το σωστό barge-in είναι ένα από εκείνα τα προβλήματα που είναι αόρατα όταν δουλεύουν και μοιραία όταν δεν δουλεύουν.

Το κεντρικό σύστημα καταγραφής: βαρετό επίτηδες

Γύρω από τη ροή πραγματικού χρόνου υπάρχει μια σκόπιμα συμβατική ραχοκοκαλιά SaaS, TypeScript και Next.js, Supabase (Postgres) ως κεντρικό σύστημα καταγραφής, Stripe για τη χρέωση, και αυτόνομο onboarding που θέτει μια κλινική σε λειτουργία σε περίπου 30 λεπτά. Κάθε κλήση παράγει μια απομαγνητοφώνηση, ένα δομημένο αποτέλεσμα (κλείστηκε ραντεβού / ελήφθη μήνυμα / μεταβιβάστηκε) και ένα αρχείο καταγραφής που η κλινική μπορεί να ελέγξει.

Αυτή η «βαρεμάρα» είναι χαρακτηριστικό. Ο καινούργιος κίνδυνος του προϊόντος είναι συγκεντρωμένος στη φωνητική ροή. Να ξοδέψουμε προϋπολογισμό καινοτομίας στη βάση δεδομένων θα ήταν αρχιτεκτονικό σφάλμα. Έχουμε γράψει περισσότερα γι' αυτή την αρχή στο Το AI είναι πολλαπλασιαστής, όχι λύση.

Δικλίδες ασφαλείας: σχεδιάζοντας για την αστοχία, όχι για το demo

Ένας agent σε παραγωγή ορίζεται από το τι συμβαίνει όταν ξεπερνά τα όριά του:

  • Η μεταβίβαση σε άνθρωπο ως αποτέλεσμα πρώτης κατηγορίας. Όταν ο καλών είναι αναστατωμένος, το αίτημα είναι εκτός εύρους ή η βεβαιότητα πέφτει, η δουλειά του agent είναι μια κομψή έξοδος: να πάρει μήνυμα με υπόσχεση επανάκλησης ή να προωθήσει την κλήση. Η μεταβίβαση είναι τρόπος επιτυχίας, όχι αποτυχία.
  • Επικύρωση στις εγγραφές. Οι αλλαγές στις κρατήσεις επικυρώνονται από κώδικα της εφαρμογής, πραγματική υπηρεσία, πραγματικό διαθέσιμο ραντεβού, λογικά δεδομένα, ανεξάρτητα από το τι πρότεινε το μοντέλο. Το LLM δεν μπορεί να χαλάσει ένα ημερολόγιο με παραισθήσεις.
  • Πλήρης παρατηρησιμότητα. Οι ηχογραφήσεις και οι απομαγνητοφωνήσεις τροφοδοτούν ένα σύνολο δοκιμών παλινδρόμησης με πραγματικά (ανωνυμοποιημένα) σενάρια κλήσεων, ώστε μια αλλαγή στο prompt ή στο μοντέλο να δοκιμάζεται στις δύσκολες κλήσεις του προηγούμενου μήνα πριν συναντήσει έναν ζωντανό καλούντα.
  • Προστασία δεδομένων μέσω περιορισμένου εύρους. Ο agent συλλέγει το ελάχιστο που χρειάζεται για μια κράτηση, όνομα, στοιχεία επικοινωνίας, υπηρεσία, με διατήρηση δεδομένων που σέβεται τον GDPR. Το περιορισμένο εύρος βοηθά και εδώ: μια ρεσεψιόν που δεν δίνει ποτέ ιατρικές συμβουλές δεν προκαλεί ποτέ και κλινικές αποκαλύψεις που δεν θα έπρεπε να αποθηκεύει.

Τι μας δίδαξε το να χτίσουμε το δικό μας προϊόν

Το Callen AI είναι ταυτόχρονα προϊόν και η απόδειξη ότι παραδίδουμε. Η λειτουργία του δικού μας agent με πραγματικό όγκο κλήσεων μάς δίδαξε πράγματα που καμία συνεργασία με πελάτη δεν θα μπορούσε να συμπυκνώσει:

  1. Το demo είναι το 20% της δουλειάς. Ένα πειστικό demo φωνητικού agent θέλει μια καλή εβδομάδα. Η παραγωγή, barge-in, endpointing ρυθμισμένο σε πραγματικό ήχο, απομόνωση πελατών, χρέωση, σύνολο δοκιμών παλινδρόμησης, είναι εκεί που βρίσκεται το υπόλοιπο 80%.
  2. Η δουλειά στην καθυστέρηση είναι δουλειά αρχιτεκτονικής. Δεν μπορείτε να προσθέσετε το streaming αργότερα. Η ροή είτε σχεδιάζεται γύρω από αυτό είτε είναι καταδικασμένη σε αμήχανες παύσεις.
  3. Το εξειδικευμένο κερδίζει το γενικό. Κάθε δύσκολο υποπρόβλημα γίνεται ευκολότερο όταν το εύρος του agent είναι μία δουλειά, ολοκληρωμένη.
  4. Ντετερμινιστικά άκρα, πιθανοτικός πυρήνας. Το LLM παίρνει τις αποφάσεις της συνομιλίας. Typed, δοκιμασμένος κώδικας ελέγχει κάθε παρενέργεια. Οι καλούντες παίρνουν ευελιξία, το ημερολόγιο παίρνει ορθότητα.

Αυτή είναι η ίδια αρχιτεκτονική που χτίζουμε σήμερα για πελάτες, φωνητικούς agents, βοηθούς RAG και ροές πολλών agents, στα ελληνικά και στα αγγλικά, διασυνδεδεμένους με τα συστήματα που ήδη χρησιμοποιούν. Αν θέλετε έναν τέτοιο agent να απαντά στους δικούς σας πελάτες, ο πιο γρήγορος τρόπος να μάθετε τι χρειάζεται είναι μια κλήση 20 λεπτών.

Θέλετε τη ματιά ενός έμπειρου μηχανικού σε αυτό που χτίζετε;

Κλήση 30 λεπτών. Ευθέως, χωρίς παρουσιάσεις, χωρίς να σας παραδώσουμε σε junior.

Κλείστε μια κλήση στρατηγικής 30 λεπτών →