Ħolqien ta 'ħila stateful għal Alice fuq il-funzjonijiet serverless ta' Yandex.Cloud u Python

Nibdew bl-aħbarijiet. Il-bieraħ Yandex.Cloud ħabbar it-tnedija ta 'servizz tal-kompjuters mingħajr server Funzjonijiet ta' Yandex Cloud. Dan ifisser: tikteb biss il-kodiċi tas-servizz tiegħek (per eżempju, applikazzjoni tal-web jew chatbot), u l-Cloud innifsu joħloq u jżomm magni virtwali fejn jaħdem, u saħansitra jirreplikahom jekk it-tagħbija tiżdied. M'għandekx għalfejn taħseb xejn, huwa konvenjenti ħafna. U l-ħlas imur biss għall-ħin tal-kalkoli.

Madankollu, xi nies jistgħu ma jħallsu xejn. Dawn huma l-iżviluppaturi Il-ħiliet esterni ta' Alice, jiġifieri, chatbots mibnija fiha. Kwalunkwe żviluppatur jista 'jikteb, jospita u jirreġistra tali ħila, u mil-lum il-ħiliet lanqas biss jeħtieġ li jiġu ospitati - sempliċement ittella' l-kodiċi tagħhom fil-cloud fil-forma l-istess funzjoni serverless.

Iżda hemm ftit sfumaturi. L-ewwelnett, il-kodiċi tal-pet tiegħek jista 'jeħtieġ xi dipendenzi, u mhuwiex trivjali li tkaxkruhom fis-Cloud. It-tieni nett, kwalunkwe chatbot normali jeħtieġ li jaħżen l-istat tad-djalogu x'imkien (stateful għalhekk); kif tagħmel dan b'funzjoni serverless bl-eħfef mod? It-tielet, kif tista 'tikteb ħila ta' malajr u maħmuġin għal Alice jew saħansitra xi tip ta 'bot bi plott mhux żero? Dwar dawn l-isfumaturi, fil-fatt, l-artikolu.

Ħolqien ta 'ħila stateful għal Alice fuq il-funzjonijiet serverless ta' Yandex.Cloud u Python

preparazzjoni morali

Għall-paċenzja: Niġbor id-dipendenzi meħtieġa b'makefile qabel intella' l-funzjoni fis-sħab, naħżen l-istat tad-djalogu f'Yandex Object Storage (tappoġġja l-API S3), u nuża l-librerija tiegħi stess biex timmaniġġja d-djalogu tgalice. Bħala riżultat, jirriżulta bħal ħiliet demo. U issa ejja nanalizzaw dan kollu fi ftit aktar dettall.

Għal dawk kemmxejn inqas paċenzja, qabel ma jgħoddsu fl-istorja tiegħi ta 'kumplessità, nirrakkomanda ħafna li tibda sempliċi. Jiġifieri, oħloq funzjoni echobot ta 'fajl wieħed, irreġistraha u ttestjaha fil-console tal-iżviluppatur Dialog; dettalji - in Blog Djalogi и dokumentazzjoni sħaba. U mbagħad biss tibda.

Jekk trid tħoss minnufih għal xiex qed niġġieldu, staqsi lil Alice'ixgħel il-ħila "Oroskopju tal-IT"'. Għandu jsir id-djalogu li ġej:

Alice: Hello! Inti fil-ħila "Oroskopju IT". Għid "Ibda" biex issir taf x'jwegħdek l-istilel.
Utent: Ibda
A: Jekk jogħġbok għid ismek.
Yu: Vasisuly
A: Issa għidli s-sena tat-twelid tiegħek. Erba 'ċifri biss, xejn aktar.
Yu: it-tieni
A: Jekk jogħġbok erġa' pprova. Iddikjara s-sena tat-twelid tiegħek - erba' ċifri.
Yu: 2002
A: Kbir! Issa semmi x-xahar tat-twelid tiegħek.
Yu: Frar
A: Kbir! Fl-aħħarnett, għidli d-data tat-twelid tiegħek - numru biss, ċifra waħda jew tnejn biss.
Yu: 18
A: Grazzi, Vasisual! Issa nafu: inti għandek 17-il sena u inti Aquarius. Hawnhekk int, ovvjament, xortik tajba! L-istilel jgħidulek а что говорят звёзды, вы узнаете, запустив навык.

