Telefonagent mit Terminbuchung: technische Umsetzung
Wie der Agent Anrufe annimmt, freie Zeiten sucht und bucht, was die KI allein darf und wie Fehler und Sonderfälle abgefangen werden.
- Werkzeuge für den Agenten
- 10
- Schritte bis zur Buchung: Vorschlag, dann Buchung
- 2
- Stille, bis der Wächter eingreift (Standardwert)
- 8 s
- Sitzungsgrenze, kontrolliertes Ende
- ca. 8 min
- Buchungsfenster im Voraus
- 60 min bis 14 Tage
- Zeitlimits für Anfragen ans Buchungssystem
- 5 s / 15 s
So wird aus einem Anruf ein Termin
Jeder Schritt lässt sich aufklappen.
Berechtigungen des Modells
Kein Zugriff
- Bestehende Termine nachschlagen, stornieren oder umbuchen
- Termine bei Personen vergeben, die der Betrieb von der automatischen Vergabe ausnimmt
- Sich als Mensch ausgeben
- Zusagen machen, die über das Leistungsangebot hinausgehen
- Anrufe weiterleiten (nicht vorgesehen)
Erlaubt ohne Freigabe
- Leistungen, Dauer und Preise aus dem Angebot nennen
- Freie Zeiten suchen und anbieten
- Einen Buchungsvorschlag anlegen und nach klarem Ja buchen
- Termine für zwei Personen zur gleichen Zeit suchen und buchen
- Eine Nachricht mit Rückrufwunsch ans Team schicken
- Das Gespräch mit einem festen Grund beenden
Kontrollen
Zwei Schritte bis zur Buchung
Zuerst entsteht mit preview_booking ein Vorschlag mit eigener Kennung, erst book bucht wirklich. Das erzwingt die Buchungs-API: book arbeitet nur mit der Kennung eines Vorschlags. Die API prüft außerdem, ob die Zeit frei ist und die Eingaben stimmen.
Bestätigungen als Pflichtangabe
book verlangt, dass das Modell beide Bestätigungen, Mobilnummer und Pflichthinweise, ausdrücklich als erteilt meldet. Fehlt eine, weist der Code die Buchung mit confirmation_missing zurück und gibt die Anweisung, nachzufragen. Die Grenze: Ob der Anrufer wirklich Ja gesagt hat, kann der Code nicht feststellen. Die Sperre verhindert eine Buchung, bei der das Modell die Bestätigung übersprungen hat.
Kein Werkzeug für Stornos
Bestehende Termine nachschlagen, absagen oder verschieben kann der Agent gar nicht, weil er dafür kein Werkzeug hat. Das ist keine Arbeitsregel, sondern fehlt schlicht.
Kein Vorschlag ohne echten Namen
Platzhalter wie „[Name erforderlich]“, „Kunde“ oder „Test“ blockiert der Code, bevor ein Vorschlag angelegt wird.
Öffnungsstatus und Rückrufnummer aus dem Code
Ob der Betrieb gerade geöffnet hat, berechnet der Code und gibt es dem Sprachmodell vor. Die Nummer des Anrufers hängt der Code selbst an jede Nachricht ans Team, sofern die Telefonanlage sie übermittelt, statt sich darauf zu verlassen, dass das Modell sie weitergibt.
Arbeitsregeln im Prompt
Einige Regeln stehen nur im Prompt und sind keine technische Sperre: freie Zeiten nur aus find_times nennen, keine Preise oder Zeiten erfinden, ohne sichere Antwort eine Nachricht anbieten, das Buchungsfenster von 60 Minuten bis 14 Tagen und eine Liste von Leistungsnamen, die am Telefon oft falsch verstanden werden. Unabhängig davon prüft die Buchungs-API, ob eine Zeit frei ist und die Eingaben stimmen.
Fehler mit nächster Anweisung
Die wichtigsten Werkzeugfehler (fehlender Name, fehlende Bestätigung, fehlerhafte Eingabe) enthalten eine konkrete Anweisung, was der Agent als Nächstes tun soll. So kann er sich im Gespräch selbst korrigieren, statt hängen zu bleiben.
Sonderfälle
- Wenn das Modell beim Buchen die Bestätigung von Mobilnummer oder Hinweisen nicht ausdrücklich meldet, weist der Code die Buchung zurück, und der Agent fragt beim Anrufer nach.
- Wenn noch kein echter Name genannt wurde, legt der Agent keinen Buchungsvorschlag an, sondern fragt nach.
- Wenn find_times für den Wunschtag nichts liefert, nennt der Agent keine Zeit, sondern schlägt einen anderen Tag vor.
- Wenn der Termin zwischen Vorschlag und Buchung vergeben wurde, meldet die API slot_unavailable, und der Agent bietet eine andere Zeit an.
- Wenn die API eine Eingabe als fehlerhaft zurückweist, bekommt der Agent einen konkreten Korrekturhinweis und versucht es erneut. Fehlt bei der Suche die Dauer, setzt der Code eine Standarddauer ein, in der Regel 60 Minuten.
- Wenn das Buchungssystem nicht antwortet, bricht die Anfrage nach 5 bzw. 15 Sekunden mit transport_error ab. Der Agent nimmt dann eine Nachricht auf oder nennt die anderen Kontaktwege des Betriebs.
- Wenn ein Termin bei einer Person gewünscht ist, die der Betrieb von der automatischen Vergabe ausnimmt, bucht der Agent nicht, sondern nimmt eine Nachricht auf.
- Wenn jemand einen Termin absagen oder verschieben will, storniert der Agent nicht selbst, sondern verweist auf den Link in der Bestätigung und nimmt auf Wunsch eine Nachricht auf.
- Wenn der Anrufer einen Menschen sprechen möchte, nimmt der Agent eine Nachricht mit Rückrufwunsch auf. Im normalen Gespräch rät er bewusst nicht zu einem erneuten Anruf, weil der wieder bei ihm landen würde.
- Wenn zwei Personen zur gleichen Zeit einen Termin möchten, nutzt der Agent eigene Werkzeuge für Termine zu zweit, mit demselben Ablauf aus Vorschlag und Buchung.
- Wenn nach einer Antwort des Agenten beide Seiten 8 Sekunden lang schweigen, schickt der Stille-Wächter dem Modell einen Anstoß, höchstens zweimal hintereinander. Während ein Werkzeug läuft oder noch Audio abgespielt wird, greift er nicht ein.
- Wenn nach 180 Sekunden weder gesucht noch gebucht noch eine Nachricht aufgenommen wurde, fragt ein Systemhinweis das Modell, ob es sich um einen Vertriebsanruf handelt.
- Wenn ein Vertriebsanruf oder ein anderer KI-Anrufer erkannt wird, bittet der Agent um eine schriftliche Anfrage über die Website und beendet das Gespräch.
- Wenn jemand eine unangemessene Anfrage stellt, lehnt der Agent höflich ab und legt auf.
- Wenn das Gespräch sich der Sitzungsgrenze von rund 8 Minuten nähert, kündigt der Agent bei 440 Sekunden das Ende an und bietet eine Nachricht an. Bei 470 Sekunden legt der Code auf.
- Wenn die Sitzung mit dem Sprachmodell unerwartet abbricht, legt das Gateway ebenfalls auf, statt den Anrufer in der Stille zu lassen.
Technische Hürden
- 01
Problem
Das Sprachmodell hielt sich nicht verlässlich an den Prompt. Es legte einen Vorschlag mit einem Platzhalter statt eines Namens an, meldete Bestätigungen, die der Anrufer nie gegeben hatte, und bot um 23 Uhr einen Termin für „heute 18 Uhr“ an.
Lösung
Die wichtigen Regeln wurden in den Code verlegt: ein Filter für Platzhalter-Namen, zwei Pflicht-Bestätigungen bei book und ein Öffnungsstatus, den der Code berechnet. Außerdem hängt der Code die Rückrufnummer selbst an Nachrichten, nachdem das Modell das verweigert hatte. Die wichtigsten Werkzeugfehler sagen dem Modell konkret, was es als Nächstes tun soll. Offen bleibt: Ob der Anrufer wirklich zugestimmt hat, prüft weiterhin das Modell im Gespräch.
- 02
Problem
Der Agent kündigte an „Einen Moment, ich prüfe das“ und rief dann kein Werkzeug auf. Weil ein Sprachmodell dieser Art nur nach einer Eingabe spricht, blieb es danach still.
Lösung
Eine Arbeitsregel verlangt, Werkzeuge sofort aufzurufen und nie nur anzukündigen. Zusätzlich schickt ein Stille-Wächter nach 8 Sekunden beidseitiger Stille einen Systemhinweis als Text. Dieser steht in eckigen Klammern und wird nie vorgelesen.
- 03
Problem
Echtzeit-Audio hat eigene Tücken: Telefon-Audio muss umgewandelt werden, Anrufer fallen ins Wort, das Modell erzeugt Sprache schneller, als sie abgespielt wird, und die Sitzung endet nach rund 8 Minuten.
Lösung
Das Gateway wandelt G.711 und PCM in beide Richtungen um. Fällt der Anrufer ins Wort, wird die Audio-Warteschlange geleert. Aufgelegt wird erst, wenn die Verabschiedung wirklich abgespielt ist, höchstens nach 15 Sekunden. Vor der Sitzungsgrenze kündigt der Agent bei 440 Sekunden das Ende an, bei 470 Sekunden legt der Code auf, und bei einem Abbruch der Sitzung ebenfalls.
Dienste und Datenschutz
| Aufgabe | Anbieter |
|---|---|
| Sprachmodell (Hören und Sprechen) | Amazon Nova Sonic über Amazon Bedrock (AWS) |
| Server für das Telefon-Gateway | AWS EC2 |
| Telefonie | SIP-Anbieter |
| Buchungssystem | eigene Buchungs-API des Betriebs |
| Nachrichten ans Team | Infomaniak (kChat) |
Das Sprachmodell läuft in der AWS-Region Stockholm, die einzige Region, in der das Modell verfügbar ist. Die Buchungs-API ist mit einem Zugangsschlüssel geschützt.
Betrieb und Tests
Grundlage ist ein Beispielprojekt von AWS für ein Sprach-Gateway (Nova S2S VoIP Gateway), betrieben mit Amazon Nova Sonic in der AWS-Region Stockholm. Die Buchungswerkzeuge wurden aus einem älteren Agenten übernommen.
Das Gateway ist ein Java-Dienst auf einem Server bei AWS EC2. Die Konfiguration der Betriebe wird beim Start geprüft; ist sie fehlerhaft, startet das Gateway nicht.
Zehn automatische Testklassen (JUnit) prüfen unter anderem die Zuordnung nach angerufener Nummer, die Konfiguration der Betriebe und die Aufbereitung von Rufnummern.
Mehrere Betriebe können dasselbe Gateway nutzen. Sie werden über die angerufene Nummer getrennt, jeder mit eigenem Prompt, eigener Stimme und eigenen Werkzeugen.