Mari kita mulai dengan beritanya. Kemarin, Yandex.Cloud mengumumkan peluncuran layanan komputasi tanpa server Yandex Cloud Functions . Ini berarti: Anda hanya menulis kode layanan Anda (misalnya, aplikasi web atau chatbot), dan Cloud itu sendiri menciptakan dan memelihara mesin virtual di mana ia dimulai, dan bahkan menggandakannya jika beban meningkat. Tidak perlu berpikir sama sekali, itu sangat nyaman. Dan biaya hanya berlaku selama perhitungan.
Namun, beberapa mungkin tidak membayar sama sekali. Ini adalah pengembang keterampilan eksternal Alice , yaitu, chatbots yang dibangun padanya. Setiap pengembang dapat menulis, menyelenggarakan dan mendaftarkan keterampilan seperti itu, dan mulai hari ini keterampilan tersebut bahkan tidak perlu dihosting - cukup unggah kode mereka ke cloud dalam bentuk fungsi tanpa server .
Namun ada beberapa nuansa. Pertama, kode hewan peliharaan Anda mungkin memerlukan beberapa dependensi, dan menariknya ke Cloud tidak sepele. Kedua, obrolan normal apa pun perlu menyimpan keadaan dialog di suatu tempat (karena itu stateful); bagaimana melakukan ini dalam fungsi tanpa server yang termudah? Ketiga, bagaimana Anda bisa dengan cepat dan kotor menulis keterampilan untuk Alice atau sejenis bot dengan plot yang tidak nol? Tentang nuansa ini, sebenarnya, sebuah artikel.

