Saat ini saya sedang mengerjakan chatbot yang menggunakan konfirmasi konfirmasi selama percakapan dengan pengguna saya. Ini digunakan untuk pertanyaan ya/tidak sederhana tetapi sebagian besar pertanyaan ini juga dapat dijawab dengan kalimat yang berbeda misalnya:

"Apakah ini produk yang benar?"

  1. Iya
  2. ya itu
  3. Itu adalah produk yang benar

Ketika saya menggunakan konfirmasi Prompt, dua opsi pertama berfungsi dengan baik, tetapi ketika seseorang mengatakan "Itu adalah produk yang benar", konfirmasi konfirmasi tidak mengenali ini sebagai input yang valid. Saya sudah memeriksa penggunaan validator khusus, tetapi itu tampaknya berguna jika Anda ingin memverifikasi input yang dikenali, tidak banyak cara untuk memperluas input yang dikenali itu sendiri.

Apakah ada cara di mana saya dapat memperluas kemungkinan input yang valid untuk petunjuk ini? Misalnya dengan menggunakan LUIS?

Terima kasih sebelumnya.

1
Jordi 9 Januari 2020, 18:15

2 jawaban

Jawaban Terbaik

Apa yang terjadi dengan bot Anda adalah bahwa pada dasarnya melihat bagian 'ya' dari dua tanggapan pertama pada hal yang sama dan mengabaikan sisa ucapan tanggapan kedua. Alasan mengapa respons ketiga Anda tidak sama adalah karena tidak dimulai dengan 'ya'. Karena itu, Anda memiliki dua opsi:

OPTION 1: Daripada menggunakan 'confirm prompt', Anda dapat menggunakan 'choice prompt'. ChoicePrompt memiliki properti 'sinonim', yang dapat Anda atur saat membuat prompt pilihan Anda:

return await step.prompt(CHOICE_PROMPT, {
    prompt: 'Please enter your mode of transport.',
        choices: ChoiceFactory.toChoices([
            {value:"my vehicle", synonyms:["car", "truck"]}, 
            {value:"public transporation", synonyms:["bus", "shuttle"]}, 
            {value: "slowly", synonyms:["walk", "bicycle"]}],
        )
    })

Seperti yang Anda lihat di sini, ini memungkinkan sedikit ruang gerak untuk apa yang mungkin dimasukkan pengguna.

options

synonym example

OPSI 2: Rute sinonim adalah tujuan yang ingin Anda tuju jika menurut Anda pengguna Anda hanya akan memberikan tanggapan SANGAT TERBATAS pada permintaan chatbot. Jika Anda ingin memperluas pilihan Anda tentang bagaimana pelanggan akan bereaksi terhadap jenis pertanyaan ini, Anda sebenarnya akan memerlukan semacam model bahasa. Seperti yang Anda tanyakan dalam pertanyaan Anda, LUIS akan menjadi pilihan untuk dibuat.

Anda dapat membangun ini dengan membuat komponen pengenal yang berinteraksi dengan LUIS, itu bisa terlihat seperti ini.

export class LuisComponent {
private recognizer: LuisRecognizer;

  constructor(config: LuisApplication) {
    const luisConfig: LuisApplication = {applicationId: "LuisAppId", endpoint: "LuisAPIHostName" , endpointKey: "LuisAPIKey"} 
    this.recognizer = new LuisRecognizer(luisConfig, {}, true)
  };

  public async executeLuisQuery(context: TurnContext): Promise<RecognizerResult> {
    const result = await this.recognizer.recognize(context);
    return result;
  };
}

Ini akan mengirim kueri Anda ke LUIS dan mengembalikan hasil kueri. Satu-satunya hal yang harus Anda lakukan adalah membuat prompt kustom yang menggunakan komponen ini dan mengembalikan hasil dari prompt.

export class ConfirmPrompt extends Prompt<boolean> {

private luis: LuisComponent ;

constructor(id: string, recognizer: LuisComponent ) 
  super(id, validator);
  this.luis = recognizer;
};

