Satu, Dua, Tiga! Chatbot dari Google Sheets menggunakan contoh game PvP untuk Alice


Muncul, Alice memikat pengguna dengan sintesis pidato dan bot obrolan yang berkualitas tinggi secara tak terduga Hari ini, ia diharapkan memiliki keterampilan yang berguna dan permainan yang menarik dengan backend yang dapat mempertimbangkan konteks pengguna dan menerapkan berbagai skenario. Artikel ini membahas penciptaan keterampilan berdasarkan Google Sheets, alat yang akrab bagi banyak orang dengan potensi besar untuk chatbots kecil.

Bermain dengan orang sungguhan bisa lebih menarik daripada bermain dengan karakter virtual, jadi sebagai contoh kita akan mengembangkan game multipemain untuk Alice.

Satu! Dialog


Permainan dimulai dengan aturan. Saya datang dengan ini: masing-masing dari dua pemain pertama menempatkan harta dan perangkap di belakang tiga pintu, dan kemudian membuka pintu salah satu dari lawan. Buka harta - dapatkan koin lawan, buka perangkap - berikan koin kepadanya. Jumlah koin, dari 1 hingga 3, ditentukan oleh pemain itu sendiri. Di belakang pintu yang tersisa adalah kotak Pandora, pembukaan yang Anda dapat menemukan / kehilangan jumlah koin acak. Anda bisa bermain dengan Alice dan melawan pengguna lain.

Antarmuka Alice diselesaikan dalam bentuk dialog, dan semua interaksi game harus diimplementasikan melalui pesan. Pemrosesan setiap pesan oleh server game diwakili oleh langkah-langkah berikut:

  1. mengembalikan konteks pengguna;
  2. interpretasi permintaan dalam konteks yang dipulihkan;
  3. membentuk pesan respons;
  4. Menyimpan konteks pengguna yang diubah.

Pulihkan dan simpan konteks pengguna


Konteks pengguna termasuk statusnya dalam game, termasuk hasil sebelumnya, langkah di dalam skrip dan lawan saat ini, serta nama pengguna dan informasi lain yang diperlukan untuk logika game.

Dalam setiap permintaan, sesuai dengan protokol , Alice melewati ID pengguna. Ini cukup untuk menyimpan dan kemudian mengembalikan konteksnya.

Sebagai gudang data, ambil Google Sheets. Keuntungan objektif dari solusi ini termasuk penggunaan gratis, visibilitas dan kemudahan penggunaan. Editor skrip bawaan memungkinkan Anda untuk mendeskripsikan logika gim dalam Apps Script (berdasarkan JavaScript), merujuk ke tabel API, dan menerbitkannya sebagai aplikasi web.

Setelah membuat tabel dengan header yang diperlukan, Anda bisa pergi ke editor skrip:


Logika gim ini dapat dijelaskan dalam proyek di Apps Script, mengaturnya sebagai kumpulan file gs, dan melanjutkan ke publikasi:


Saat menerbitkan, Anda harus menentukan ketersediaan aplikasi untuk pengguna anonim:


Pada output, Anda akan mendapatkan URL aplikasi web yang diterbitkan. Fungsi doGet () dan doPost () dalam skrip akan memproses permintaan dari tipe yang sesuai untuk menerima dan menyimpan konteks pengguna.

Di bawah ini adalah diagram bekerja dengan tabel API untuk manipulasi data:

//  var sheet = SpreadsheetApp.openById("<id >").getSheetByName("< >"); //  var range = sheet.getRange(< >); //   var values = range.getValues(); //    range.setValues(< >); 

Menafsirkan permintaan dalam konteks yang dipulihkan


Dalam kasus umum, interpretasi yang benar dari permintaan teks membutuhkan penggunaan algoritma NLU yang cerdas. Dan meskipun algoritma tersebut tersedia dalam alat sederhana seperti yang saya jelaskan oleh Aimylogic , dalam hal ini saya memutuskan untuk meninggalkan pemrosesan bahasa alami demi kesederhanaan.