Il-problema hija li biex iżżomm anke dialog sempliċi bħal dan, trid tiftakar l-isem u d-data tat-twelid tal-utent, u f'ambjent bla server dan mhux trivjali. Mhux se jaħdem biex jaħżen il-kuntest fir-RAM jew bħala fajl fuq disk, għaliex Yandex.Cloud jista 'jħaddem il-funzjoni fuq diversi magni virtwali fl-istess ħin u jaqleb bejniethom b'mod arbitrarju. Int ser ikollok tuża xi tip ta 'ħażna esterna. Il-Ħażna tal-Oġġetti ntgħażlet bħala ħażna pjuttost irħas u sempliċi direttament f'Yandex.Cloud (jiġifieri, probabbilment veloċi). Bħala alternattiva b'xejn, tista 'tipprova, pereżempju, biċċa b'xejn Imsaħħab Mongi x'imkien 'il bogħod. Kemm il-Ħażna tal-Oġġetti (tappoġġja l-interface S3) kif ukoll Mongo għandhom tgeżwir konvenjenti ta 'Python.

Problema oħra hija li biex tmur għall-Object Storage, MongoDB, u kwalunkwe database jew maħżen tad-dejta oħra, għandek bżonn xi dipendenzi esterni li għandek bżonn ittella 'f'Yandex Functions flimkien mal-kodiċi tal-funzjoni tiegħek. U nixtieq nagħmilha bil-kumdità. Huwa kompletament konvenjenti (bħal fuq heroku), sfortunatament, mhux se jaħdem, iżda tista 'toħloq xi kumdità bażika billi tikteb skript biex tibni l-ambjent (agħmel fajl).

