Kreye yon konpetans Stateful pou Alice sou fonksyon yo san sèvè nan Yandex.Cloud ak Python

Ann kòmanse ak nouvèl la. Yè Yandex.Cloud te anonse lansman yon sèvis informatique san sèvè Fonksyon Cloud Yandex. Sa vle di: ou sèlman ekri kòd la pou sèvis ou a (pa egzanp, yon aplikasyon entènèt oswa yon chatbot), ak Cloud nan tèt li kreye epi kenbe machin yo vityèl kote li kouri, e menm repwodui yo si chaj la ogmante. Ou pa bezwen panse ditou, li trè pratik. Ak peman an se sèlman pou tan an kalkil.

Sepandan, kèk ka pa peye ditou. Sa yo se devlopè yo Konpetans ekstèn Alice, se sa ki, chatbots bati nan li. Nenpòt pwomotè ka ekri, òganize ak enskri tankou yon konpetans, e depi jodi a konpetans yo pa menm bezwen yo dwe anime - jis telechaje kòd yo nan nwaj la nan fòm lan. menm fonksyon san sèvè a.

Men, gen yon koup nan nuans. Premyèman, kòd twou san fon ou a ka mande pou kèk depandans, epi trennen yo nan Cloud la se pa trivial. Dezyèmman, nenpòt chatbot nòmal bezwen estoke eta a nan dyalòg la yon kote (stateful Se poutèt sa); Ki fason ki pi fasil pou fè sa nan yon fonksyon san sèvè? Twazyèmman, ki jan ou ka ekri yon konpetans rapid-ak-sal pou Alice oswa menm kèk kalite bot ak yon konplo ki pa zewo? Atik la se, an reyalite, sou nuans sa yo.

Kreye yon konpetans Stateful pou Alice sou fonksyon yo san sèvè nan Yandex.Cloud ak Python

Preparasyon moral

Pou moun ki enpasyan: Mwen kolekte depandans ki nesesè yo ak yon makefile anvan ou telechaje fonksyon an nan nwaj la, mwen estoke eta a nan dyalòg la nan Yandex Object Storage (li sipòte S3 API a), epi mwen itilize pwòp bibliyotèk mwen pou jere dyalòg la. tgalice. Nan fen a li vire soti sa yo konpetans Demo. Koulye a, kite a gade nan tout sa a nan yon ti kras plis detay.

Pou moun ki yon ti kras mwens enpasyan, anvan yo plonje nan istwa mwen sou konpleksite, mwen trè rekòmande kòmanse ak yon bagay ki senp. Savwa, kreye yon fonksyon echobot sèl-fichye, enskri epi teste li nan konsole pwomotè Dialogs la; detay - nan Blog dyalòg и Dokiman Cloud. Epi sèlman lè sa a kòmanse.

Si ou vle imedyatman santi sa nou ap goumen pou isit la, mande Alice 'pèmèt konpetans "IT horoscope".'. Yon dyalòg ki sanble ak sa ki annapre yo ta dwe fèt:

Alice: bonjou! Ou se nan konpetans "IT Horoscope". Di "Kòmanse" pou w konnen sa zetwal yo pwomèt ou.
Itilizatè: Kòmanse
A: Tanpri bay non ou
Yu: Vasisualiy
A: Koulye a, di m 'lan nan nesans ou. Se sèlman kat chif, pa gen anyen anplis.
Yu: dezyèm
A: Tanpri eseye ankò. Antre ane nesans ou a - kat chif.
Yu: 2002
A: gwo! Koulye a, bay non mwa ou fèt.
Yu: fevriye
A: gwo! Finalman, di m 'dat nesans ou - jis yon nimewo, jis youn oswa de chif.
Yu: 18
A: Mèsi, Vasisualiy! Koulye a, nou konnen: ou gen 17 ane fin vye granmoun ak yon Aquarius. Oke, nan kou, ou gen chans! Zetwal yo di ou: а что говорят звёзды, вы узнаете, запустив навык.

