Ke hana ʻana i kahi mākau kūlana no Alice ma nā hana serverless o Yandex.Cloud a me Python

E hoʻomaka kākou me ka nūhou. I nehinei ua hoʻolaha ʻo Yandex.Cloud i ka hoʻomaka ʻana o kahi lawelawe kikowaena serverless ʻO Yandex Cloud Functions. ʻO ia hoʻi: kākau wale ʻoe i ke code no kāu lawelawe (no ka laʻana, kahi noi pūnaewele a i ʻole chatbot), a ʻo ke Cloud ponoʻī e hana a mālama i nā mīkini virtual kahi e holo ai, a hoʻihoʻi hou iā lākou inā piʻi ka ukana. ʻAʻole pono ʻoe e noʻonoʻo, maʻalahi loa. A no ka manawa helu wale no ka uku.

Eia naʻe, ʻaʻole paha e uku iki kekahi. ʻO kēia nā mea hoʻomohala Nā mākau waho o Alice, ʻo ia hoʻi, nā chatbots i kūkulu ʻia i loko. Hiki i kēlā me kēia mea hoʻomohala ke kākau, hoʻokipa a hoʻopaʻa inoa i ia akamai, a mai kēia lā ʻaʻole pono e hoʻokipa ʻia nā mākau - e hoʻouka wale i kā lākou code i ke ao ma ke ʻano. ka hana serverless like.

Akā aia kekahi mau nuances. ʻO ka mea mua, pono paha kāu code pit i kekahi mau hilinaʻi, a ʻo ka huki ʻana iā lākou i loko o ka Cloud he mea ʻole. ʻO ka lua, pono e mālama i kahi chatbot maʻamau i ke kūlana o ke kamaʻilio ma kahi (stateful no laila); He aha ke ala maʻalahi e hana ai i kēia ma kahi hana serverless? ʻO ke kolu, pehea e hiki ai iā ʻoe ke kākau i kahi mākaukau wikiwiki a me ka lepo no Alice a i ʻole kekahi ʻano bot me kahi ʻāpana ʻole ʻole? ʻO ka ʻatikala e pili ana i kēia mau nuances.

Ke hana ʻana i kahi mākau kūlana no Alice ma nā hana serverless o Yandex.Cloud a me Python

Hoʻomākaukau pono

No ka poʻe hoʻomanawanui: ʻohi au i nā hilinaʻi e pono ai me kahi makefile ma mua o ka hoʻouka ʻana i ka hana i ke ao, mālama au i ke kūlana o ke kamaʻilio ma Yandex Object Storage (kākoʻo ia i ka S3 API), a hoʻohana wau i kaʻu waihona ponoʻī e mālama i ka kamaʻilio. tgalice. I ka hopena huli mai ia he akamai demo. I kēia manawa, e nānā kākou i kēia mau mea a pau.

No ka poʻe i hoʻomanawanui iki, ma mua o ka luʻu ʻana i kaʻu moʻolelo e pili ana i ka paʻakikī, makemake nui wau e hoʻomaka me kahi mea maʻalahi. ʻO ia hoʻi, e hana i kahi hana echobot hoʻokahi faila, hoʻopaʻa inoa a hoʻāʻo iā ia ma ka Dialogs developer console; kikoʻī - in Blog kūkākūkā и Palapala ao. A laila hoʻomaka wale.

Inā makemake ʻoe e ʻike koke i ka mea a mākou e hakakā nei ma ʻaneʻi, e nīnau iā Alice 'hiki i ka "IT horoscope" akamai'. Pono e hana ʻia kahi kūkākūkā e like me kēia:

Alice: Aloha! Aia ʻoe i ka mākau "IT Horoscope". E ʻōlelo "Hoʻomaka" no ka ʻike ʻana i ka mea a nā hōkū e hoʻohiki ai iā ʻoe.
Mea hoʻohana: Hoʻomaka
A: E ʻoluʻolu e haʻi i kou inoa
Yu: Vasisualiy
A: E haʻi mai iaʻu i ka makahiki o kou hānau ʻana. ʻEhā mau huahelu wale nō, ʻaʻohe mea keu.
Yu: lua
A: E ʻoluʻolu e hoʻāʻo hou. E hoʻokomo i ka makahiki o kou hānau ʻana - ʻehā helu.
ʻAe: 2002
A: Nui! E inoa i kou mahina hānau.
Yu: Pepeluali
A: Nui! ʻO ka hope, e haʻi mai iaʻu i kou lā hānau - he helu wale nō, hoʻokahi a ʻelua paha helu.
ʻAe: 18
A: Mahalo iā ʻoe, Vasisualiy! I kēia manawa ua ʻike mākou: he 17 mau makahiki ʻoe a he Aquarius. ʻAe, ʻoiaʻiʻo, laki ʻoe! ʻŌlelo nā hōkū iā ʻoe: а что говорят звёзды, вы узнаете, запустив навык.

