Nyiptakeun kaahlian stateful pikeun Alice dina fungsi tanpa server Yandex.Cloud sareng Python

Hayu urang mimitian ku warta. Kamari Yandex.Cloud ngumumkeun peluncuran layanan komputasi tanpa server Fungsi Awan Yandex. Ieu hartosna: anjeun ngan ukur nyerat kode jasa anjeun (contona, aplikasi wéb atanapi chatbot), sareng Cloud sorangan nyiptakeun sareng ngajaga mesin virtual dimana éta jalan, sareng malah ngulang deui upami bebanna ningkat. Teu kudu mikir pisan, genah pisan. Jeung pangmayaran mana ngan keur waktu itungan.

Sanajan kitu, sababaraha urang bisa jadi teu mayar pisan. Ieu mangrupikeun pamekar kaahlian éksternal Alice urang, nyaeta, chatbots diwangun kana eta. Sakur pamekar tiasa nyerat, host sareng ngadaptarkeun kaahlian sapertos kitu, sareng ti ayeuna kaahlian henteu kedah di-host - ngan ukur unggah kodena kana awan dina bentuk. fungsi serverless sarua.

Tapi aya sababaraha nuances. Anu mimiti, kodeu piaraan anjeun tiasa meryogikeun sababaraha katergantungan, sareng henteu penting pikeun nyered kana Awan. Bréh, sagala chatbot normal perlu nyimpen kaayaan dialog wae (stateful kituna); kumaha ngalakukeun eta dina fungsi serverless cara panggampangna? Katilu, kumaha anjeun tiasa nyerat kaahlian gancang-na-kotor pikeun Alice atanapi malah sababaraha jinis bot kalayan plot anu henteu nol? Ngeunaan nuances ieu, kanyataanna, artikel.

Nyiptakeun kaahlian stateful pikeun Alice dina fungsi tanpa server Yandex.Cloud sareng Python

persiapan moral

Pikeun teu sabar: Kuring ngumpulkeun kagumantungan diperlukeun ku makefile a saméméh unggah fungsi ka awan, abdi nyimpen kaayaan dialog dina Yandex Objék Panyimpenan (eta ngarojong S3 API), sarta kuring make perpustakaan sorangan pikeun ngatur dialog. tgalice. Hasilna, tétéla a saperti kaahlian demo. Sareng ayeuna hayu urang nganalisis sadayana ieu sacara langkung rinci.

Pikeun anu rada teu sabar, sateuacan nyilem kana carita pajeulitna kuring, kuring nyarankeun pisan ngamimitian anu sederhana. Nyaéta, nyiptakeun fungsi echobot-file tunggal, ngadaptar sareng uji dina konsol pamekar Dialog; rinci - di Dialog Blog и dokuméntasi awan. Sarta ngan lajeng ngamimitian.

Upami anjeun hoyong langsung ngaraosan naon anu urang perjuangkeun, tanyakeun ka Alice 'Hurungkeun kaahlian "IT horoscope"'. Dialog di handap ieu kedah lumangsung:

Alice: Halo! Anjeun dina kaahlian "IT horoscope". Ucapkeun "Mimitian" pikeun manggihan naon béntang janji anjeun.
Pamaké: Mimitian
A: Mangga sebutkeun ngaran anjeun.
Yu: Vasisually
A: Ayeuna ngabejaan kuring taun kalahiran anjeun. Ngan opat digit, euweuh deui.
Yu: kadua
A: Mangga cobian deui. Sebutkeun taun kalahiran anjeun - opat digit.
Yu: 2002
A: Hebat! Ayeuna sebutkeun bulan kalahiran anjeun.
Yu: Pébruari
A: Hebat! Tungtungna, wartosan abdi tanggal lahir anjeun - ngan hiji angka, ngan hiji atawa dua digit.
Yu: 18
A: Hatur nuhun, Vasisual! Ayeuna urang terang: anjeun yuswa 17 taun sareng anjeun Aquarius. Di dieu anjeun, tangtosna, untung! béntang ngabejaan Anjeun а что говорят звёзды, вы узнаете, запустив навык.