Pelatihan moral
Untuk yang tidak sabar: Saya mengumpulkan dependensi yang diperlukan dengan make-file sebelum mengunggah fungsi ke cloud, saya menyimpan keadaan dialog di Yandex Object Storage (mendukung S3 API), dan untuk mengelola dialog saya menggunakan perpustakaan tgalice saya sendiri. Hasilnya adalah keterampilan demo. Sekarang mari kita lihat semua ini dengan lebih detail.
Untuk yang sedikit kurang sabar: sebelum memasukkan cerita saya tentang kesulitan, saya sangat menyarankan memulai dengan yang sederhana. Yaitu, buat fungsi sounder gema file tunggal, daftar dan coba di konsol pengembang Dialog; detailnya ada di Cloud Dialog dan blog dokumentasi . Dan baru kemudian untuk melanjutkan.
Jika Anda ingin segera merasakan apa yang kami perjuangkan, minta Alice untuk mengaktifkan skill "IT horoscope. " Dialog berikut harus terjadi:
Alice: Hai! Anda dalam keterampilan Horoskop Aishish. Katakan "Mulai" untuk mencari tahu apa yang dijanjikan bintang-bintang kepada Anda.
Pengguna: Mulai
A: Tolong beri nama Anda.
Yu: Vasisuali
A: Sekarang beri tahu saya tahun kelahiran Anda. Hanya empat angka, tidak lebih.
Yu: kedua
A: Silakan coba lagi. Berapa tahun kelahiran Anda - empat digit.
U: 2002
A: Hebat! Sekarang sebutkan bulan kelahiran Anda.
U: Februari
A: Hebat! Akhirnya, beri tahu saya tanggal kelahiran Anda - hanya satu angka, hanya satu atau dua digit.
U: 18
A: Terima kasih, Vasisuali! Sekarang kita tahu: Anda berusia 17 tahun, dan Anda adalah Aquarius. Di sini Anda, tentu saja, beruntung! Bintang-bintang memberi tahu Anda: , , .
Masalahnya adalah untuk mempertahankan bahkan dialog sederhana seperti itu, Anda harus mengingat nama dan tanggal lahir pengguna, dan dalam lingkungan tanpa server, ini tidak sepele. Simpan konteks dalam RAM atau file pada disk tidak akan berfungsi, karena Yandex.Cloud dapat menjalankan fungsi pada beberapa mesin virtual secara bersamaan dan beralih di antara mereka secara sewenang-wenang. Kami harus menggunakan semacam penyimpanan eksternal. Object Storage dipilih sebagai hak penyimpanan yang agak murah dan tidak rumit di Yandex.Cloud (mis., Mungkin cepat). Sebagai alternatif gratis, Anda dapat mencoba, misalnya, sepotong Monga berawan gratis di suatu tempat yang jauh. Object Storage (keduanya mendukung antarmuka S3) dan Mongo memiliki pembungkus Python yang nyaman.
Masalah lain adalah bahwa untuk berjalan di Object Storage, di MongoDB, dan di database atau data warehouse lainnya, Anda memerlukan beberapa dependensi eksternal yang perlu Anda unggah ke Fungsi Yandex bersama dengan kode fungsi Anda. Dan saya ingin melakukannya dengan nyaman. Sangat nyaman (seperti heroku), sayangnya, itu tidak akan berhasil, tetapi Anda dapat menciptakan kenyamanan dasar dengan menulis skrip untuk membangun lingkungan (make-file).
Cara menjalankan keterampilan horoskop
- Persiapkan diri Anda: pergi ke beberapa mesin Linux. Pada prinsipnya, Anda mungkin dapat bekerja dengan Windows juga, tetapi kemudian Anda harus menyulap peluncuran file-make. Dan bagaimanapun, Anda harus menginstal Python tidak lebih rendah dari 3,6.
- Kloning diri Anda dengan github contoh keterampilan horoskop .
- Daftar di Y. Cloud: https://cloud.yandex.ru
- Buat dua ember untuk Anda sendiri di Object Storage ,
tgalice-test-cold-storage
nama dengan nama apa saja {BUCKET NAME}
dan tgalice-test-cold-storage
(nama kedua ini sekarang hardcoded di main.py
contoh saya). Ember pertama hanya diperlukan untuk penyebaran, yang kedua - untuk menyimpan status dialog. - Buat akun layanan , berikan peran sebagai
editor
, dan dapatkan kartu kredit statis {KEY ID}
dan {KEY VALUE}
- kami akan menggunakannya untuk mencatat status dialog. Semua ini diperlukan agar fungsi dari Y. Cloud dapat mengakses repositori dari Y. Cloud. Suatu hari, saya berharap otorisasi akan menjadi otomatis, tetapi untuk sekarang - jadi. - (Opsional) instal antarmuka baris perintah
yc
. Anda dapat membuat fungsi melalui antarmuka web, tetapi CLI bagus karena semua jenis inovasi muncul lebih cepat. - Sekarang Anda dapat, pada kenyataannya, menyiapkan perakitan ketergantungan: dijalankan pada prompt perintah dari folder dengan contoh
make all
skill. Sekelompok perpustakaan (kebanyakan, seperti biasa, tidak perlu) akan diinstal di folder dist
. - Tuang dalam Penyimpanan Objek (ke dalam
{BUCKET NAME}
) arsip dist.zip
diperoleh pada langkah sebelumnya. Jika diinginkan, Anda dapat melakukan ini dari baris perintah, misalnya, menggunakan AWS CLI . - Buat fungsi tanpa server melalui antarmuka web atau menggunakan utilitas
yc
. Untuk utilitas, perintahnya akan terlihat seperti ini:
yc serverless function version create\ --function-name=horoscope\ --environment=AWS_ACCESS_KEY_ID={KEY ID},AWS_SECRET_ACCESS_KEY={KEY VALUE}\ --runtime=python37\ --package-bucket-name={BUCKET NAME}\ --package-object-name=dist.zip\ --entrypoint=main.alice_handler\ --memory=128M\ --execution-timeout=3s
Saat membuat fungsi secara manual, semua parameter diisi dengan cara yang sama.
Sekarang fungsi yang Anda buat dapat diuji melalui konsol pengembang, dan kemudian memodifikasi dan mempublikasikan keterampilan.

