Menangkap nilai slot dengan gaya ejaan - Amazon Lex

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

Menangkap nilai slot dengan gaya ejaan

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 suatu tempat, seperti “Xiulan.” Untuk menangkap nama-nama tersebut, Anda dapat meminta pengguna untuk memberikan masukan dalam ejaan demi huruf atau ejaan dengan gaya kata.

Amazon Lex V2 menyediakan tiga gaya elisitasi slot untuk Anda gunakan. Saat Anda mengatur gaya elisitasi slot, itu mengubah cara Amazon Lex V2 menafsirkan input dari pengguna.

Eja demi huruf — Dengan gaya ini, Anda dapat menginstruksikan bot untuk mendengarkan ejaan alih-alih seluruh frasa. Misalnya, untuk menangkap nama belakang seperti “Xiulan,” Anda dapat memberi tahu 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 serupa. Saat menangkap nilai alfanumerik atau nama ejaan menghasilkan nilai yang salah, Anda dapat meminta pengguna untuk memberikan kata pengenal bersama dengan huruf tersebut. Misalnya, jika respons suara untuk permintaan ID pemesanan adalah “abp123,” bot Anda mungkin akan mengenali frasa “ab b 123" sebagai gantinya. Jika ini adalah nilai yang salah, Anda dapat meminta pengguna untuk memberikan input sebagai “a seperti dalam alfa b seperti pada anak laki-laki p seperti pada peter satu dua tiga.” Bot akan menyelesaikan input ke “abp123.”

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

  • “seperti dalam” (seperti dalam apel)

  • “untuk” (a untuk apel)

  • “suka” (seperti apel)

Default — Ini adalah gaya alami pengambilan slot menggunakan pengucapan kata. Misalnya, ia dapat menangkap nama-nama seperti “John Stiles” secara alami. Jika gaya elicitation slot tidak ditentukan, bot menggunakan gaya default. Untuk jenis slot AMAZON.AlphaNumeric dan AMAZON.UKPostal kode, gaya default mendukung input ejaan demi huruf.

Jika nama “Xiulan” diucapkan menggunakan campuran huruf dan kata-kata, seperti “x as in x-ray i u l as in lion a n” gaya elisitasi slot harus diatur ke gaya. spell-by-word 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 ulang pengguna dan mengatur gaya elisitasi slot ke atau. spell-by-letter 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):

Mengaktifkan ejaan

Anda mengaktifkan spell-by-letter dan spell-by-word saat runtime saat Anda mendapatkan 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 menetapkan gaya ejaan menggunakan dialogAction bidang sessionState bidang dalam permintaan salah satu operasi API yang disebutkan di atas atau saat mengonfigurasi respons Lambda (lihat Mempersiapkan format respons untuk informasi selengkapnya). Anda hanya dapat mengatur gaya ketika tipe tindakan dialog ElicitSlot dan ketika slot yang akan diperoleh adalah salah satu jenis slot yang didukung.

Kode JSON berikut menunjukkan dialogAction bidang yang diatur untuk menggunakan spell-by-word gaya:

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

slotElicitationStyleBidang dapat diatur keSpellByLetter,SpellByWord, atauDefault. Jika Anda tidak menentukan nilai, maka nilainya disetel keDefault.

catatan

Anda tidak dapat mengaktifkan spell-by-letter atau spell-by-word memunculkan gaya melalui konsol.

Kode contoh

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

Untuk menggunakan kode contoh, Anda harus memiliki:

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

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

  • Maksudnya harus memiliki satu slot, "PostalCode“, dari tipe AMAZON.UKPostalCode bawaan.

  • Sebuah alias dengan fungsi Lambda didefinisikan. Untuk informasi selengkapnya, lihat Membuat dan 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