Dalam permainan yang diusulkan, interaksi pemain dengan Alice terbatas pada selusin kemungkinan status dan dapat direduksi menjadi serangkaian niat kecil. Untuk kesederhanaan, saya selalu menawarkan pemain tiga tindakan yang mungkin: kirim "Satu," "Dua," atau "Tiga." Untuk permintaan lain, Alice meminta untuk mengklarifikasi tindakan.

Skenario dalam kasus ini adalah kode Apps Script berikut:

 //     switch(user.state){ case "start": //       switch(utterance){ case β€œ1️⃣ ”: case β€œ2️⃣ ”: case β€œ3️⃣ ”: //     default: //     } break; //    default: //      } 

Untuk pengguna, interaksi yang diselesaikan dengan demikian direpresentasikan sebagai pilihan salah satu dari tiga opsi, yang artinya didefinisikan dengan jelas dalam setiap jawaban Alice. Opsi-opsi itu sendiri diwakili oleh tombol β€œOne”, β€œTwo”, β€œThree”, yang secara signifikan mempercepat gameplay.

Pembuatan pesan respons


Jawaban Alice terdiri dari beberapa bagian, yang masing-masing perlu dibentuk, termasuk:

  • teks untuk ditampilkan di layar;
  • teks untuk sintesis pidato;
  • set tombol petunjuk.

Baru-baru ini, saya merumuskan konsep dialog MUDAH , menjelaskan prinsip-prinsip merancang antarmuka percakapan, termasuk untuk Alice. Format respons Alice memungkinkan prinsip-prinsip ini diterapkan.

Jadi pemisahan teks yang ditampilkan dan diucapkan memungkinkan Anda untuk membuat jawaban lebih singkat dan alami. Anda tidak dapat memaksa Alice untuk mensintesis teks panjang yang sudah dikenal pengguna, serta menggunakan emoji di teks pesan dan nama tombol.

Tombol petunjuk menerapkan prinsip inisiatif: Alice selalu menunjukkan dan menyarankan tindakan yang mungkin untuk melanjutkan dialog. Dalam skenario permainan yang diusulkan, daftar tombol tidak tergantung pada konteks dan ditambahkan ke setiap pesan.

Jadi, kami memiliki Google Table dengan data pengguna yang disimpan dan diambil melalui URL aplikasi web. Aplikasi ini ditulis dalam Apps Script, itu menginterpretasikan tindakan pengguna sesuai dengan konteksnya dan menghasilkan data untuk pesan respons.

Masih terhubung ke Alice ...

Dua! Integrasi


Yandex.Dialogs memungkinkan pengembang untuk menambah keterampilan mereka ke Alice. Menghubungkan keterampilan bermuara pada tiga hal utama:

  • aktivasi;
  • desain;
  • kait web.

Aktivasi dan desain


Untuk aktivasi, penting untuk memilih frasa yang dikenali Alice dengan baik, yang memenuhi persyaratan formal Yandex. Jika ada angka dalam nama aktivasi, secara terpisah periksa aktivasi saat memasukkan dari keyboard dan suara.

Desain keterampilan termasuk nama, deskripsi, ikon, kategori, dll.
Perlu dipertimbangkan bahwa dalam daftar keterampilan dalam katalog hanya ikon dan frasa aktivasi yang ditampilkan, dan pencarian dalam katalog dilakukan terutama sesuai dengan deskripsi.

Mendapatkan kait web


Kait web adalah alamat tempat Alice akan mengirim pesan ke keahlian Anda dan menunggu respons JSON dalam format yang dijelaskan.



Aplikasi web yang dibuat pada Apps Script mengembalikan respons dalam bentuk halaman html secara default, tetapi dengan menggunakan ContentService, ia dapat dipaksa untuk mengembalikan JSON juga:

 return ContentService.createTextOutput(JSON.stringify(<JSON >)) .setMimeType(ContentService.MimeType.JSON); 

