Menggunakan gaya ejaan untuk menangkap nilai slot - Amazon Lex

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan gaya ejaan untuk menangkap nilai slot

Amazon Lex V2 menyediakan slot bawaan untuk menangkap informasi khusus pengguna seperti nama depan, nama belakang, alamat email, atau pengidentifikasi alfanumerik. Misalnya, Anda dapat menggunakan AMAZON. LastName Slot untuk menangkap nama keluarga seperti “Jackson” atau “Garcia.” Namun, Amazon Lex V2 mungkin bingung dengan nama keluarga yang sulit diucapkan atau yang tidak umum di lokal, seperti “Xiulan.” Untuk menangkap nama-nama tersebut, Anda dapat meminta pengguna untuk memberikan masukan dalam mantra dengan huruf atau ejaan dengan gaya kata.

Amazon Lex V2 menyediakan tiga gaya elicitation slot untuk Anda gunakan. Ketika Anda menetapkan gaya slot elicitation, perubahan cara Amazon Lex V2 menafsirkan masukan dari pengguna.

Eja demi huruf - Dengan gaya ini, Anda dapat menginstruksikan bot untuk mendengarkan ejaan alih-alih keseluruhan frasa. Misalnya, untuk menangkap nama belakang seperti “Xiulan,” Anda dapat memberitahu pengguna untuk mengeja nama belakang mereka satu huruf pada satu waktu. Bot akan menangkap ejaan dan menyelesaikan huruf ke sebuah kata. Misalnya, jika pengguna mengatakan “x i u l a n,” bot menangkap nama belakang sebagai “xiulan.”

Eja demi kata - Dalam percakapan suara, terutama menggunakan telepon, ada beberapa huruf, seperti “t,” “b,” “p”, yang terdengar mirip. Saat menangkap nilai alfanumerik atau nama ejaan menghasilkan nilai yang salah, Anda dapat meminta pengguna untuk memberikan kata pengidentifikasi bersama dengan huruf tersebut. Misalnya, jika respons suara untuk permintaan ID pemesanan adalah “abp123,” bot Anda mungkin mengenali frasa “ab b 123" sebagai gantinya. Jika ini adalah nilai yang salah, Anda dapat meminta pengguna untuk memberikan masukan sebagai “a seperti dalam alpha b seperti pada anak p seperti pada peter satu dua tiga.” Bot akan menyelesaikan masukan ke “abp123.”

Saat menggunakan ejaan demi kata, Anda dapat menggunakan format berikut:

  • “seperti dalam” (seperti dalam apel)

  • “untuk” (a untuk apel)

  • “seperti” (seperti apel)

Default - Ini adalah gaya alami penangkapan slot menggunakan pengucapan kata. Misalnya, ia dapat menangkap nama-nama seperti “John Stiles” secara alami. Jika gaya elikitasi slot tidak ditentukan, bot menggunakan gaya default. Untuk AMAZON. AlphNumeric dan Amazon.ukPostal jenis slot kode, gaya default mendukung mantra dengan masukan huruf.

Jika nama “Xiulan” diucapkan menggunakan campuran huruf dan kata-kata, seperti “x seperti dalam x-ray i u l seperti pada singa n” gaya Slot elicitation harus diatur ke spell-by-word gaya. spell-by-letter Gaya tidak akan mengenalinya.

Anda harus membuat antarmuka suara yang menangkap nilai slot dengan gaya percakapan alami untuk pengalaman yang lebih baik. Untuk input yang tidak ditangkap dengan benar menggunakan gaya alami, Anda dapat meminta kembali pengguna dan mengatur gaya elikitasi slot ke spell-by-letter atau spell-by-word.

Anda dapat menggunakan spell-by-word dan spell-by-letter gaya untuk jenis slot berikut dalam bahasa Inggris (AS), Inggris (Inggris), dan Inggris (Australia) bahasa:

Mengaktifkan Ejaan

Anda mengaktifkan spell-by-letter dan spell-by-word saat runtime ketika Anda memunculkan slot dari pengguna. Anda dapat mengatur gaya ejaan dengan PutSession,, RecognizeTextRecognizeUtterance, atau StartConversationoperasi. Anda juga dapat mengaktifkan spell-by-letter dan spell-by-word menggunakan fungsi Lambda.

Anda mengatur gaya ejaan menggunakandialogAction bidang status sesi permintaan. Anda hanya dapat mengatur gaya ketika jenis tindakan dialogElicitSlot dan ketika slot yang akan diperoleh adalah salah satu jenis slot yang didukung.

Kode JSON berikut menunjukkandialogAction field set untuk menggunakan spell-by-word style:

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

slotElicitationStyleBidang dapat diatur keSpellByLetter,SpellByWord, atauDefault. Jika Anda tidak menentukan nilai, maka nilai, maka nilai,Default

Kode contoh

Mengubah gaya ejaan biasanya dilakukan jika upaya pertama untuk menyelesaikan nilai slot yang tidak bekerja. Contoh kode berikut adalah fungsi Python Lambda yang menggunakan spell-by-word gaya pada upaya kedua untuk menyelesaikan slot.

Untuk menggunakan kode, Anda harus memiliki:

  • Bot dengan satu bahasa, Bahasa Inggris (GB) (en_GB).

  • Satu maksud, "CheckAccount" dengan satu ucapan sampel, “Saya ingin memeriksa akun saya”. Pastikan bahwa Gunakan fungsi Lambda untuk inisialisasi dan validasi dipilih di bagian Code hook dari definisi maksud.

  • Tujuannya harus memiliki satu slot, "PostalCode“, dari tipePostalCode bawaan AMAZON.UK.

  • Sebuah alias dengan fungsi Lambda didefinisikan. Untuk informasi selengkapnya, lihat Melampirkan fungsi Lambda ke alias bot.

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