Masalahna nyaéta pikeun ngajaga dialog saderhana sapertos kitu, anjeun kedah émut nami sareng tanggal kalahiran pangguna, sareng dina lingkungan anu teu aya server ieu sanés trivial. Éta moal tiasa dianggo pikeun nyimpen kontéks dina RAM atanapi salaku file dina disk, sabab Yandex.Cloud tiasa ngajalankeun fungsi dina sababaraha mesin virtual dina waktos anu sami sareng ngalih antara aranjeunna sacara wenang. Anjeun kedah nganggo sababaraha jinis panyimpenan éksternal. Panyimpenan Obyék dipilih salaku panyimpen anu cukup murah sareng sederhana langsung dina Yandex.Cloud (nyaéta, sigana gancang). Salaku alternatif gratis, anjeun tiasa nyobian, contona, potongan gratis Mendung Mongi tempat nu jauh. Duanana Objék Panyimpenan (eta ngarojong panganteur S3) sarta Mongo gaduh wrappers Python merenah.

Masalah anu sanés nyaéta pikeun ngalih ka Panyimpenan Objék, MongoDB, sareng databés atanapi toko data anu sanés, anjeun peryogi sababaraha katergantungan éksternal anu anjeun kedah unggah kana Fungsi Yandex sareng kode fungsi anjeun. Jeung Abdi hoyong ngalakukeun eta comfortably. Ieu sagemblengna merenah (kawas on heroku), Alas, éta moal jalan, tapi anjeun bisa nyieun sababaraha kanyamanan dasar ku nulis naskah pikeun ngawangun lingkungan (nyieun file).

Kumaha ngamimitian kaahlian mastaka

  1. Siap: buka sababaraha mesin sareng Linux. Sacara prinsip, anjeun ogé tiasa damel sareng Windows, tapi teras anjeun kedah conjure sareng peluncuran makefile. Sareng dina sagala hal, anjeun peryogi sahenteuna 3.6 dipasang Python.
  2. Klon ti github conto kaahlian horoskop.
  3. Ngadaptar di Ya.Cloud: https://cloud.yandex.ru
  4. Jieun sorangan dua ember di obyek Panyimpenan, nelepon aranjeunna ku naon ngaran {BUCKET NAME} и tgalice-test-cold-storage (ngaran tengah ieu ayeuna hardcoded kana main.py conto abdi). Ember kahiji bakal diperlukeun ngan pikeun deployment, kadua - pikeun nyimpen kaayaan dialog.
  5. nyiptakeun akun jasa, masihan anjeunna peran editor, sareng kéngingkeun kredensial statik pikeun éta {KEY ID} и {KEY VALUE} - kami bakal ngagunakeun éta pikeun ngarékam kaayaan dialog. Sadaya ieu diperyogikeun supados fungsi tina Ya.Cloud tiasa ngaksés panyimpenan tina Ya.Cloud. Someday, abdi miharep, otorisasina bakal otomatis, tapi pikeun ayeuna - kitu.
  6. (Pilihan) masang panganteur garis paréntah yc. Anjeun oge bisa nyieun hiji fungsi ngaliwatan panganteur web, tapi CLI téh alus sabab sagala sorts inovasi muncul dina eta leuwih gancang.
  7. Ayeuna anjeun tiasa, dina kanyataanana, nyiapkeun assembly of kagumantungan: ngajalankeun on garis paréntah tina folder jeung conto skill make all. Sakumpulan perpustakaan (lolobana, sapertos biasa, teu perlu) bakal dipasang dina polder dist.
  8. Eusian pulpén kana Panyimpenan Obyék (kana ember {BUCKET NAME}) arsip diala dina hambalan saméméhna dist.zip. Upami hoyong, anjeun ogé tiasa ngalakukeun ieu tina garis paréntah, contona, nganggo AWS CLI.
  9. Jieun pungsi tanpa server liwat antarmuka wéb atanapi nganggo utilitas yc. Pikeun utilitas, paréntahna bakal katingali sapertos kieu:

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 sacara manual nyiptakeun fungsi, sadaya parameter dieusi ku cara anu sami.