Namun, saat menggunakan ContentService, Google mengalihkan permintaan pengguna ke URL sementara, yang Yandex.Dialogs tidak siap untuknya. Oleh karena itu, alamat aplikasi web sebagai pengait web tidak cocok.

Ada layanan gratis yang menawarkan kait web yang cocok untuk Alice, seperti Zenbot . Di Zenbot, untuk game yang diusulkan, Anda dapat menulis skrip pendek yang mengakses aplikasi web Google dan mengembalikan respons bersama dengan tombol. Ngomong-ngomong, dengan cara ini game bisa diintegrasikan tidak hanya dengan Alice, tetapi juga dengan saluran lain.

Di bawah ini adalah contoh skrip yang menyediakan permainan "Satu, Dua, Tiga!" di bot Telegram @RazDvaTriBot:

 <context> <input pattern="$Text"> <var name="Utterance" value="$Text" scope="input"/> <get url="https://script.google.com/macros/s/<id ->/exec" var="Result"> <param name="userId" value="$req_telegram_chat"/> <param name="utterance" value="$Utterance"/> <param name="channel" value="telegram"/> </get> <var name="Answer" value='javascript: $Result.text'/> <output value="$Answer"/> <sample> <item value=""/> <item value=""/> <item value=""/> </sample> </input> </context> 

Untuk fleksibilitas yang lebih besar dalam memproses permintaan, Anda dapat menulis server Anda sendiri menggunakan, misalnya, Google App Engine. Alat ini juga bisa digunakan secara gratis.

Setelah membuat proyek di Google App Engine, antarmuka Cloud Shell memungkinkan Anda untuk menulis kode server pada satu halaman web dan menyebarkannya ke URL form yang diinginkan https: // <project id> .appspot.com, yang akan menjadi alamat hook web.

Operasi server terdiri dari langkah-langkah berikut:

  1. menerima data permintaan dari Alice;
  2. interaksi dengan aplikasi web game;
  3. mengirimkan respons dalam format Alice.

Terima / kirim data Alice


Dari Alice, penting untuk mendapatkan pengidentifikasi sesi, pengguna, pesan, serta teks permintaan. Di bawah ini adalah contoh dalam PHP:

  $data = json_decode(file_get_contents("php://input")); $session_id = $data->session->session_id; $user_id = $data->session->user_id; $utterance = $data->request->original_utterance; $messageId = $data->session->message_id; 

Sebagai jawaban, tombol dan teks petunjuk dikembalikan ke permainan untuk tampilan dan pengucapan:

  $button1 = array('title' => '1️⃣ ', 'hide' => true); $button2 = array('title' => '2️⃣ ', 'hide' => true); $button3 = array('title' => '3️⃣ ', 'hide' => true); $yaButtons = array($button1, $button2, $button3); $yaResponse = array('text' => $text, 'tts' => $tts, 'buttons' => $yaButtons, 'end_session' => false); $yaSession = array('session_id' => $session_id, 'message_id' => $messageId, 'user_id' => $user_id); $yaResult = array('response' => $yaResponse, 'session' => $yaSession, 'version' => '1.0'); echo json_encode($yaResult); 

Tiga! Sinkronkan


Mengirim / menerima data dari aplikasi web membutuhkan waktu, dan Alice ingin memberikan jawaban kepada pengguna, sehingga masalah sinkronisasi mengganggu masalah tersebut.

Biasanya, untuk proyek-proyek besar, Google Sheets tidak cocok sebagai backend untuk keterampilan Alice: waktu respons meningkat dengan sejumlah besar permintaan paralel. Namun demikian, ada rekomendasi untuk mengoptimalkan chatbot, yang memungkinkan untuk membuat proyek kecil layak dalam sistem dialog interaktif real-time.

Timeout protokol sinkron Alice - 1,5 detik per respons. Jika server tidak punya waktu untuk memberikan jawaban selama waktu ini, pengguna melihat pesan sedih dalam semangat "Maaf, <nama dialog> tidak merespons". Sistem tidak menawarkan petunjuk apa pun yang harus dilakukan selanjutnya.

