View a markdown version of this page

Erfassung von Slot-Werten mit Rechtschreibstilen während der Konversation - Amazon Lex

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erfassung von Slot-Werten mit Rechtschreibstilen während der Konversation

Amazon Lex V2 bietet integrierte Steckplätze zur Erfassung benutzerspezifischer Informationen wie Vorname, Nachname, E-Mail-Adresse oder alphanumerische Identifikatoren. Sie können den AMAZON.LastName Slot beispielsweise verwenden, um Nachnamen wie „Jackson“ oder „Garcia“ zu erfassen. Amazon Lex V2 kann jedoch mit Nachnamen verwechselt werden, die schwer auszusprechen sind oder in einem bestimmten Land nicht üblich sind, wie z. B. „Xiulan“. Um solche Namen zu erfassen, können Sie den Benutzer bitten, die Eingabe buchstabenweise oder buchstabenweise vorzunehmen.

Amazon Lex V2 bietet drei verschiedene Arten der Slot-Erfassung, die Sie verwenden können. Wenn Sie einen Stil für die Slot-Erfassung festlegen, ändert sich dadurch die Art und Weise, wie Amazon Lex V2 die Benutzereingaben interpretiert.

Buchstabenweise — Mit diesem Stil können Sie den Bot anweisen, nicht auf die gesamte Phrase, sondern auf Schreibweisen zu achten. Um beispielsweise einen Nachnamen wie „Xiulan“ zu erfassen, können Sie den Benutzer anweisen, seinen Nachnamen buchstabenweise zu buchstabieren. Der Bot erfasst die Schreibweise und löst die Buchstaben zu einem Wort auf. Wenn der Benutzer beispielsweise „x i u l a n“ sagt, erfasst der Bot den Nachnamen als „Xiulan“.

Buchstabieren für Wort — In Sprachgesprächen, insbesondere am Telefon, gibt es einige Buchstaben, wie „t“, „b“, „p“, die ähnlich klingen. Wenn die Erfassung alphanumerischer Werte oder die Rechtschreibung von Namen zu einem falschen Wert führt, können Sie den Benutzer auffordern, zusammen mit dem Buchstaben ein identifizierendes Wort anzugeben. Wenn die Sprachantwort auf eine Anfrage nach einer Buchungs-ID beispielsweise „abp123“ lautet, erkennt Ihr Bot stattdessen möglicherweise stattdessen den Ausdruck „ab b 123". Wenn dies ein falscher Wert ist, können Sie den Benutzer bitten, die Eingabe als „a wie in Alpha b wie in boy p wie in peter eins zwei drei“ einzugeben. Der Bot löst die Eingabe in „abp123“ auf.

Wenn Sie buchstabenweise verwenden, können Sie die folgenden Formate verwenden:

Für Englisch (USA), Englisch (UK) und Englisch (Australien):

  • „wie in“ (wie in Apple)

  • „für“ (a für Apfel)

  • „wie“ (ein wie Apfel)

Für Deutsch (de-DE):

  • „Wein“ (auf einer Weinpizza)

  • „für“ (p für Pizza)

Für Französisch (fr-FR):

  • „comme“ (p comme paris)

  • „pour“ (p pour Paris)

Für Spanisch (es-419, es-US, es-ES):

  • „como“ (u como union)

  • „de“ (u de union)

Standard — Dies ist der natürliche Stil der Slot-Erfassung mithilfe der Wortaussprache. Zum Beispiel können Namen wie „John Stiles“ auf natürliche Weise erfasst werden. Wenn kein Slot-Auslösestil angegeben ist, verwendet der Bot den Standardstil. Für die Typen AMAZON.AlphaNumeric und AMAZON.UKPostal Code-Slot unterstützt der Standardstil die Buchstaben-für-Buchstaben-Eingabe.