Ayeuna fungsi nu Anjeun jieun bisa diuji ngaliwatan konsol pamekar, lajeng skill finalized sarta diterbitkeun.

Nyiptakeun kaahlian stateful pikeun Alice dina fungsi tanpa server Yandex.Cloud sareng Python

Naon anu aya di handapeun tiung

Makefile sabenerna ngandung skrip anu cukup basajan pikeun masang dependensi sareng nempatkeun kana arsip. dist.zip, sapertos kieu:

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

Sésana nyaéta sababaraha alat basajan anu dibungkus dina perpustakaan tgalice. Prosés ngeusian data pamaké digambarkeun ku config 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 nyokot alih karya parsing config ieu sareng ngitung hasil ahir

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

Leuwih tepat, kelas dasar FormFillingDialogManager geus kalibet dina ngeusian kaluar "formulir", jeung métode kelas anak handle_completed_form ngabejaan naon nu kudu lamun manehna geus siap.

Salian aliran utama dialog ieu, pamaké ogé kudu dipapag, kitu ogé méré pitulung dina "pitulung" paréntah sarta ngaleupaskeun tina skill dina paréntah "kaluar". Pikeun ieu di tgalice Aya ogé template, jadi sakabeh manajer dialog diwangun ku 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 jalan saukur: eta nyoba nerapkeun ka kaayaan kiwari dialog sakabeh komponen na dina gilirannana, tur pilih hiji relevan munggaran.

Salaku respon kana unggal pesen, manajer dialog mulih hiji objek python Response, anu teras tiasa dirobih kana téks polos, atanapi janten pesen dina Alice atanapi Telegram - gumantung kana dimana bot dijalankeun; eta oge ngandung kaayaan robah tina dialog nu kudu disimpen. Sadaya dapur ieu diurus ku kelas anu sanés, DialogConnector, janten naskah langsung pikeun ngamimitian kaahlian dina Fungsi Yandex sapertos kieu:

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

Sakumaha anjeun tiasa tingali, lolobana kode ieu nyieun sambungan kana panganteur Objék Panyimpenan S3. Kumaha sambungan ieu langsung dipaké, anjeun bisa maca dina kode tgalice.
Baris panungtungan nyiptakeun fungsi alice_handler - hiji anu kami maréntahkeun pikeun narik Yandex.Cloud nalika kami nyetél parameter --entrypoint=main.alice_handler.

Éta, kanyataanna, sadayana. Makefiles pikeun wangunan, S3-kawas Objék Panyimpenan pikeun neundeun konteks, sarta perpustakaan python tgalice. Kalayan fitur tanpa server sareng ekspresi python, ieu cekap pikeun ngembangkeun kamampuan jalma anu séhat.

Anjeun tiasa naroskeun naha anjeun kedah nyiptakeun tgalice? Sadaya kode pikaboseneun anu mindahkeun JSON tina pamundut ka réspon sareng tina panyimpenan ka mémori sareng tonggong aya di dinya. Aya ogé aplikasi biasa, fungsi pikeun ngarti yén "Pébruari" sami sareng "Pébruari", sareng NLU sanés pikeun jalma miskin. Numutkeun pamendak abdi, ieu kedah cekap pikeun tiasa ngagambar prototipe kaahlian dina file yaml tanpa kaganggu ku detil téknis.

Upami anjeun hoyong NLU langkung serius, anjeun tiasa screw ka skill Anjeun rasa atawa DeepPavlov, Tapi netepkeun aranjeunna bakal merlukeun tarian tambahan kalayan rebana, utamana dina serverless. Upami anjeun henteu resep coding, anjeun kedah nganggo konstruktor jinis visual Aimylogic. Nalika nyieun tgalice, Kuring mikir ngeunaan sababaraha jenis jalur panengah. Hayu urang tingali naon kajadian.

Muhun, ayeuna gabung Aliy kaahlian pamekar obrolan, maca dokuméntasijeung nyieun endah pisan kaahlian!

sumber: www.habr.com

Tambahkeun komentar