
Industri chatbot sedang booming. Pada awalnya mereka cukup bodoh dan bisa melakukan dialog dengan pengguna, memimpin dan menawarkan jawaban yang mungkin. Kemudian bot menjadi sedikit lebih pintar dan mulai meminta input teks dari pengguna untuk mendapatkan kata kunci dari jawaban. Perkembangan pembelajaran mesin telah menyebabkan munculnya kemampuan untuk berkomunikasi dengan bot juga dalam suara. Namun, sebagian besar solusi tidak jauh dari konstruksi grafik dialog yang sama dan transisi antara node-nya dengan kata kunci.
Baru-baru ini, di Parallels, kami memutuskan untuk mengoptimalkan sejumlah proses internal dan membuat bot untuk kebutuhan kita sendiri sebagai percobaan. Setelah pencarian singkat, kami memutuskan untuk mencoba keberuntungan kami pada proyek open source
RASA . Menurut pengembang sendiri, mereka membuat bot obrolan generasi ketiga. Yaitu, bot ini tidak hanya berkeliling grafik negara, tetapi mampu menyimpan dan menggunakan konteks dialog sebelumnya. Sampai saat ini, ilustrasi terbaik untuk bot obrolan modern terlihat seperti ini:

Yaitu, obrolan bot hanyalah seperangkat aturan terverifikasi untuk berpindah dari satu titik dalam grafik ke titik lainnya. Jika Anda melihat solusi yang ada dari para raksasa pasar, sebenarnya tidak ada yang sangat berbeda dari sekumpulan aturan di sana. Secara kasar, set ini terlihat seperti ini:
Dialog di titik XXX.
Jika pengguna memasukkan penawaran dengan kata-kata ['beli', 'tiket'], lanjutkan ke titik “ASK WHERE”
Jika pengguna memasukkan penawaran dengan kata ['buy', 'cutlet'], lanjutkan ke poin “ASK FROM WHAT”
Segera jelas bahwa itu sampah di sini, jika pengguna memasukkan: "Saya ingin membeli tiket ke Porto," mereka akan tetap bertanya kepadanya, "Ke mana Anda ingin pergi?" Untuk membuat dialog lebih manusiawi, Anda harus menambahkan aturan baru tentang apa yang harus dilakukan jika ada indikasi tempat.
Kemudian tambahkan aturan tentang apa yang harus dilakukan jika ada indikasi tempat dan waktu, dan sebagainya.
Seperangkat aturan ini akan tumbuh cukup cepat, tetapi itu bukan yang terburuk, semua cara yang "benar" dapat dijelaskan, diperbaiki, dan dijilat.
Hal yang paling tidak menyenangkan adalah bahwa seseorang adalah makhluk yang tidak terduga, tidak seperti bot, dan dapat setiap saat mulai bertanya sama sekali berbeda. Artinya, pada saat bot sudah siap memesan tiket, seseorang mungkin bertanya "Ngomong-ngomong, bagaimana dengan cuacanya?" atau "walaupun tidak, saya ingin masuk ke mobil saya, berapa lama jalannya?"
Namun, ia dapat menanyakan hal ini juga pada saat setelah memilih kota, tetapi sebelum memilih waktu keberangkatan atau bahkan memilih tempat di mana ia ingin pergi. Bot, berdasarkan pada mesin negara, akan macet dan pseudopod mekanisnya akan berkedut dengan sedih, dan pengguna akan frustrasi.
Di sini Anda dapat (dan harus) menggunakan pembelajaran mesin. Tetapi kemudian muncul masalah baru: misalnya, jika Anda menggunakan pelatihan penguatan untuk memprediksi transisi ke titik grafik, muncul pertanyaan: di mana mendapatkan data untuk pelatihan ini, dan siapa yang akan menilai kualitas jawaban?
Pengguna tidak mungkin setuju untuk mengajarkan bot Anda, dan, seperti yang diperlihatkan oleh praktik, komunitas pengguna dapat mengajarkan bot sama sekali bukan apa yang Anda inginkan dan apa yang dianggap layak oleh masyarakat. Selain itu, bot pada tahap awal akan merespons sepenuhnya dari tempat, yang akan membuat pengguna gugup dan tidak mengacaukan dukungan tersebut pada prinsipnya.
Setelah menganalisis dan memikirkan semua kekurangan bot yang ada, pengembang RASA mencoba memecahkan masalah sebagai berikut:
- Setiap input dari pengguna melewati “penentuan niat”, yaitu teks yang dimasukkan menggunakan pembelajaran mesin dipetakan ke satu (atau beberapa) niat. Juga, jika perlu, entitas diisolasi dari teks dan ditambahkan ke memori bot.
- Proses ini mirip dengan bot lain, dengan pengecualian model penentuan niat yang digunakan.
- Tindakan bot berikutnya diprediksi menggunakan pembelajaran mesin berdasarkan konteks, yaitu tindakan sebelumnya, niat, dan status memori bot.
- Pada saat yang sama, tidak banyak data yang dibutuhkan untuk pelatihan awal, dan bot dapat memprediksi tindakan apa yang harus dilakukan bahkan tanpa contoh dan aturan khusus.
Pertimbangkan mekanisme kerja secara lebih rinci.
RASA NLU
Mari kita mulai dengan paus pertama tempat bot diletakkan. Ini adalah Pemahaman Bahasa Alami, yang terdiri dari dua bagian utama: penentuan niat dan pengakuan entitas.
Deteksi niatPenentuan niat didasarkan pada algoritma yang dimodifikasi yang disebut
StarSpace dari Facebook, diimplementasikan pada Tensorflow. Dalam hal ini, model representasi kata vektor pra-terlatih tidak digunakan, yang memungkinkan Anda untuk menghindari keterbatasan representasi ini.
Misalnya, menentukan niat dalam algoritma RASA akan bekerja dengan baik untuk bahasa apa pun, serta dengan kata-kata spesifik apa pun yang Anda tentukan dalam contoh pelatihan. Ketika diimplementasikan melalui representasi vektor pra-terlatih seperti GloVe atau word2vec, pelokalan bot dan penerapannya di area yang sangat khusus akan membawa sakit kepala yang cukup.
Algoritma ini bekerja berdasarkan vektorisasi kalimat melalui sekumpulan kata dan perbandingan “kesamaan” mereka. Contoh niat dan niat itu sendiri dikonversi menjadi vektor menggunakan kantong kata-kata dan dimasukkan ke input dari jaringan saraf yang sesuai. Pada output dari jaringan saraf, vektor diperoleh untuk set kata-kata khusus ini (embedding yang sama).
Pelatihan berlangsung sedemikian rupa untuk meminimalkan fungsi kerugian dalam bentuk jumlah jarak berpasangan (baik produk kosinus atau vektor) antara dua vektor yang sama dan yang berbeda k. Dengan demikian, setelah pelatihan, vektor tertentu akan dikaitkan dengan setiap niat.
Setelah menerima input pengguna, proposal tersebut juga dibuat vektor dan dijalankan melalui model yang terlatih. Setelah itu, jarak dari vektor yang dihasilkan ke semua vektor niat dihitung. Hasilnya diberi peringkat, menyoroti niat yang paling mungkin dan memotong nilai-nilai negatif, yaitu, sama sekali berbeda.
Selain roti di atas, pendekatan ini memungkinkan Anda untuk secara otomatis membedakan lebih dari satu niat dari proposal. Misalnya: “Ya, saya mengerti itu. Tapi bagaimana saya bisa pulang sekarang? " Diakui sebagai "intent_confirm + intent_how_to_drive", yang memungkinkan Anda membangun dialog yang lebih manusiawi dengan bot.
Ngomong-ngomong, sebelum pelatihan, Anda dapat membuat kalimat buatan dari contoh dengan mencampur yang sudah ada untuk menambah jumlah contoh pelatihan.
Pengakuan entitas RASA
Bagian kedua dari NLU adalah ekstraksi entitas dari teks. Sebagai contoh, seorang pengguna menulis, "Saya ingin pergi ke restoran Cina dengan dua teman," bot tidak hanya menyoroti niat, tetapi juga data yang sesuai dengannya. Yaitu, isi ingatan Anda bahwa hidangan di restoran harus Cina, dan jumlah pengunjung adalah tiga.
Untuk ini, pendekatan berdasarkan Conditional Random Fields digunakan, yang sudah dijelaskan di suatu tempat di
Habré , jadi saya tidak akan mengulanginya. Mereka yang ingin dapat membaca tentang algoritma ini
di situs web Stanford .
Selain itu, saya perhatikan bahwa Anda dapat memperoleh entitas dari teks berdasarkan templat, teks (misalnya, nama kota), serta terhubung ke layanan Itik Facebook terpisah, yang juga baik untuk menulis tentang suatu hari nanti.
Cerita RASA
Paus biru kedua yang menjadi dasar RASA Core adalah cerita. Esensi umum dari cerita adalah contoh percakapan nyata dengan bot, diformat sebagai reaksi-niat. Berdasarkan kisah-kisah ini, sebuah jaringan saraf berulang (LSTM) dilatih, yang memetakan riwayat pesan sebelumnya ke tindakan yang diinginkan. Ini memungkinkan Anda untuk tidak mengatur grafik dialog secara kaku, serta tidak menentukan semua keadaan dan transisi yang mungkin di antara mereka.
Dengan jumlah contoh yang cukup, jaringan akan cukup memprediksi keadaan selanjutnya untuk transisi, terlepas dari keberadaan contoh tertentu. Sayangnya, jumlah persis cerita untuk ini tidak diketahui, dan yang bisa dipandu adalah frasa para pengembang: "semakin banyak, semakin baik."
Untuk melatih sistem, tidak hanya merekam beberapa dialog yang dibuat di sana, Anda dapat menggunakan pelatihan interaktif.
Ada dua opsi:
1. Buat sejumlah insinyur terlibat dalam percakapan dengan bot, mengoreksi prediksi yang salah, definisi entitas yang salah dan busi dengan memprediksi tindakan pada cerita.
2. Simpan percakapan ke database dan kemudian terus menggunakan insinyur yang terlatih khusus untuk melihat dialog-dialog di mana pengguna tidak bisa menyelesaikan masalahnya, yaitu, beralih ke seseorang, atau bot mengakui ketidakberdayaannya dan tidak bisa menjawab.
Untuk memahami mekanisme cerita, paling mudah untuk menguraikan beberapa contoh sederhana. Katakanlah reservasi meja di restoran, contoh yang disediakan oleh pengembang di bagian contoh kode sumber. Pertama kita akan menentukan niat kita, dan kemudian kita akan membuat beberapa cerita.
Niat dan contoh mereka:
Intent_hello
...
Intent_thanks
- Terima kasih
- Bagus
- Terima kasih
...
Intent_request
Intent_information
Selanjutnya, Anda perlu membuat memori bot, yaitu, menentukan slot di mana apa yang dibutuhkan pengguna akan direkam. Tentukan slotnya:
masakan:
jenis: tidak jenuh
auto_fill: false
num_people:
jenis: tidak jenuh
auto_fill: false
Dan sekarang kita akan menunjukkan contoh (sebagian kecil) untuk niat yang dihilangkan di atas. Tanda kurung dalam contoh adalah data untuk pelatihan Ner_CRF, dalam format [entitas] (nama variabel untuk penyimpanan: apa yang kami simpan).
intent_request_restaurant
- Saya sedang mencari restoran
- bisakah saya mendapatkan makanan [masakan Swedia] untuk [enam orang] (num_people: 6)
- sebuah restoran yang menyajikan makanan [karibia] (masakan)
- id seperti restoran
- Saya sedang mencari restoran yang menyajikan makanan (masakan) Mediterania
intent_information
- [2] (num_people) orang
- untuk [tiga] (num_people: 3) orang
- hanya [satu] (num_people: 1) orang
- bagaimana dengan [oriental asia] (masakan)
- bagaimana dengan makanan (India)
- eh bagaimana dengan jenis makanan [turki] (masakan)
- um [bahasa inggris] (masakan)
Sekarang kita menentukan sejarah jalur utama:
* salam
- utter_greet
* Intent_request
- restaurant_form
- form {"name": "restaurant_form"}
- form {"name": null}
- action_book_restaurant
* terima kasih
- utter_noworries
Itulah bot yang sempurna untuk dunia yang sempurna. Jika pengguna segera menunjukkan semua data yang diperlukan dalam kalimat pertama, maka sebuah tabel akan disediakan. Misalnya, ia menulis, "Aku ingin memesan meja di restoran Spanyol untuk lima orang." Dalam hal ini, num_people akan berusia 5 tahun, dan masakan - Spanyol, yang cukup untuk bot untuk tindakan lebih lanjut pada pemesanan.
Namun, jika Anda melihat contoh, Anda dapat melihat bahwa data tidak selalu hadir dalam jumlah yang diperlukan, dan kadang-kadang tidak sama sekali. Maka muncul dialog non-inti.
Misalkan tidak ada data tentang dapur dalam permintaan, yaitu, sesuatu seperti dialog ini:
Halo
Hai
Saya ingin memesan restoran untuk lima orang
...
Agar itu selesai dengan benar, Anda perlu menentukan riwayat formulir berikut:
* salam
- utter_greet
* Intent_request
- restaurant_form
- form {"name": "restaurant_form"}
- slot {"asked_slot": "num_people"}
- utter_ask_coven
* formulir: informasikan {"masakan": "meksiko"}
- slot {"cuisine": "mexican"}
- form: restaurant_form
...
Dan bagian terbaiknya adalah bahwa jika Anda membuat cerita untuk beberapa dapur, maka, bertemu orang asing, bot akan memprediksi tindakan selanjutnya dengan sendirinya, meskipun itu tidak akan terlalu yakin. Pada saat yang sama, jika Anda membuat cerita yang serupa, tetapi di mana slot "masakan" diisi, dan bukan slot "num_people", maka bot sama sekali tidak peduli dalam urutan apa informasi tentang parameter reservasi tabel akan diberikan.
Ada dua cara untuk menghentikan upaya apa pun untuk mengarahkan bot dari jalan yang benar: untuk mengidentifikasi cerita yang mungkin untuk berbicara "tentang apa-apa", atau untuk semua upaya untuk memulai percakapan seperti itu - untuk menjawab bahwa ada baiknya kembali ke bisnis.
Karena perusahaan kami pada awal perjalanan yang luar biasa ke dunia chatbots, ada kemungkinan bahwa akan ada artikel baru tentang apa yang kami kumpulkan dan apa yang kami lakukan. Tetap disini!
