Erfassung von Slot-Werten mit Rechtschreibstilen - 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

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, ihn buchstabenweise oder wortweise einzugeben.

Amazon Lex V2 bietet drei Slot-Exicitation-Stile, die Sie verwenden können. Wenn Sie einen Slot-Exlicitation-Stil 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, auf Rechtschreibweisen zu achten, anstatt auf die gesamte Phrase. Um beispielsweise einen Nachnamen wie „Xiulan“ zu erfassen, kannst du den Benutzer anweisen, seinen Nachnamen buchstabenweise buchstabieren zu lassen. 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 nach Wort — In Sprachgesprächen, insbesondere am Telefon, gibt es einige Buchstaben wie „t“, „b“, „p“, die sich ähnlich anhören. Wenn die Erfassung alphanumerischer Werte oder die Schreibweise von Namen zu einem falschen Wert führt, können Sie den Benutzer auffordern, zusammen mit dem Buchstaben ein identifizierendes Wort einzugeben. 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 Junge P wie in Peter eins zwei drei“ einzugeben. Der Bot löst die Eingabe auf „abp123“ auf.

Bei der Verwendung von Wort für Wort können Sie die folgenden Formate verwenden:

  • „wie in“ (a wie bei Apple)

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

  • „wie“ (ein wie ein Apfel)

Standard — Dies ist der natürliche Stil der Slot-Capture, bei der die Aussprache von Wörtern verwendet wird. So können beispielsweise Namen wie „John Stiles“ auf natürliche Weise erfasst werden. Wenn kein Slot-Elicitation-Stil angegeben ist, verwendet der Bot den Standardstil. Für die Slot-Typen AMAZON.AlphaNumeric und AMAZON.UKPostal Code unterstützt der Standardstil die buchstabenweise 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 as in lion a n“, muss der Stil für die Darstellung des Schlitzes auf style gesetzt werden. spell-by-word Der spell-by-letter Stil erkennt es nicht.

Für ein besseres Benutzererlebnis sollten Sie eine Sprachschnittstelle erstellen, die Slot-Werte mit einem natürlichen Konversationsstil erfasst. Bei Eingaben, die mit dem natürlichen Stil nicht korrekt erfasst wurden, können Sie den Benutzer erneut auffordern und den Stil der Slot-Eingabe auf oder setzen. spell-by-letter spell-by-word

Sie können spell-by-word in den Sprachen Englisch (USA), Englisch (Großbritannien) und Englisch (Australien) die folgenden Slot-Typen verwenden: spell-by-letter

Rechtschreibung aktivieren

Sie aktivieren spell-by-letter und zur spell-by-word Laufzeit, wenn Sie dem Benutzer Slots entlocken. Sie können den Rechtschreibstil mit der Operation PutSession, RecognizeTextRecognizeUtterance, oder StartConversationfestlegen. Sie können auch eine Lambda-Funktion aktivieren spell-by-letter und spell-by-word verwenden.

Sie legen den Rechtschreibstil mithilfe des dialogAction Felds in der sessionState Anforderung einer der oben genannten API-Operationen oder bei der Konfiguration der Lambda-Antwort fest (Vorbereitung des Antwortformatsweitere Informationen finden Sie unter). Sie können den Stil nur festlegen, wenn der Aktionstyp des Dialogs ist ElicitSlot und wenn es sich bei dem zu ermittelnden Slot um einen der unterstützten Slot-Typen handelt.

Der folgende JSON-Code zeigt das dialogAction Feld, das für die Verwendung des spell-by-word Stils festgelegt ist:

"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 gesetztDefault.

Anmerkung

Sie können Stile nicht über spell-by-word die Konsole aktivieren spell-by-letter oder aufrufen.

Beispiel-Code

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

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

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

  • Eine Absicht "CheckAccount" mit einer Beispielaussage: „Ich möchte mein Konto überprüfen“. Stellen Sie sicher, dass im Abschnitt Code-Hooks der Absichtsdefinition die Option Lambda-Funktion für Initialisierung und Validierung verwenden ausgewählt ist.

  • Die Absicht sollte einen Slot, "PostalCode„, des AMAZON.UKPostalCode integrierten Typs haben.

  • Ein Alias mit definierter Lambda-Funktion. Weitere Informationen finden Sie unter Eine Lambda-Funktion erstellen und an einen Bot-Alias anhängen.

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