Wenn der Name „Xiulan“ mit einer Mischung aus Buchstaben und Wörtern gesprochen wird, z. B. „x wie in X-ray i u l wie in lion a n“, muss für das Auslesen des Spielautomaten der Stil „Buchstab-für-Wort“ gewählt werden. Der Buchstaben-für-Buchstaben-Stil erkennt ihn nicht.

Für ein besseres Erlebnis sollten Sie eine Sprachschnittstelle erstellen, die Slot-Werte in einem natürlichen Gesprächsstil erfasst. Bei Eingaben, die im natürlichen Stil nicht korrekt erfasst werden, können Sie den Benutzer erneut auffordern und den Slot-Ausrufstil auf buchstabenweise oder buchstabenweise festlegen.

Sie können für die folgenden Slot-Typen in den Sprachen Englisch (US), Englisch (UK), Englisch (Australien), Deutsch (de-DE), Französisch (fr-FR) und Spanisch (es-419, es-US, es-ES) die Stile „Buchstabenweise“ und „Buchstabenweise“ verwenden:

Rechtschreibung aktivieren

Sie aktivieren Buchstaben-für-Wort und Buchstaben-für-Wort zur Laufzeit, wenn Sie dem Benutzer Slots entlocken. Sie können den Rechtschreibstil mit der Operation,, oder festlegen. PutSession RecognizeText RecognizeUtterance StartConversation Mithilfe einer Lambda-Funktion können Sie auch die buchstabenweise und die buchstabenweise buchstabenweise buchstabenweise Funktion aktivieren.

Sie legen den Rechtschreibstil mithilfe des dialogAction Felds in der Anforderung einer der sessionState oben genannten API-Operationen oder bei der Konfiguration der Lambda-Antwort fest (weitere Informationen finden Sie unter). AWS LambdaAntwortformat für Lex V2 Sie können den Stil nur festlegen, wenn der Aktionstyp „Dialog“ lautet ElicitSlot und wenn es sich bei dem aufzurufenden Slot um einen der unterstützten Slot-Typen handelt.

Der folgende JSON-Code zeigt das dialogAction Feld, das so eingerichtet ist, dass es den buchstabenweisen Stil verwendet:

"dialogAction": { "slotElicitationStyle": "SpellByWord", "slotToElicit": "BookingId", "type": "ElicitSlot" }

Das Feld slotElicitationStyle kann auf SpellByLetter, SpellByWord oder Default gesetzt werden. Wenn Sie keinen Wert angeben, wird der Wert auf gesetzt. Default

Anmerkung

Sie können über die Konsole keine Stile für die buchstabenweise oder buchstabenweise Erfassung aktivieren.

Beispielcode mit Lambda und Lex V2

Das Ändern des Rechtschreibstils erfolgt normalerweise, wenn der erste Versuch, einen Slot-Wert zu lösen, nicht funktioniert hat. Das folgende Codebeispiel ist eine Python-Lambda-Funktion, die beim zweiten Versuch, einen Slot zu lösen, den Spell-by-Word-Stil verwendet.

Um den Beispielcode verwenden zu können, benötigen Sie:

  • Ein Bot mit einer Sprache, Englisch (GB) (en_GB).

  • Eine Absicht, "CheckAccount" mit einer Beispieläußerung, „Ich möchte mein Konto überprüfen“. Vergewissern Sie sich, dass im Abschnitt Code-Hooks der Intent-Definition die Option Eine Lambda-Funktion für Initialisierung und Validierung verwenden ausgewählt ist.

  • Die Absicht sollte einen Slot, "PostalCode„, vom Typ „AMAZON.UKPostalCodeeingebaut“ haben.

  • Ein Alias mit definierter Lambda-Funktion. Weitere Informationen finden Sie unter Eine AWS Lambda Funktion für Ihren Amazon Lex V2-Bot erstellen.