Kif tibda l-ħila tal-oroskopju

  1. Lestu: mur f'xi magna bil-Linux. Fil-prinċipju, inti probabilment tista 'taħdem mal-Windows ukoll, iżda mbagħad trid tqajjem bit-tnedija tal-makefile. U fi kwalunkwe każ, ser ikollok bżonn mill-inqas 3.6 Python installat.
  2. Klonu minn github eżempju ta’ ħila ta’ oroskopju.
  3. Irreġistra fi Ya.Cloud: https://cloud.yandex.ru
  4. Oħloq lilek innifsek żewġ bramel ġewwa Ħażna ta 'Oġġetti, isejħilhom bi kwalunkwe isem {BUCKET NAME} и tgalice-test-cold-storage (dan l-isem tan-nofs issa huwa hardcoded fi main.py l-eżempju tiegħi). L-ewwel barmil se jkun meħtieġ biss għall-iskjerament, it-tieni - għall-ħażna tal-istati tad-djalogu.
  5. joħolqu kont tas-servizz, agħtih rwol editor, u ikseb kredenzjali statiċi għaliha {KEY ID} и {KEY VALUE} - se nużawhom biex nirreġistraw l-istat tad-djalogu. Dan kollu huwa meħtieġ sabiex il-funzjoni minn Ya.Cloud tkun tista' taċċessa l-ħażna minn Ya.Cloud. Xi darba, nittama, l-awtorizzazzjoni ssir awtomatika, iżda għalissa - hekk.
  6. (Mhux obbligatorju) tinstalla interface tal-linja tal-kmand yc. Tista 'wkoll toħloq funzjoni permezz tal-interface tal-web, iżda l-CLI hija tajba għaliex kull xorta ta' innovazzjonijiet jidhru fiha aktar malajr.
  7. Issa tista ', fil-fatt, tipprepara l-assemblaġġ tad-dipendenzi: mexxi fuq il-linja tal-kmand mill-folder bl-eżempju tal-ħiliet make all. Mazz ta 'libreriji (l-aktar, bħas-soltu, mhux meħtieġa) se jiġu installati fil-folder dist.
  8. Imla bil-pinen fil-Ħażna tal-Oġġetti (f'barmil {BUCKET NAME}) l-arkivju miksub fil-pass preċedenti dist.zip. Jekk mixtieq, tista 'wkoll tagħmel dan mil-linja tal-kmand, per eżempju, bl-użu AWS CLI.
  9. Oħloq funzjoni serverless permezz tal-interface tal-web jew bl-użu tal-utilità yc. Għall-utilità, il-kmand se jidher bħal dan:

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

Meta toħloq funzjoni manwalment, il-parametri kollha jimtlew bl-istess mod.

Issa l-funzjoni li ħloqt tista 'tiġi ttestjata permezz tal-console tal-iżviluppatur, u mbagħad is-sengħa finalizzata u ppubblikata.

Ħolqien ta 'ħila stateful għal Alice fuq il-funzjonijiet serverless ta' Yandex.Cloud u Python

X'hemm taħt il-barnuża

Il-makefile fil-fatt fih skript pjuttost sempliċi għall-installazzjoni tad-dipendenzi u t-tqegħid tagħhom f'arkivju. dist.zip, xi ħaġa bħal din:

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

Il-bqija huma ftit għodda sempliċi mgeżwra f'librerija tgalice. Il-proċess tal-mili tad-dejta tal-utent huwa deskritt mill-konfigurazzjoni 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Il-klassi python tieħu f'idejha x-xogħol ta 'parsing din il-konfigurazzjoni u tikkalkula r-riżultat finali

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

B'mod aktar preċiż, il-klassi bażi FormFillingDialogManager hija involuta fil-mili tal-"formola", u l-metodu tal-klassi tat-tfal handle_completed_form tgħid x'għandek tagħmel meta tkun lesta.

Minbarra dan il-fluss ewlieni tad-djalogu tal-utent, huwa wkoll meħtieġ li tissellem lill-utent, kif ukoll toħroġ għajnuna fuq il-kmand "għajnuna" u rilaxx mill-ħila fuq il-kmand "ħruġ". Għal dan in tgalice hemm ukoll mudell, għalhekk il-maniġer tad-djalogu kollu huwa magħmul minn biċċiet:

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 jaħdem sempliċiment: jipprova japplika għall-istat attwali tad-djalogu l-komponenti kollha tiegħu mbagħad, u jagħżel l-ewwel wieħed rilevanti.

Bħala tweġiba għal kull messaġġ, il-maniġer tad-djalogu jirritorna oġġett python Response, li mbagħad jistgħu jiġu kkonvertiti f'test sempliċi, jew f'messaġġ f'Alice jew Telegram - skont fejn ikun qed jaħdem il-bot; fih ukoll l-istat mibdul tad-djalogu li jeħtieġ li jiġi ffrankat. Din il-kċina kollha hija mmaniġġjata minn klassi oħra, DialogConnector, għalhekk l-iskrittura diretta biex tibda ħila fuq il-Funzjonijiet Yandex tidher bħal din:

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

Kif tistgħu taraw, ħafna minn dan il-kodiċi joħloq konnessjoni mal-interface tal-Object Storage S3. Kif din il-konnessjoni tintuża direttament, tista 'taqra fil-kodiċi tgalice.
L-aħħar linja toħloq funzjoni alice_handler - dik li aħna ordnaw biex tiġbed Yandex.Cloud meta aħna waqqafna l-parametru --entrypoint=main.alice_handler.

Dak, fil-fatt, huwa kollox. Makefiles għall-bini, Ħażna ta 'Oġġetti bħal S3 għall-ħażna tal-kuntest, u librerija python tgalice. Flimkien mal-karatteristiċi serverless u l-espressività ta 'python, dan huwa biżżejjed biex tiżviluppa l-ħila ta' persuna b'saħħitha.

Tista' tistaqsi għaliex għandek bżonn toħloq tgalice? Il-kodiċi kollu boring li jittrasferixxi JSONs minn talba għal rispons u mill-ħażna għall-memorja u lura jinsab fih. Hemm ukoll applikazzjoni regolari, funzjoni biex wieħed jifhem li "Frar" huwa simili għal "Frar", u NLU oħra għall-foqra. Skond l-idea tiegħi, dan għandu jkun diġà biżżejjed biex tkun tista 'tfassal prototipi ta' ħiliet f'fajls yaml mingħajr ma tkun distratt wisq minn dettalji tekniċi.

Jekk trid NLU aktar serja, tista' kaminha għall-ħila tiegħek Rasa jew DeepPavlov, iżda t-twaqqif tagħhom se jeħtieġ żfin addizzjonali b'tambourine, speċjalment fuq serverless. Jekk ma tħossx li tikkodifika xejn, għandek tuża l-kostruttur tat-tip viżwali Aimylogic. Meta ħoloq tgalice, ħsibt dwar xi tip ta 'passaġġ intermedju. Ejja naraw x'jiġri.

Well, issa ingħaqad Chat għall-iżviluppatur tal-ħiliet Aliy, aqra dokumentazzjoniu toħloq aqwa ħiliet!

Sors: www.habr.com

Żid kumment