Untuk menghindari situasi seperti itu, Anda dapat dan harus mempercepat layanan, serta melacak dan memproses waktu habis. Operasi yang paling panjang selama pengoperasian skrip game adalah membaca dan menulis data tabel. Oleh karena itu, pertama, jumlah operasi ini harus diminimalkan, dan kedua, diinginkan untuk memparalelkannya.

Baca data tabel cukup sekali. Setelah menjalankan logika, skrip siap untuk memberikan jawaban kepada pengguna segera, sebelum akhir rekaman hasil.

Waktu terbatas harus diizinkan untuk menerima respons - misalnya, 1100 ms:

  $request_params = array( 'userId' => $user_id, 'utterance' => $utterance, 'channel' => 'alice' ); $get_params = http_build_query($request_params); $ctx = stream_context_create(array('http'=> array( 'timeout' => 1.1 ) )); $answer = file_get_contents('https://script.google.com/macros/s/<id ->/exec?'. $get_params, false, $ctx); 

Jika respons diterima oleh permintaan GET tepat waktu, kami dapat mengirimkannya kepada pengguna dan memulai penyimpanan hasil dengan permintaan POST di latar belakang. Jika tidak, kami memberikan pengguna sebuah tulisan rintisan teks dengan tombol untuk melanjutkan, dan mengabaikan hasil skrip sehingga pengguna dapat mengulangi permintaannya dalam konteks saat ini.

  if($answer === FALSE) { $text = ' ,   .'; $tts = ',   .'; } else { $answer = json_decode($answer); $text = $answer->text; $tts = $answer->tts; //   $data2store = $answer->data; $postdata = json_encode(array( 'data' => $data2store )); $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/json', 'content' => $postdata, 'timeout' => 0.1 ) ); $context = stream_context_create($opts); file_get_contents("https://script.google.com/macros/s/<id ->/exec", false, $context); } 


Dalam gim multipemain untuk Alice, tugas sinkronisasi harus diselesaikan antara server gim dan Yandex, dan di antara para pemain. Jika seorang pemain ingin bermain melawan pengguna lain, permainan itu sendiri memilih lawan - dari mereka yang ingin bermain baru-baru ini. Pengguna harus mengkonfirmasi kesediaan mereka untuk bermain satu sama lain agar game dapat dimulai.

Saat ini, keterampilan tidak dapat memulai mengirim pesan ke pengguna Alice. Oleh karena itu, skrip permainan menyediakan untuk memeriksa kesiapan lawan dan menit yang dialokasikan untuk putaran permainan. Jika lawan menunda permainan, pengguna diminta untuk menunggunya: "Tunggu lawan sedikit lagi?" Dengan menyetujui untuk menunggu, pengguna memulai pemeriksaan lain. Jika menit pertandingan berakhir, pertandingan berakhir.

Kesimpulan


Keuntungan Google Sheets sebagai backend untuk bot obrolan, kecuali gratis, mencakup fakta bahwa itu adalah alat debugging selama pengembangan, dan setelah itu menjadi konsol administrator keterampilan dengan semua kelezatan mengedit kolaboratif dari perangkat apa pun. Oleh karena penundaan dalam operasi simultan dari sejumlah besar pengguna.

Saya harap artikel ini membantu penggemar dan pengembang untuk dengan cepat menciptakan keterampilan yang berguna untuk Alice atau saluran lainnya. Game yang diusulkan tersedia di toko keterampilan Yandex.Dialog yang disebut β€œ One, Two, Three! Game multi pemain . "

Bersamaan dengan alat untuk tujuan umum, ada solusi khusus untuk pengembangan bot obrolan. Saya mengundang pembaca untuk mengambil bagian dalam survei kecil tentang layanan yang saya tahu di bidang ini. Daftar ini tidak termasuk semua produk yang ada - Saya akan berterima kasih atas komentar dengan nama dan ulasan singkat jika Anda menggunakan alat lain.

Source: https://habr.com/ru/post/id414213/


All Articles