protected async onRecognize(context: TurnContext, state: object, options: PromptOptions): Promise<PromptRecognizerResult<boolean>> {

  const luisResult = await this.luis.executeLuisQuery(context);
  const topIntent = LuisRecognizer.topIntent(luisResult);

  let result: PromptRecognizerResult<boolean> = { succeeded: false, value: undefined };

  switch (topIntent) {

    case "Confirm": {
      result.succeeded = true;
      result.value = true;
      break;
    };

    case "No": {
      result.succeeded = true;
      result.value = false;
    };

    default: {
      result.succeeded = false;
    };
  };

  return result;
};

protected async onPrompt(context: TurnContext, state: object, options: 
  PromptOptions, isRetry: boolean): Promise<void> {

    if (isRetry && options.retryPrompt) {
      await context.sendActivity(options.retryPrompt, undefined, InputHints.ExpectingInput);
  } else if (options.prompt) {
      await context.sendActivity(options.prompt, undefined, InputHints.ExpectingInput);
    };
  };
};

Untuk sesuatu yang sederhana seperti konfirmasi, Anda hanya perlu menambahkan opsi yang memungkinkan untuk apa yang mungkin dikatakan orang sebagai konfirmasi. Anda dapat melihat dalam model saya di bawah ini bahwa saya memiliki 5 HALAMAN kemungkinan ucapan untuk apa yang mungkin dikirim sebagai konfirmasi:

testing confirm intent

Maksud khusus ini hanya menggunakan apa yang saya anggap 'frasa stok', jadi pada dasarnya saya menambahkan setiap opsi untuk bagaimana menurut saya pengguna dapat mengonfirmasi sesuatu.

Selain itu (ini di luar cakupan pertanyaan Anda, tetapi informasi yang baik) LUIS dan layanan pemahaman bahasa lainnya juga memungkinkan penggunaan apa yang disebut 'entitas', sehingga Anda dapat menempatkan ucapan sebagian, dan menandai sisanya sebagai entitas, yang memungkinkan untuk beberapa variasi tanggapan dari pengguna. Berikut ini adalah cuplikan layar maksud 'book flight', dari Bot Framework Contoh Bot Inti:

Book Flight Intent from LUIS

Seperti yang Anda lihat, maksud ini memiliki label 'entitas' "Bandara" dan "DateTime", sehingga ucapan lebih lanjut tentang bagaimana seseorang dapat mengatakan 'Pesan penerbangan ke XYZ', tanpa harus khawatir memasukkan SETIAP MUNGKIN bandara di dunia dalam model mereka.

Saat Anda memperluas chatbot Anda, menggunakan layanan pemahaman bahasa seperti LUIS akan memungkinkan Anda untuk memiliki alur percakapan yang lebih alami dengan pelanggan/pengguna Anda. Semoga berhasil di bot Anda!

3
Jordi 14 Januari 2020, 11:32

Saya tidak tahu banyak tentang validator ini karena saya hanya menulis bot di C#, tetapi tebakan saya adalah mereka lebih spesifik, seperti mengonfirmasi bahwa suatu angka adalah bilangan real, misalnya - saya pasti berpikir LUIS akan menjadi cara untuk pergi ke sini .

Jangan lupa bahwa Anda dapat mengembangkan kosakata dari waktu ke waktu dengan sangat mudah di UI LUIS dengan meninjau apa yang dikatakan orang dan memastikannya sesuai dengan maksud yang benar. Sebenarnya, saya menyarankan untuk menyiapkan telemetri di aplikasi Anda, setiap kali tidak dapat mengidentifikasi sesuatu, Anda membuatnya memperingatkan Anda sehingga Anda dapat melatihnya dengan sangat cepat setelah "kegagalan".

Untuk menjelaskan, katakanlah Anda menyertakan 3 contoh yang Anda berikan di atas, tetapi kemudian dalam waktu seminggu pengguna mencoba contoh lain yang tidak pernah Anda pikirkan - Anda akan mendapatkan peringatan dari aplikasi Anda, masuk ke UI LUIS dan berurusan dengan yang baru entri, dan sejak saat itu menjadi bagian dari kosakata, tanpa Anda perlu menerapkan ulang versi aplikasi yang benar-benar baru.

Jadi, singkat cerita, ini lebih cocok untuk LUIS, dan memang untuk itulah dirancang.

0
Hilton Giesenow 9 Januari 2020, 16:24