import json import time import os import logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) # --- Helpers that build all of the responses --- def get_slots(intent_request): return intent_request['sessionState']['intent']['slots'] def get_session_attributes(intent_request): sessionState = intent_request['sessionState'] if 'sessionAttributes' in sessionState: return sessionState['sessionAttributes'] return {} def get_slot(intent_request, slotName): slots = get_slots(intent_request) if slots is not None and slotName in slots and slots[slotName] is not None: logger.debug('resolvedValue={}'.format(slots[slotName]['value']['resolvedValues'])) return slots[slotName]['value']['resolvedValues'] else: return None def elicit_slot(session_attributes, intent_request, slots, slot_to_elicit, slot_elicitation_style, message): return {'sessionState': {'dialogAction': {'type': 'ElicitSlot', 'slotToElicit': slot_to_elicit, 'slotElicitationStyle': slot_elicitation_style }, 'intent': {'name': intent_request['sessionState']['intent']['name'], 'slots': slots, 'state': 'InProgress' }, 'sessionAttributes': session_attributes, 'originatingRequestId': 'REQUESTID' }, 'sessionId': intent_request['sessionId'], 'messages': [ message ], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } def build_validation_result(isvalid, violated_slot, slot_elicitation_style, message_content): return {'isValid': isvalid, 'violatedSlot': violated_slot, 'slotElicitationStyle': slot_elicitation_style, 'message': {'contentType': 'PlainText', 'content': message_content} } def GetItemInDatabase(postal_code): """ Perform database check for transcribed postal code. This is a no-op check that shows that postal_code can't be found in the database. """ return None def validate_postal_code(intent_request): postal_code = get_slot(intent_request, 'PostalCode') if GetItemInDatabase(postal_code) is None: return build_validation_result( False, 'PostalCode', 'SpellByWord', "Sorry, I can't find your information. " + "To try again, spell out your postal " + "code using words, like a as in apple." ) return {'isValid': True} def check_account(intent_request): """ Performs dialog management and fulfillment for checking an account with a postal code. Besides fulfillment, the implementation for this intent demonstrates the following: 1) Use of elicitSlot in slot validation and re-prompting. 2) Use of sessionAttributes to pass information that can be used to guide a conversation. """ slots = get_slots(intent_request) postal_code = get_slot(intent_request, 'PostalCode') session_attributes = get_session_attributes(intent_request) if intent_request['invocationSource'] == 'DialogCodeHook': # Validate the PostalCode slot. If any aren't valid, # re-elicit for the value. validation_result = validate_postal_code(intent_request) if not validation_result['isValid']: slots[validation_result['violatedSlot']] = None return elicit_slot( session_attributes, intent_request, slots, validation_result['violatedSlot'], validation_result['slotElicitationStyle'], validation_result['message'] ) return close( intent_request, session_attributes, 'Fulfilled', {'contentType': 'PlainText', 'content': 'Thanks' } ) def close(intent_request, session_attributes, fulfillment_state, message): intent_request['sessionState']['intent']['state'] = fulfillment_state return { 'sessionState': { 'sessionAttributes': session_attributes, 'dialogAction': { 'type': 'Close' }, 'intent': intent_request['sessionState']['intent'], 'originatingRequestId': 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' }, 'messages': [ message ], 'sessionId': intent_request['sessionId'], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } # --- Intents --- def dispatch(intent_request): """ Called when the user specifies an intent for this bot. """ intent_name = intent_request['sessionState']['intent']['name'] response = None # Dispatch to your bot's intent handlers if intent_name == 'CheckAccount': response = check_account(intent_request) return response # --- Main handler --- def lambda_handler(event, context): """ Route the incoming request based on the intent. The JSON body of the request is provided in the event slot. """ # By default, treat the user request as coming from # Eastern Standard Time. os.environ['TZ'] = 'America/New_York' time.tzset() logger.debug('event={}'.format(json.dumps(event))) response = dispatch(event) logger.debug("response={}".format(json.dumps(response))) return response