ʻO ka pilikia, i mea e mālama ai i kahi kamaʻilio maʻalahi, pono ʻoe e hoʻomanaʻo i ka inoa o ka mea hoʻohana a me ka lā hānau, a i loko o kahi kikowaena hana serverless ʻaʻole ia he mea ʻole. ʻAʻole hiki ke mālama i ka pōʻaiapili ma RAM a i ʻole he faila ma ka disk, no ka mea Hiki iā Yandex.Cloud ke holo i kahi hana ma kekahi mau mīkini virtual i ka manawa like a hoʻololi i waena o lākou ma ka makemake. Pono ʻoe e hoʻohana i kekahi ʻano waihona waho. Ua koho ʻia ʻo Object Storage ma ke ʻano he mea kūʻai maʻalahi a paʻakikī hoʻi ma Yandex.Cloud (ʻo ia hoʻi, wikiwiki paha). Ma keʻano he koho manuahi, hiki iā ʻoe ke hoʻāʻo, no ka laʻana, kahi ʻāpana manuahi Kapua Monga ma kahi mamao aku. Loaʻa nā mea hoʻopili Python kūpono no ka mea mālama ʻelua (e kākoʻo ana i ka interface S3) a me Mongo.

ʻO kekahi pilikia ʻē aʻe ʻo ia ke komo ʻana i ka Object Storage, MongoDB, a me nā waihona ʻikepili ʻē aʻe a i ʻole hale kūʻai ʻikepili, pono ʻoe i kekahi mau hilinaʻi waho e pono e hoʻouka ʻia i nā Hana Yandex me kāu code hana. A makemake wau e hana i kēia me ka maʻalahi. ʻO ka mea pōʻino, ʻaʻole ia e maʻalahi loa (e like me Heroku), akā hiki ke hana ʻia kahi hōʻoluʻolu maʻamau ma ke kākau ʻana i kahi palapala e kūkulu ai i ke kaiapuni (hana faila).

Pehea e hoʻomaka ai i kahi mākau horoscope

  1. E hoʻomākaukau: hele i kekahi mīkini me Linux. Ma ke kumu, hiki paha iā ʻoe ke hana pū me Windows, akā pono ʻoe e hana i kahi kilokilo me ka hoʻomaka ʻana i ka makefile. A i kekahi hihia, pono ʻoe e hoʻokomo iā Python 3.6.
  2. Hoʻopili iā ia mai Github laʻana o ke akamai horoscope.
  3. Kakau ma Y.Cloud: https://cloud.yandex.ru
  4. E hana ʻoe iā ʻoe iho i ʻelua bākeke i loko Pale Pūnaewele, kāhea iā lākou ma kekahi inoa {BUCKET NAME} и tgalice-test-cold-storage (ua hoʻopaʻa inoa ʻia kēia inoa ʻelua main.py koʻu laʻana). Pono ka bākeke mua no ka hoʻolaha ʻana, ʻo ka lua - e mālama i nā ʻōlelo kūkākūkā.
  5. ho okumu i mooolelo lawelawe, hāʻawi iā ia i kuleana editor, a loaʻa nā hōʻoia no ia mea {KEY ID} и {KEY VALUE} - e hoʻohana mākou iā lākou e hoʻopaʻa i ke kūlana o ke kamaʻilio. Pono kēia a pau i hiki i kahi hana mai Ya.Cloud ke komo i ka waihona mai Ya.Cloud. I kekahi lā, manaʻolana wau, e lilo ka ʻae ʻana, akā i kēia manawa ua like ia.
  6. (Ke koho) hoʻokomo laina kauoha yc. Hiki iā ʻoe ke hana i kahi hana ma o ka pūnaewele pūnaewele, akā maikaʻi ka CLI no ka mea ʻoi aku ka wikiwiki o nā ʻano hana hou a pau.
  7. I kēia manawa hiki iā ʻoe ke hoʻomākaukau i ka hui hilinaʻi: holo ma ka laina kauoha mai ka waihona me ka laʻana akamai make all. E hoʻokomo ʻia kahi pūʻulu hale waihona puke (ka hapa nui, e like me ka mea maʻamau, pono ʻole) i loko o ka waihona dist.
  8. E ninini i loko o ka waihona mea me ka lima (i loko o ka bākeke {BUCKET NAME}) waihona i loaʻa ma ka pae mua dist.zip. Inā makemake ʻia, hiki iā ʻoe ke hana i kēia mai ka laina kauoha, no ka laʻana, hoʻohana AWS CLI.
  9. E hana i kahi hana serverless ma o ka pūnaewele pūnaewele a i ʻole ka hoʻohana ʻana i kahi pono yc. No ka pono, e like ke kauoha penei:

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

I ka hana ʻana i kahi hana me ka lima, hoʻopiha ʻia nā ʻāpana āpau ma ke ʻano like.

I kēia manawa hiki ke hoʻāʻo ʻia ka hana āu i hana ai ma o ka console developer, a laila hiki ke hoʻomaikaʻi a paʻi ʻia ke akamai.