Pwoblèm lan se ke yo nan lòd yo kenbe menm tankou yon dyalòg senp, ou bezwen sonje non itilizatè a ak dat nesans la, ak nan yon anviwònman fonksyon san sèvè sa a se pa trivial. Li pa pral posib pou estoke kontèks la nan RAM oswa kòm yon dosye sou disk, paske Yandex.Cloud ka kouri yon fonksyon sou plizyè machin vityèl an menm tan ak chanje ant yo nan volonte. Ou pral oblije sèvi ak kèk kalite depo ekstèn. Depo objè yo te chwazi kòm yon depo san patipri chè ak san konplike dirèkteman nan Yandex.Cloud (sa vle di, pwobableman vit). Kòm yon altènatif gratis, ou ka eseye, pou egzanp, yon moso gratis Twoub Monga yon kote byen lwen. Gen anvlòp Python pratik pou tou de Depo objè (ki sipòte koòdone S3 la) ak Mongo.

Yon lòt pwoblèm se ke pou jwenn aksè nan depo objè, MongoDB, ak nenpòt lòt baz done oswa magazen done, ou bezwen kèk depandans ekstèn ki bezwen telechaje nan Fonksyon Yandex ansanm ak kòd fonksyon ou. Apre sa, mwen ta renmen fè sa yon pratik. Malerezman, li pa pral konplètman pratik (tankou sou Heroku), men kèk konfò debaz yo ka kreye pa ekri yon script bati anviwònman an (fè dosye).

Ki jan yo lanse yon konpetans horoscope

  1. Prepare: ale nan kèk machin ak Linux. Nan prensip, ou ka pwobableman travay ak Windows tou, men Lè sa a, ou pral oblije fè kèk maji ak lanse makefile la. Ak nan nenpòt ka, w ap bezwen omwen Python 3.6 enstale.
  2. Klone li soti nan Github egzanp sou konpetans horoscope.
  3. Enskri nan Y.Cloud: https://cloud.yandex.ru
  4. Kreye tèt ou de bokit nan Depo objè, rele yo pa nenpòt non {BUCKET NAME} и tgalice-test-cold-storage (se dezyèm non sa a kounye a kode nan main.py egzanp mwen an). Premye bokit la pral bezwen sèlman pou deplwaman, dezyèm lan - nan magazen eta dyalòg.
  5. kreye kont sèvis, ba li yon wòl editor, epi jwenn kalifikasyon estatik pou li {KEY ID} и {KEY VALUE} — nou pral sèvi ak yo pou anrejistre eta dyalòg la. Tout sa nesesè pou yon fonksyon ki soti nan Ya.Cloud ka jwenn aksè nan depo a soti nan Ya.Cloud. Yon jou, mwen espere, otorizasyon ap vin otomatik, men pou kounye a se konsa.
  6. (Si ou vle) enstale koòdone liy lòd yc. Ou kapab tou kreye yon fonksyon atravè koòdone entènèt la, men CLI a bon paske tout kalite inovasyon parèt nan li pi vit.
  7. Koulye a, ou ka aktyèlman prepare asanble depandans la: kouri li sou liy lòd ki soti nan katab la ak egzanp konpetans lan. make all. Yon pakèt bibliyotèk (sitou, kòm dabitid, nesesè) yo pral enstale nan katab la dist.
  8. Vide nan depo objè alamen (nan bokit la {BUCKET NAME}) achiv yo te jwenn nan etap anvan an dist.zip. Si ou vle, ou ka fè sa nan liy lòd la, pou egzanp, lè l sèvi avèk AWS CLI.
  9. Kreye yon fonksyon san sèvè atravè koòdone entènèt la oswa lè l sèvi avèk yon sèvis piblik yc. Pou sèvis piblik la, lòd la pral sanble sa a:

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

Lè w ap kreye yon fonksyon manyèlman, tout paramèt yo ranpli menm jan an.

