Adrian RomoAdrian Romo
Alle Texte
Architektur-Notiz 2 Min. Lesezeit

Sprachintegrationen auf Basis von asynchronen Chatbots entwickeln

Was passiert, wenn du einen asynchronen Chatbot mit Amazon Connect und Lex kombinierst, und wie kannst du Latenz, Barge-In und den Kontextübergang im Griff behalten?

Teil von Voice Systems Field Notes

Voice ist ein synchrones Medium, das auf einem zunehmend asynchronen Stack basiert. Die meisten Chatbot-Backends gehen von einer gesamten Latenzzeit von mehreren Sekunden aus – Sprachcaller bemerken bereits 300 ms.

Die Form des Problems

Wenn ein Anrufer spricht, ist der typische Ablauf:

  1. Amazon Connect erfasst Audio und streamt es an Lex.
  2. Lex löst die Absicht auf und ruft einen Lambda-Fulfillment-Hook auf.
  3. Lambda verteilt an nachgelagerte Dienste – CRM, Ticketing, LLM.
  4. Die Antwort kommt zurück, Polly synthetisiert, der Anrufer hört es.

Jeder Schritt ist ein Budget, das du nicht hast. Das Chatbot-Backend wurde für Chat entwickelt, wo eine Antwort von 2 Sekunden schnell wirkt. In der Sprache fühlt sich eine Stille von 2 Sekunden unterbrochen an.

Was ich stattdessen mache

async def fulfill(intent, session):
    # Wahrscheinliche nachgelagerte Aufrufe sofort starten, 
    # sobald der Anrufer mit einer Äußerung beginnt, 
    # nicht nachdem Lex zurückgegeben hat.
    async with asyncio.TaskGroup() as tg:
        customer = tg.create_task(crm.lookup(session.caller_id))
        history  = tg.create_task(history_store.recent(session.id))

    return compose_response(intent, customer.result(), history.result())
python

Der Trick ist spekulative Vorababruf: In dem Moment, in dem der Anrufer zu sprechen beginnt, weißt du bereits, wer sie sind (ANI), aus welcher Warteschlange sie kommen und normalerweise, was sie wollen. Starte die nachgelagerten Aufrufe sofort. Bis Lex die Absicht auflöst, ist die Hälfte der I/O bereits erledigt.

Barge-in verändert alles

Wenn du kein Barge-in unterstützt, fühlen sich Anrufer, die das System kennen, bestraft. Wenn du es unterstützt, wird jede laufende Polly-Synthese abgebrochen. Das bedeutet, dass dein Lambda idempotent unter Abbruch sein muss – und deine Metriken müssen "Anrufer hat aufgelegt" von "Anrufer hat sich eingemischt" und "Zeitüberschreitung" unterscheiden. Ich habe das auf die harte Tour gelernt, als die "Abbruchrate" anstieg, weil wir Barge-ins als Abbrüche gezählt haben.

Kontextübergabe

Das eigentliche Chaos entsteht, wenn die Sprache an einen Agenten eskaliert. Was auch immer du im Bot erfasst hast – Absicht, Entitäten, Vertrauenswerte, Stimmung des Anrufers – muss auf dem Bildschirm des Agenten bevor die Stimme des Anrufers ankommt. Eine Verzögerung von 2 Sekunden fühlt sich an, als ob der Agent nicht zuhört.

Die Pointe

Voice-on-async ist nicht schwieriger als asynchroner Chat. Es ist ein anderes Budget. Entwerfe für Barge-in, hole aggressiv vorab ab und messe die Anrufqualitäts-Signale getrennt von den Absichtserfolgs-Signalen.

Weiter geht's

Wohin als Nächstes?

Stöbere durch weitere technische Texte, sieh dir die Engineering Case Studies an oder melde dich direkt.