Ke hana ʻana i kahi mākau kūlana no Alice ma nā hana serverless o Yandex.Cloud a me Python

He aha ka mea ma lalo o ka puʻu

Loaʻa i ka makefile kahi palapala maʻalahi no ka hoʻokomo ʻana i nā hilinaʻi a hoʻokomo iā lākou i loko o kahi waihona dist.zip, e like me kēia:

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

ʻO ke koena kekahi mau mea hana maʻalahi i wahī ʻia i loko o kahi waihona tgalice. Hōʻike ʻia ke kaʻina hana o ka hoʻopiha ʻana i ka ʻikepili mea hoʻohana e ka 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

ʻO ka hana o ka parsing i kēia config a me ka helu ʻana i ka hopena hope e lawe ʻia e ka papa 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

ʻOi aku ka pololei, ka papa kumu FormFillingDialogManager pili i ka hoʻopiha ʻana i ka "form", a me ke ʻano papa keiki handle_completed_form haʻi iā ia i kāna mea e hana ai ke mākaukau ʻo ia.

Ma waho aʻe o kēia kahe nui o ke kamaʻilio, pono e hoʻokipa ʻia ka mea hoʻohana, a me ka hāʻawi ʻana i ke kōkua me ka hoʻohana ʻana i ke kauoha "kōkua" a hoʻokuʻu ʻia mai ke akamai me ka hoʻohana ʻana i ke kauoha "puka". No keia kumu ma tgalice Aia kekahi laʻana, no laila ua hana ʻia ka luna kūkākūkā holoʻokoʻa i nā ʻāpana:

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 He hana maʻalahi: hoʻāʻo ʻo ia e hoʻopili i kāna mau mea āpau i ke kūlana o kēia manawa o ke kamaʻilio ʻana, a koho i ka mea kūpono mua.

Hoʻihoʻi ka luna kūkākūkā i kahi mea Python ma ke ʻano he pane i kēlā me kēia memo. Response, a laila hiki ke hoʻololi ʻia i ʻōlelo maʻalahi, a i ʻole i kahi leka ma Alice a i ʻole Telegram - ma muli o kahi e holo ai ka bot; aia pū kekahi i ke kūlana hoʻololi o ke kamaʻilio pono e mālama ʻia. Mālama ʻia kēia lumi kuke holoʻokoʻa e kekahi papa ʻē aʻe, DialogConnector, no laila ke ʻano o ka palapala pololei no ka hoʻomaka ʻana i kahi mākaukau ma Yandex Functions e like me kēia:

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

E like me kāu e ʻike ai, hana ka hapa nui o kēia code i kahi pilina i ka S3 interface o Object Storage. Hiki iā ʻoe ke heluhelu pehea e hoʻohana pono ʻia ai kēia pili ma ke code tgalice.
Hoʻokumu ka laina hope i ka hana alice_handler - ʻo ia ka mea a mākou i ʻōlelo ai iā Yandex.Cloud e huki i ka wā e hoʻonoho ai mākou i ka ʻāpana --entrypoint=main.alice_handler.

ʻO ia wale nō, ʻoiaʻiʻo. Makefiles no ka hui, S3-like Object Storage no ka mālama ʻana i ka pōʻaiapili, a me kahi waihona Python tgalice. Hoʻohui ʻia me nā hana serverless a me ka hōʻike ʻana o Python, ua lawa kēia e hoʻomohala i ke akamai kanaka olakino.

E nīnau paha ʻoe i ke kumu i pono ai ka hana ʻana tgalice? ʻO nā code hōʻino a pau e hoʻololi i nā JSON mai ke noi i ka pane a mai ka waiho ʻana i ka hoʻomanaʻo a me ke kua i loko. Aia kekahi palapala noi maʻamau, kahi hana no ka hoʻomaopopo ʻana ua like ʻo "February" me "February", a me nā NLU ʻē aʻe no ka poʻe ʻilihune. Wahi a koʻu manaʻo, ua lawa kēia i hiki iā ʻoe ke kiʻi i nā prototypes o nā mākau i nā faila yaml me ka ʻole o ka hoʻopili ʻia e nā kikoʻī ʻenehana.

Inā makemake ʻoe i kahi NLU koʻikoʻi, hiki iā ʻoe ke hoʻopili iā ia i kāu akamai ʻO Rasa ai ole ia, DeepPavlov, akā, ʻo ka hoʻonohonoho ʻana iā lākou e koi i nā hula hou me kahi pahu pahu, ʻoi aku ma kahi serverless. Inā ʻaʻole ʻoe makemake i ka coding i nā mea āpau, pono ʻoe e hoʻohana i kahi mea hana ʻike like Aimylogic. I ka hana ʻana i ka tgalice, noʻonoʻo wau i kekahi ʻano ala waena. E ʻike kākou i ke ʻano o kēia.

ʻAe, e hui pū i kēia manawa kamaʻilio kamaʻilio alice akamai, heluhelu palapala, a hana kupanaha mākau!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka