Nggawe skill stateful kanggo Alice ing fungsi serverless Yandex.Cloud lan Python

Ayo dadi miwiti karo warta. Wingi Yandex.Cloud ngumumake peluncuran layanan komputasi tanpa server Fungsi Yandex Cloud. Iki tegese: sampeyan mung nulis kode layanan sampeyan (contone, aplikasi web utawa chatbot), lan Cloud dhewe nggawe lan njaga mesin virtual ing ngendi mlaku, lan malah niru yen beban mundhak. Ora usah mikir babar pisan, penak banget. Lan pembayaran dadi mung kanggo wektu petungan.

Nanging, sawetara wong bisa uga ora mbayar. Iki minangka pangembang Skills njaba Alice, yaiku, chatbots dibangun ing. Sembarang pangembang bisa nulis, dadi tuan rumah lan ndhaptar katrampilan kasebut, lan wiwit saiki katrampilan ora perlu di-host - mung upload kode menyang awan ing wangun fungsi serverless padha.

Nanging ana sawetara nuansa. Kaping pisanan, kode pet sampeyan mbutuhake sawetara dependensi, lan ora pati penting kanggo nyeret menyang Cloud. Kapindho, sembarang chatbot normal kudu nyimpen kahanan dialog nang endi wae (stateful mulane); carane nindakake ing fungsi serverless cara paling gampang? Katelu, kepiye sampeyan bisa nulis katrampilan cepet lan reged kanggo Alice utawa malah sawetara jinis bot kanthi plot non-nol? Babagan nuansa kasebut, nyatane, artikel kasebut.

Nggawe skill stateful kanggo Alice ing fungsi serverless Yandex.Cloud lan Python

persiapan moral

Kanggo sing ora sabar: Aku ngumpulake dependensi sing dibutuhake karo makefile sadurunge ngunggah fungsi kasebut menyang awan, aku nyimpen kahanan dialog ing Panyimpenan Obyek Yandex (ndhukung API S3), lan aku nggunakake perpustakaan dhewe kanggo ngatur dialog. galih. Akibate, ternyata kuwi skill demo. Lan saiki ayo nganalisa kabeh iki kanthi luwih rinci.

Kanggo sing kurang sabar, sadurunge nyilem crita babagan kerumitan, aku nyaranake miwiti kanthi gampang. Yaiku, nggawe fungsi echobot siji-file, ndhaftar lan tes ing konsol pangembang Dialog; rincian - ing Blog Dialog и dokumentasi awan. Lan mung banjur miwiti.

Yen sampeyan pengin langsung ngrasakake apa sing kita geluti, takon Alice 'nguripake skill "IT horoskop"'. Dialog ing ngisor iki kudu ditindakake:

Alice: Halo! Sampeyan ana ing skill "horoskop IT". Ngomong "Mulai" kanggo ngerteni apa sing dijanjekake lintang.
Panganggo: Mulai
A: Mangga sebutno jeneng sampeyan.
Yu: Waras
A: Saiki kandhanana taun lairmu. Mung papat digit, ora luwih.
Yu : kapindho
A: Coba maneh. Nyatakake taun lair - papat digit.
Yu: 2002
A: Apik! Saiki sebutno wulan kelahiranmu.
Yu : februari
A: Apik! Pungkasan, kandhani tanggal lahir sampeyan - mung nomer, mung siji utawa rong digit.
Yu: 18
A: Matur nuwun Vasily! Saiki kita ngerti: sampeyan umur 17 taun lan sampeyan Aquarius. Kene sampeyan, mesthi, begja! Lintang ngandhani sampeyan а что говорят звёзды, вы узнаете, запустив навык.

Masalahe yaiku kanggo njaga dialog sing prasaja, sampeyan kudu ngelingi jeneng lan tanggal lair pangguna, lan ing lingkungan tanpa server iki ora pati penting. Ora bakal bisa kanggo nyimpen konteks ing RAM utawa minangka file ing disk, amarga Yandex.Cloud bisa mbukak fungsi kasebut ing sawetara mesin virtual bebarengan lan ngalih ing antarane kanthi sewenang-wenang. Sampeyan kudu nggunakake sawetara jinis panyimpenan eksternal. Panyimpenan Obyek dipilih minangka panyimpenan sing cukup murah lan prasaja langsung ing Yandex.Cloud (yaiku, mbokmenawa cepet). Minangka alternatif gratis, sampeyan bisa nyoba, contone, potongan gratis Mendhung Mongi nang endi wae adoh. Loro-lorone Obyek Storage (ndhukung antarmuka S3) lan Mongo duwe pambungkus Python trep.

Masalah liyane yaiku kanggo pindhah menyang Panyimpenan Obyek, MongoDB, lan database utawa nyimpen data liyane, sampeyan butuh sawetara dependensi eksternal sing kudu diunggah menyang Fungsi Yandex bebarengan karo kode fungsi sampeyan. Lan aku seneng nindakake kanthi kepenak. Iku rampung trep (kaya ing heroku), sayangé, iku ora bisa, nanging sampeyan bisa nggawe sawetara comfort dhasar dening nulis script kanggo mbangun lingkungan (nggawe file).

Carane miwiti skill Horoskop

  1. Siapke: pindhah menyang sawetara mesin nganggo Linux. Ing asas, sampeyan bisa uga bisa karo Windows, nanging banjur sampeyan kudu conjure karo Bukak saka makefile. Lan ing kasus apa wae, sampeyan kudu paling ora 3.6 diinstal Python.
  2. Klone saka github conto skill horoskop.
  3. Ndaftar ing Ya.Cloud: https://cloud.yandex.ru
  4. Nggawe dhewe loro ember ing Panyimpenan obyek, nelpon nganggo jeneng apa wae {BUCKET NAME} и tgalice-test-cold-storage (jeneng tengah iki saiki hardcoded menyang main.py tuladha kula). Ember pisanan mung dibutuhake kanggo panyebaran, sing kapindho - kanggo nyimpen negara dialog.
  5. nggawe akun layanan, menehi wong peran editor, lan entuk kredensial statis {KEY ID} и {KEY VALUE} - kita bakal digunakake kanggo ngrekam kahanan dialog. Kabeh iki dibutuhake supaya fungsi saka Ya.Cloud bisa ngakses panyimpenan saka Ya.Cloud. Ing sawijining dina, muga-muga wewenang bakal dadi otomatis, nanging saiki - dadi.
  6. (Opsional) nginstal antarmuka baris printah yc. Sampeyan uga bisa nggawe fungsi liwat antarmuka web, nanging CLI apik amarga kabeh jinis inovasi katon luwih cepet.
  7. Saiki sampeyan bisa, nyatane, nyiyapake perakitan dependensi: mbukak ing baris printah saka folder karo conto skill make all. Sekelompok perpustakaan (biasane, kaya biasane, ora perlu) bakal diinstal ing folder kasebut dist.
  8. Isi karo pena menyang Panyimpenan Obyek (menyang ember {BUCKET NAME}) arsip sing dipikolehi ing langkah sadurunge dist.zip. Yen dikarepake, sampeyan uga bisa nindakake iki saka baris printah, contone, nggunakake AWS CLI.
  9. Nggawe fungsi tanpa server liwat antarmuka web utawa nggunakake sarana yc. Kanggo sarana, printah bakal katon kaya iki:

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

Nalika nggawe fungsi kanthi manual, kabeh paramèter diisi kanthi cara sing padha.

Saiki fungsi sing digawe bisa dites liwat console pangembang, banjur dirampungake lan diterbitake skill.

Nggawe skill stateful kanggo Alice ing fungsi serverless Yandex.Cloud lan Python

Apa ing ngisor hood

Makefile sejatine ngemot skrip sing cukup prasaja kanggo nginstal dependensi lan dilebokake ing arsip. dist.zip, kaya iki:

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 ./*

Liyane iku sawetara alat prasaja sing dibungkus ing perpustakaan tgalice. Proses ngisi data pangguna diterangake dening konfigurasi 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Kelas python njupuk alih karya parsing config iki lan ngitung asil final

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

Luwih tepate, kelas dhasar FormFillingDialogManager melu ngisi "formulir", lan cara kelas anak handle_completed_form ngandhani apa sing kudu ditindakake nalika dheweke siap.

Saliyane aliran utama dialog iki, pangguna uga kudu disambut, uga menehi bantuan ing "pitulung" printah lan release saka skill ing printah "metu". Kanggo iki ing tgalice ana uga cithakan, supaya kabeh manajer dialog digawe saka potongan:

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 dianggo mung: nyoba kanggo aplikasi kanggo kahanan saiki dialog kabeh komponen ing siji, lan milih siji cocog pisanan.

Minangka respon kanggo saben pesen, manajer dialog ngasilake obyek python Response, sing banjur bisa diowahi dadi teks biasa, utawa dadi pesen ing Alice utawa Telegram - gumantung ing ngendi bot mlaku; iku uga ngandhut negara diganti saka dialog sing kudu disimpen. Kabeh pawon iki ditangani dening kelas liyane, DialogConnector, dadi skrip langsung kanggo miwiti katrampilan ing Fungsi Yandex katon kaya iki:

...
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

Nalika sampeyan bisa ndeleng, paling kode iki nggawe sambungan menyang antarmuka Obyek Storage S3. Carane sambungan iki langsung digunakake, sampeyan bisa maca ing kode tgalice.
Baris pungkasan nggawe fungsi alice_handler - sing kita dhawuh kanggo narik Yandex.Cloud nalika nyetel parameter --entrypoint=main.alice_handler.

Sing, nyatane, kabeh. Makefiles kanggo bangunan, S3-kaya Object Storage kanggo panyimpenan konteks, lan perpustakaan python tgalice. Bebarengan karo fitur tanpa server lan ekspresi python, iki cukup kanggo ngembangake katrampilan wong sing sehat.

Sampeyan bisa uga takon kenapa sampeyan kudu nggawe tgalice? Kabeh kode mboseni sing nransfer JSONs saka panjalukan kanggo nanggepi lan saka panyimpenan kanggo memori lan bali dumunung ing. Ana uga aplikasi biasa, fungsi kanggo mangerteni yen "Februari" padha karo "Februari", lan NLU liyane kanggo wong miskin. Miturut gagasanku, iki kudu cukup kanggo bisa nggambar prototipe skill ing file yaml tanpa diganggu karo rincian teknis.

Yen sampeyan pengin NLU luwih serius, sampeyan bisa meneng kanggo skill Rasane utawa DeepPavlov, nanging nyetel munggah bakal mbutuhake nari tambahan karo rebana, utamané ing serverless. Yen sampeyan ora seneng ngodhe, sampeyan kudu nggunakake konstruktor jinis visual Aimylogic. Nalika nggawe tgalice, Aku panginten babagan sawetara jenis path penengah. Ayo ndeleng apa sing kedadeyan.

Nah, saiki melu Aliy skills pangembang chatting, maca dokumentasilan nggawe apik tenan katrampilan!

Source: www.habr.com

Add a comment