Menggunakan skor kepercayaan transkripsi suara untuk meningkatkan percakapan dengan bot Lex V2 Anda - Amazon Lex

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

Menggunakan skor kepercayaan transkripsi suara untuk meningkatkan percakapan dengan bot Lex V2 Anda

Saat pengguna membuat ucapan suara, Amazon Lex V2 menggunakan pengenalan suara otomatis (ASR) untuk mentranskripsikan permintaan pengguna sebelum ditafsirkan. Secara default, Amazon Lex V2 menggunakan transkripsi audio yang paling mungkin untuk interpretasi.

Dalam beberapa kasus mungkin ada lebih dari satu kemungkinan transkripsi audio. Misalnya, pengguna mungkin membuat ucapan dengan suara ambigu, seperti “Nama saya John” yang mungkin dipahami sebagai “Nama saya Juan.” Dalam hal ini, Anda dapat menggunakan teknik disambiguasi atau menggabungkan pengetahuan domain Anda dengan skor kepercayaan transkripsi untuk membantu menentukan transkripsi mana dalam daftar transkripsi yang benar.

Amazon Lex V2 menyertakan transkripsi teratas dan hingga dua transkripsi alternatif untuk input pengguna dalam permintaan ke fungsi kait kode Lambda Anda. Setiap transkripsi berisi skor kepercayaan bahwa itu adalah transkripsi yang benar. Setiap transkripsi juga mencakup nilai slot apa pun yang disimpulkan dari input pengguna.

Anda dapat membandingkan skor kepercayaan dari dua transkripsi untuk menentukan apakah ada ambiguitas di antara keduanya. Misalnya, jika satu transkripsi memiliki skor kepercayaan 0,95 dan yang lainnya memiliki skor kepercayaan 0,65, transkripsi pertama mungkin benar dan ambiguitas di antara keduanya rendah. Jika kedua transkripsi memiliki skor kepercayaan 0,75 dan 0,72, ambiguitas di antara keduanya tinggi. Anda mungkin dapat membedakan antara mereka menggunakan pengetahuan domain Anda.

Misalnya, jika nilai slot yang disimpulkan dalam dua transkrip dengan skor kepercayaan 0,75 dan 0,72 adalah “John” dan “Juan”, Anda dapat menanyakan pengguna di database Anda untuk keberadaan nama-nama ini dan menghilangkan salah satu transkripsi. Jika “John” bukan pengguna di database Anda dan “Juan” adalah, Anda dapat menggunakan hook kode dialog untuk mengubah nilai slot yang disimpulkan untuk nama depan menjadi “Juan.”

Skor kepercayaan yang dikembalikan Amazon Lex V2 adalah nilai komparatif. Jangan mengandalkan mereka sebagai skor absolut. Nilai dapat berubah berdasarkan peningkatan Amazon Lex V2.

Skor kepercayaan transkripsi audio hanya tersedia dalam bahasa Inggris (GB) (en_GB) dan Inggris (AS) (en_US). Skor kepercayaan hanya didukung untuk 8 input kHz audio. Skor kepercayaan transkripsi tidak disediakan untuk input audio dari jendela pengujian di konsol Amazon Lex V2 karena menggunakan 16 input kHz audio.

catatan

Sebelum Anda dapat menggunakan skor kepercayaan transkripsi audio dengan bot yang ada, Anda harus membangun kembali bot terlebih dahulu. Versi bot yang ada tidak mendukung skor kepercayaan transkripsi. Anda harus membuat versi baru bot untuk menggunakannya.

Anda dapat menggunakan skor kepercayaan diri untuk beberapa pola desain percakapan:

  • Jika skor kepercayaan tertinggi turun di bawah ambang batas karena lingkungan yang bising atau kualitas sinyal yang buruk, Anda dapat meminta pengguna dengan pertanyaan yang sama untuk menangkap audio berkualitas lebih baik.

  • Jika beberapa transkripsi memiliki skor kepercayaan yang sama untuk nilai slot, seperti “John” dan “Juan,” Anda dapat membandingkan nilai dengan database yang sudah ada sebelumnya untuk menghilangkan input, atau Anda dapat meminta pengguna untuk memilih salah satu dari dua nilai. Misalnya, “katakan 1 untuk Yohanes atau katakan 2 untuk Juan.”

  • Jika logika bisnis Anda memerlukan pengalihan maksud berdasarkan kata kunci tertentu dalam transkrip alternatif dengan skor kepercayaan dekat dengan transkrip teratas, Anda dapat mengubah maksud menggunakan fungsi Lambda kait kode dialog atau menggunakan operasi manajemen sesi. Untuk informasi selengkapnya, lihat Manajemen sesi.

Amazon Lex V2 mengirimkan JSON struktur berikut dengan hingga tiga transkripsi untuk masukan pengguna ke fungsi kait kode Lambda Anda:

"transcriptions": [ { "transcription": "string", "rawTranscription": "string", "transcriptionConfidence": "number", }, "resolvedContext": { "intent": "string" }, "resolvedSlots": { "string": { "shape": "List", "value": { "originalValue": "string", "resolvedValues": [ "string" ] }, "values": [ { "shape": "Scalar", "value": { "originalValue": "string", "resolvedValues": [ "string" ] } }, { "shape": "Scalar", "value": { "originalValue": "string", "resolvedValues": [ "string" ] } } ] } } } ]

JSONStruktur berisi teks transkripsi, maksud yang diselesaikan untuk ucapan, dan nilai untuk slot apa pun yang terdeteksi dalam ucapan. Untuk input pengguna teks, transkripsi berisi transkrip tunggal dengan skor kepercayaan 1.0.

Isi transkrip tergantung pada pergantian percakapan dan maksud yang diakui.

Untuk giliran pertama, elisitasi maksud, Amazon Lex V2 menentukan tiga transkripsi teratas. Untuk transkripsi teratas, ia mengembalikan maksud dan nilai slot yang disimpulkan dalam transkripsi.

Pada belokan berikutnya, elisitasi slot, hasilnya tergantung pada maksud yang disimpulkan untuk masing-masing transkripsi, sebagai berikut.

  • Jika maksud yang disimpulkan untuk transkrip teratas sama dengan giliran sebelumnya dan semua transkrip lainnya memiliki maksud yang sama, maka

    • Semua transkrip berisi nilai slot yang disimpulkan.

       

  • Jika maksud yang disimpulkan untuk transkrip teratas berbeda dari giliran sebelumnya dan semua transkrip lainnya memiliki maksud sebelumnya, maka

    • Transkrip teratas berisi nilai slot yang disimpulkan untuk maksud baru.

    • Transkrip lain memiliki maksud sebelumnya dan nilai slot yang disimpulkan untuk maksud sebelumnya.

       

  • Jika maksud yang disimpulkan untuk transkrip teratas berbeda dari giliran sebelumnya, satu transkrip sama dengan maksud sebelumnya, dan satu transkrip adalah maksud yang berbeda, maka

    • Transkrip teratas berisi maksud baru yang disimpulkan dan nilai slot yang disimpulkan dalam ucapan.

    • Transkrip yang memiliki maksud yang disimpulkan sebelumnya berisi nilai slot yang disimpulkan untuk maksud tersebut.

    • Transkrip dengan maksud yang berbeda tidak memiliki nama maksud yang disimpulkan dan tidak ada nilai slot yang disimpulkan.

       

  • Jika maksud yang disimpulkan untuk transkrip teratas berbeda dari giliran sebelumnya dan semua transkrip lainnya memiliki maksud yang berbeda, maka

    • Transkrip teratas berisi maksud baru yang disimpulkan dan nilai slot yang disimpulkan dalam ucapan.

    • Transkrip lain tidak mengandung maksud yang disimpulkan dan tidak ada nilai slot yang disimpulkan.

       

  • Jika maksud yang disimpulkan untuk dua transkrip teratas adalah sama dan berbeda dari giliran sebelumnya, dan transkrip ketiga adalah maksud yang berbeda, maka

    • Dua transkrip teratas berisi maksud baru yang disimpulkan dan nilai slot yang disimpulkan dalam ucapan.

    • Transkrip ketiga tidak memiliki nama maksud dan tidak ada nilai slot yang diselesaikan.

Manajemen sesi

Untuk mengubah maksud yang digunakan Amazon Lex V2 dalam percakapan dengan pengguna, gunakan respons dari fungsi Lambda kait kode dialog Anda. Atau Anda dapat menggunakan manajemen sesi APIs dalam aplikasi khusus Anda.

Menggunakan fungsi Lambda dengan bot Lex V2 Anda

Saat Anda menggunakan fungsi Lambda, Amazon Lex V2 memanggilnya dengan JSON struktur yang berisi input ke fungsi tersebut. JSONStrukturnya berisi bidang yang disebut transcriptions yang berisi kemungkinan transkripsi yang telah ditentukan Amazon Lex V2 untuk ucapannya. transcriptionsBidang berisi satu hingga tiga kemungkinan transkripsi, masing-masing dengan skor kepercayaan.

Untuk menggunakan intent dari transkripsi alternatif, Anda menentukannya dalam ConfirmIntent atau tindakan ElicitSlot dialog dalam fungsi Lambda Anda. Untuk menggunakan nilai slot dari transkripsi alternatif, tetapkan nilai di intent bidang dalam respons fungsi Lambda Anda. Untuk informasi selengkapnya, lihat Mengintegrasikan sebuah AWS Lambda berfungsi ke bot Anda.

Contoh kode menggunakan Lambda dengan Lex V2

Contoh kode berikut adalah fungsi Lambda Python yang menggunakan transkripsi audio untuk meningkatkan pengalaman percakapan bagi pengguna.

Untuk menggunakan kode contoh, Anda harus memiliki:

  • Bot dengan satu bahasa, baik Inggris (GB) (en_GB) atau Inggris (AS) (en_US).

  • Satu niat, OrderBirthStone. Pastikan bahwa fungsi Use a Lambda untuk inisialisasi dan validasi dipilih di bagian Code hooks dari definisi intent.

  • Maksudnya harus memiliki dua slot, "BirthMonth" dan “Nama,” keduanya jenisAMAZON.AlphaNumeric.

  • Sebuah alias dengan fungsi Lambda didefinisikan. Untuk informasi selengkapnya, lihat Membuat AWS Lambda fungsi untuk bot Anda.