Koulye a, fonksyon ou te kreye a ka teste atravè konsole pwomotè a, ak Lè sa a, konpetans nan ka amelyore ak pibliye.

Kreye yon konpetans Stateful pou Alice sou fonksyon yo san sèvè nan Yandex.Cloud ak Python

Ki sa ki anba kapo a

Makefile a aktyèlman gen yon script jistis senp pou enstale depandans ak mete yo nan yon achiv dist.zip, apeprè tankou sa a:

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

Rès la se kèk zouti senp ki vlope nan yon bibliyotèk tgalice. Konfigirasyon an dekri pwosesis pou ranpli done itilizatè yo 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Travay la nan analiz sa a konfigirasyon ak kalkile rezilta final la se pran sou pa klas la 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

Plis jisteman, klas de baz la FormFillingDialogManager dil ranpli "fòm nan", ak metòd klas timoun nan handle_completed_form di l sa pou l fè lè li pare.

Anplis de sa a koule prensipal nan dyalòg, itilizatè a dwe akeyi tou, osi byen ke yo bay èd lè l sèvi avèk "èd" kòmandman an ak lage nan konpetans nan lè l sèvi avèk "sòti" kòmandman an. Pou rezon sa a nan tgalice Genyen tou yon modèl, kidonk tout manadjè dyalòg la fèt ak moso:

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 Li travay tou senpleman: li eseye aplike tout eleman li yo nan eta aktyèl la nan dyalòg la nan vire, epi li chwazi premye youn ki apwopriye a.

Manadjè dyalòg la retounen yon objè Python kòm yon repons a chak mesaj. Response, ki ka Lè sa a, konvèti nan tèks klè, oswa nan yon mesaj nan Alice oswa Telegram - tou depann de kote bot la ap kouri; li genyen tou eta a chanje nan dyalòg la ki bezwen sove. Tout kwizin sa a okipe pa yon lòt klas, DialogConnector, kidonk script dirèk la pou lanse yon konpetans sou Fonksyon Yandex sanble sa a:

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

Kòm ou ka wè, pi fò nan kòd sa a kreye yon koneksyon ak koòdone nan S3 nan Depo Objè. Ou ka li ki jan koneksyon sa a dirèkteman itilize nan kòd tgalice.
Dènye liy lan kreye fonksyon an alice_handler - menm youn nan ke nou te di Yandex.Cloud rale lè nou mete paramèt la --entrypoint=main.alice_handler.

Sa a tout, aktyèlman. Makefiles pou asanble, depo objè ki tankou S3 pou estoke kontèks, ak yon bibliyotèk Python tgalice. Konbine ak fonksyon yo san sèvè ak ekspresyon nan Python, sa a se ase yo devlope yon konpetans imen an sante.

Ou ka mande poukisa li te nesesè yo kreye tgalice? Tout kòd la raz ki transfere JSON soti nan demann nan repons ak soti nan depo nan memwa ak tounen manti nan li. Genyen tou yon aplikasyon kòd regilye, yon fonksyon pou konprann ke "fevriye" se menm jan ak "fevriye", ak lòt NLU pou pòv yo. Dapre lide mwen, sa a ta dwe deja ase pou ke ou ka trase pwototip ladrès nan dosye yaml san yo pa twò distrè pa detay teknik.

Si ou vle yon NLU ki pi grav, ou ka tache li ak konpetans ou rasa oswa DeepPavlov, men mete yo kanpe pral mande pou dans adisyonèl ak yon tanbourin, espesyalman sou san sèvè. Si ou pa santi w kode ditou, ou ta dwe itilize yon konstrukteur vizyèl tankou Aimylogic. Lè m kreye tgalice, mwen te panse sou kèk kalite chemen entèmedyè. Ann wè sa k ap vini nan sa a.

Oke, kounye a rantre nan chat pwomotè ladrès alice, li dokimantasyon, epi kreye bèl bagay konpetans!

Sous: www.habr.com

Add nouvo kòmantè