Apa yang ada di bawah tenda
Makefile sebenarnya mengandung skrip yang cukup sederhana untuk menginstal dependensi dan meletakkannya di arsip dist.zip
, sesuatu seperti ini:
mkdir -p dist/ pip3 install -r requirements.txt --target dist/ cp main.py dist/main.py cp form.yaml dist/form.yaml cd dist && zip --exclude '*.pyc' -r ../dist.zip ./*
Sisanya adalah beberapa alat sederhana yang dibungkus di perpustakaan tgalice
. Proses mengisi data pengguna dijelaskan oleh form.yaml form.yaml
:
form_name: 'horoscope_form' start: regexp: '|(|)' suggests: - fields: - name: 'name' question: , . - name: 'year' question: . , . validate_regexp: '^[0-9]{4}$' validate_message: , . - . - name: 'month' question: ! . options: - ... - validate_message: , , . , , . - name: 'day' question: ! , - , . validate_regexp: '[0123]?\d$' validate_message: , . (, ); .
Pekerjaan pada penguraian konfigurasi ini dan menghitung hasil akhir dilakukan oleh kelas python
class CheckableFormFiller(tgalice.dialog_manager.form_filling.FormFillingDialogManager): SIGNS = { '': '', ... } def handle_completed_form(self, form, user_object, ctx): response = tgalice.dialog_manager.base.Response( text=', {}! : {} , {}. \n' ' , , ! : {}'.format( form['fields']['name'], 2019 - int(form['fields']['year']), self.SIGNS[form['fields']['month']], random.choice(FORECASTS), ), user_object=user_object, ) return response
Lebih tepatnya, kelas dasar FormFillingDialogManager
terlibat dalam mengisi "formulir", dan metode kelas anak handle_completed_form
mengatakan apa yang harus dilakukan ketika sudah siap.
Selain alur utama dialog pengguna ini, Anda juga perlu menyapa, serta memberikan bantuan pada perintah "bantuan" dan lepaskan dari keterampilan pada perintah "keluar". tgalice
juga memiliki template untuk ini, sehingga seluruh manajer dialog terdiri dari beberapa bagian:
dm = tgalice.dialog_manager.CascadeDialogManager( tgalice.dialog_manager.GreetAndHelpDialogManager( greeting_message=DEFAULT_MESSAGE, help_message=DEFAULT_MESSAGE, exit_message=' , " " !' ), CheckableFormFiller(`form.yaml`, default_message=DEFAULT_MESSAGE) )
CascadeDialogManager
bekerja dengan sederhana: ia mencoba menerapkan semua komponennya pada kondisi dialog saat ini secara bergantian, dan memilih komponen yang sesuai pertama.
Sebagai jawaban untuk setiap pesan, manajer dialog mengembalikan objek Response
, yang selanjutnya dapat dikonversi menjadi teks kosong, atau menjadi pesan di Alice atau Telegram - tergantung di mana bot diluncurkan; itu juga berisi keadaan dialog yang berubah, yang harus diselamatkan. Kelas lain terlibat dalam semua dapur ini, DialogConnector
, sehingga skrip langsung untuk meluncurkan keterampilan pada Fungsi Yandex terlihat seperti ini:
... session = boto3.session.Session() s3 = session.client( service_name='s3', endpoint_url='https://storage.yandexcloud.net', aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'], aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'], region_name='ru-central1', ) storage = tgalice.session_storage.S3BasedStorage(s3_client=s3, bucket_name='tgalice-test-cold-storage') connector = tgalice.dialog_connector.DialogConnector(dialog_manager=dm, storage=storage) alice_handler = connector.serverless_alice_handler
Seperti yang Anda lihat, sebagian besar kode ini membuat koneksi ke antarmuka Object Storage S3. Cara koneksi ini digunakan secara langsung dapat dibaca dalam kode tgalice .
Baris terakhir membuat fungsi alice_handler
- yang kita pesan Yandex.Cloud untuk menarik ketika kita mengatur --entrypoint=main.alice_handler
.
Faktanya, itu saja. Makefile untuk perakitan, Penyimpanan Objek S3-suka untuk menyimpan konteks, dan perpustakaan python tgalice. Bersama dengan fungsi tanpa server dan ekspresi python, ini cukup untuk mengembangkan keterampilan orang sehat.
Anda mungkin bertanya, mengapa Anda perlu membuat tgalice
? Semua kode membosankan yang mentransfer JSON dari permintaan ke respons dan dari penyimpanan ke memori dan sebaliknya ada di dalamnya. Ada juga aplikasi pengontrol reguler, fungsi untuk memahami seperti apa "Februari" itu seperti "Februari", dan NLU lainnya untuk orang miskin. Menurut ide saya, ini seharusnya sudah cukup sehingga Anda dapat membuat sketsa prototipe keterampilan dalam file yaml tanpa terlalu terganggu oleh detail teknis.
Jika Anda menginginkan NLU yang lebih serius, Anda dapat mengacaukan Rasa atau DeepPavlov sesuai keahlian Anda, tetapi untuk mengonfigurasinya, Anda akan membutuhkan tarian tambahan dengan rebana, terutama di serverless. Jika Anda sama sekali tidak ingin menyandi, Anda harus menggunakan konstruktor visual seperti Aimylogic . Saat membuat tgalice, saya memikirkan semacam jalur perantara. Mari kita lihat apa yang terjadi.
Nah, sekarang bergabunglah dengan obrolan pengembang tentang keahlian mereka , baca dokumentasi , dan ciptakan keterampilan yang luar biasa !