import time import os import logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) # --- Helpers that build all of the responses --- def elicit_slot(session_attributes, intent_request, slots, slot_to_elicit, message): return { 'sessionState': { 'dialogAction': { 'type': 'ElicitSlot', 'slotToElicit': slot_to_elicit }, 'intent': { 'name': intent_request['sessionState']['intent']['name'], 'slots': slots, 'state': 'InProgress' }, 'sessionAttributes': session_attributes, 'originatingRequestId': 'e3ab4d42-fb5f-4cc3-bb78-caaf6fc7cccd' }, 'sessionId': intent_request['sessionId'], 'messages': [message], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } 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': '3ab4d42-fb5f-4cc3-bb78-caaf6fc7cccd' }, 'messages': [message], 'sessionId': intent_request['sessionId'], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } def delegate(intent_request, session_attributes): return { 'sessionState': { 'dialogAction': { 'type': 'Delegate' }, 'intent': intent_request['sessionState']['intent'], 'sessionAttributes': session_attributes, 'originatingRequestId': 'abc' }, 'sessionId': intent_request['sessionId'], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } def get_session_attributes(intent_request): sessionState = intent_request['sessionState'] if 'sessionAttributes' in sessionState: return sessionState['sessionAttributes'] return {} def get_slots(intent_request): return intent_request['sessionState']['intent']['slots'] """ --- Functions that control the behavior of the bot --- """ def order_birth_stone(intent_request): """ Performs dialog management and fulfillment for ordering a birth stone. Beyond fulfillment, the implementation for this intent demonstrates the following: 1) Use of N best transcriptions to re prompt user when confidence for top transcript is below a threshold 2) Overrides resolved slot for birth month from a known fixed list if the top transcript is not accurate. """ transcriptions = intent_request['transcriptions'] if intent_request['invocationSource'] == 'DialogCodeHook': # Disambiguate if there are multiple transcriptions and the top transcription # confidence is below a threshold (0.8 here) if len(transcriptions) > 1 and transcriptions[0]['transcriptionConfidence'] < 0.8: if transcriptions[0]['resolvedSlots'] is not {} and 'Name' in transcriptions[0]['resolvedSlots'] and \ transcriptions[0]['resolvedSlots']['Name'] is not None: return prompt_for_name(intent_request) elif transcriptions[0]['resolvedSlots'] is not {} and 'BirthMonth' in transcriptions[0]['resolvedSlots'] and \ transcriptions[0]['resolvedSlots']['BirthMonth'] is not None: return validate_month(intent_request) return continue_conversation(intent_request) def prompt_for_name(intent_request): """ If the confidence for the name is not high enough, re prompt the user with the recognized names so it can be confirmed. """ resolved_names = [] for transcription in intent_request['transcriptions']: if transcription['resolvedSlots'] is not {} and 'Name' in transcription['resolvedSlots'] and \ transcription['resolvedSlots']['Name'] is not None: resolved_names.append(transcription['resolvedSlots']['Name']['value']['originalValue']) if len(resolved_names) > 1: session_attributes = get_session_attributes(intent_request) slots = get_slots(intent_request) return elicit_slot(session_attributes, intent_request, slots, 'Name', {'contentType': 'PlainText', 'content': 'Sorry, did you say your name is {} ?'.format(" or ".join(resolved_names))}) else: return continue_conversation(intent_request) def validate_month(intent_request): """ Validate month from an expected list, if not valid looks for other transcriptions and to see if the month recognized there has an expected value. If there is, replace with that and if not continue conversation. """ expected_months = ['january', 'february', 'march'] resolved_months = [] for transcription in intent_request['transcriptions']: if transcription['resolvedSlots'] is not {} and 'BirthMonth' in transcription['resolvedSlots'] and \ transcription['resolvedSlots']['BirthMonth'] is not None: resolved_months.append(transcription['resolvedSlots']['BirthMonth']['value']['originalValue']) for resolved_month in resolved_months: if resolved_month in expected_months: intent_request['sessionState']['intent']['slots']['BirthMonth']['resolvedValues'] = [resolved_month] break return continue_conversation(intent_request) def continue_conversation(event): session_attributes = get_session_attributes(event) if event["invocationSource"] == "DialogCodeHook": return delegate(event, session_attributes) # --- Intents --- def dispatch(intent_request): """ Called when the user specifies an intent for this bot. """ logger.debug('dispatch sessionId={}, intentName={}'.format(intent_request['sessionId'], intent_request['sessionState']['intent']['name'])) intent_name = intent_request['sessionState']['intent']['name'] # Dispatch to your bot's intent handlers if intent_name == 'OrderBirthStone': return order_birth_stone(intent_request) raise Exception('Intent with name ' + intent_name + ' not supported') # --- Main handler --- def lambda_handler(event, context): """ Route the incoming request based on intent. The JSON body of the request is provided in the event slot. """ # By default, treat the user request as coming from the America/New_York time zone. os.environ['TZ'] = 'America/New_York' time.tzset() logger.debug('event={}'.format(event)) return dispatch(event)

Menggunakan manajemen sesi API untuk memilih maksud atau nilai slot yang berbeda

Untuk menggunakan intent yang berbeda dari intent saat ini, gunakan operasi. PutSession Misalnya, jika Anda memutuskan bahwa alternatif pertama lebih disukai daripada maksud yang dipilih Amazon Lex V2, Anda dapat menggunakan PutSession operasi untuk mengubah maksud. Dengan begitu maksud berikutnya yang berinteraksi dengan pengguna akan menjadi yang Anda pilih.

Anda juga dapat menggunakan PutSession operasi untuk mengubah nilai slot dalam intent struktur untuk menggunakan nilai dari transkripsi alternatif.

Untuk informasi selengkapnya, lihat Memahami sesi bot Amazon Lex V2.