Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
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-letterGaya 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 AWS Lambda format respons untuk Lex V2 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"
}
slotElicitationStyle
Bidang 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.
Contoh kode menggunakan Lambda dan Lex V2
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 AWS Lambda fungsi untuk bot Anda.
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