Kuunda ujuzi wa hali ya juu kwa Alice kwenye kazi zisizo na seva za Yandex.Cloud na Python

Tuanze na habari. Jana Yandex.Cloud ilitangaza uzinduzi wa huduma ya kompyuta isiyo na seva Kazi za Wingu la Yandex. Hii inamaanisha: unaandika tu msimbo wa huduma yako (kwa mfano, programu ya wavuti au chatbot), na Wingu yenyewe huunda na kudumisha mashine pepe inapotumika, na hata kuziiga ikiwa mzigo unaongezeka. Huna haja ya kufikiri kabisa, ni rahisi sana. Na malipo ni kwa wakati wa hesabu tu.

Walakini, wengine wanaweza wasilipe kabisa. Hawa ndio watengenezaji Ujuzi wa nje wa Alice, yaani, chatbots zilizojengwa ndani yake. Msanidi programu yeyote anaweza kuandika, kukaribisha na kusajili ujuzi kama huo, na kuanzia leo ujuzi hauhitaji hata kupangishwa - pakia tu msimbo wao kwenye wingu katika fomu. kazi sawa isiyo na seva.

Lakini kuna nuances kadhaa. Kwanza, msimbo wako wa shimo unaweza kuhitaji utegemezi fulani, na kuwaburuta kwenye Wingu sio jambo dogo. Pili, chatbot yoyote ya kawaida inahitaji kuhifadhi hali ya mazungumzo mahali fulani (ya hali ya juu kwa hivyo); Ni ipi njia rahisi zaidi ya kufanya hivyo katika kazi isiyo na seva? Tatu, unawezaje kuandika ujuzi wa haraka-na-chafu kwa Alice au hata aina fulani ya bot na njama isiyo ya sifuri? Nakala hiyo ni, kwa kweli, kuhusu nuances hizi.

Kuunda ujuzi wa hali ya juu kwa Alice kwenye kazi zisizo na seva za Yandex.Cloud na Python

Maandalizi ya maadili

Kwa wasio na subira: Ninakusanya utegemezi muhimu na faili kabla ya kupakia kitendakazi kwenye wingu, ninahifadhi hali ya mazungumzo kwenye Hifadhi ya Kitu cha Yandex (inasaidia API ya S3), na ninatumia maktaba yangu mwenyewe kudhibiti mazungumzo. tgalice. Mwishoni inageuka kama ujuzi wa demo. Sasa hebu tuangalie haya yote kwa undani zaidi.

Kwa wale wasio na subira kidogo, kabla ya kupiga mbizi kwenye hadithi yangu kuhusu utata, ninapendekeza sana kuanza na kitu rahisi. Yaani, unda kitendakazi cha echobot ya faili moja, sajili na uijaribu kwenye koni ya msanidi wa Dialogs; maelezo - ndani Dialogues blog и Nyaraka za wingu. Na kisha tu kuanza.

Ikiwa unataka kuhisi mara moja tunachopigania hapa, muulize Alice 'wezesha ujuzi wa "horoscope ya IT".'. Mazungumzo sawa na yafuatayo yanapaswa kutokea:

Alice: Habari! Uko katika ujuzi wa "IT Horoscope". Sema "Anza" ili kujua nyota zinakuahidi nini.
Mtumiaji: Anza
J: Tafadhali taja jina lako
Yu: Vasisualiy
J: Sasa niambie mwaka wa kuzaliwa kwako. Nambari nne tu, hakuna cha ziada.
Yu: pili
J: Tafadhali jaribu tena. Ingiza mwaka wa kuzaliwa kwako - tarakimu nne.
Yu: 2002
A: Kubwa! Sasa taja mwezi wako wa kuzaliwa.
Yu: Februari
A: Kubwa! Hatimaye, niambie tarehe yako ya kuzaliwa - nambari tu, tarakimu moja au mbili tu.
Yu: 18
A: Asante, Vasisualiy! Sasa tunajua: una umri wa miaka 17 na Aquarius. Naam, bila shaka, wewe ni bahati! Nyota zinakuambia: а что говорят звёзды, вы узнаете, запустив навык.

Shida ni kwamba ili kudumisha hata mazungumzo rahisi kama haya, unahitaji kukumbuka jina la mtumiaji na tarehe ya kuzaliwa, na katika mazingira ya kazi isiyo na seva hii sio ndogo. Haitawezekana kuhifadhi muktadha katika RAM au kama faili kwenye diski, kwa sababu Yandex.Cloud inaweza kuendesha kazi kwenye mashine kadhaa za kawaida kwa wakati mmoja na kubadili kati yao kwa mapenzi. Utalazimika kutumia aina fulani ya hifadhi ya nje. Hifadhi ya Kitu ilichaguliwa kama hifadhi isiyo ghali na isiyo ngumu moja kwa moja katika Yandex.Cloud (yaani, pengine haraka). Kama mbadala ya bure, unaweza kujaribu, kwa mfano, kipande cha bure Mawingu Monga mahali fulani mbali. Kuna vifuniko vinavyofaa vya Python kwa Hifadhi ya Kitu (ambayo inasaidia kiolesura cha S3) na Mongo.

Shida nyingine ni kwamba ili kufikia Hifadhi ya Kitu, MongoDB, na hifadhidata nyingine yoyote au hifadhi ya data, unahitaji vitegemezi vingine vya nje ambavyo vinahitaji kupakiwa kwenye Kazi za Yandex pamoja na msimbo wako wa kazi. Na ningependa kufanya hivi kwa urahisi. Kwa bahati mbaya, haitakuwa rahisi kabisa (kama kwenye Heroku), lakini baadhi ya faraja ya msingi inaweza kuundwa kwa kuandika script ili kujenga mazingira (fanya faili).

Jinsi ya kuzindua ujuzi wa horoscope

  1. Jitayarishe: nenda kwa mashine fulani iliyo na Linux. Kimsingi, pengine unaweza kufanya kazi na Windows pia, lakini basi itabidi ufanye uchawi kwa kuzindua faili. Na kwa hali yoyote, utahitaji angalau Python 3.6 imewekwa.
  2. Ifunge kutoka kwa Github mfano wa ujuzi wa horoscope.
  3. Jisajili katika Y.Cloud: https://cloud.yandex.ru
  4. Jitengenezee ndoo mbili ndani Uhifadhi wa Kitu, waite kwa jina lolote {BUCKET NAME} и tgalice-test-cold-storage (jina hili la pili sasa limewekwa ngumu main.py mfano wangu). Ndoo ya kwanza itahitajika tu kwa kupelekwa, pili - kuhifadhi majimbo ya mazungumzo.
  5. kujenga akaunti ya huduma, mpe nafasi editor, na upate vitambulisho tuli vyake {KEY ID} и {KEY VALUE} - tutazitumia kurekodi hali ya mazungumzo. Yote hii inahitajika ili kazi kutoka kwa Ya.Cloud iweze kufikia hifadhi kutoka kwa Ya.Cloud. Siku moja, natumai, idhini itakuwa moja kwa moja, lakini kwa sasa ni hivyo.
  6. (Si lazima) sakinisha kiolesura cha mstari wa amri yc. Unaweza pia kuunda kazi kupitia kiolesura cha wavuti, lakini CLI ni nzuri kwa sababu kila aina ya ubunifu huonekana ndani yake kwa kasi zaidi.
  7. Sasa unaweza kuandaa mkusanyiko wa utegemezi: kukimbia kwenye mstari wa amri kutoka kwa folda na mfano wa ujuzi make all. Kundi la maktaba (zaidi, kama kawaida, sio lazima) litawekwa kwenye folda dist.
  8. Mimina kwenye Hifadhi ya Kitu kwa mkono (kwenye ndoo {BUCKET NAME}) kumbukumbu iliyopatikana katika hatua ya awali dist.zip. Ikiwa inataka, unaweza kufanya hivyo kutoka kwa mstari wa amri, kwa mfano, kwa kutumia AWS CLI.
  9. Unda kitendakazi kisicho na seva kupitia kiolesura cha wavuti au kutumia matumizi yc. Kwa matumizi, amri itaonekana kama hii:

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

Wakati wa kuunda kazi kwa mikono, vigezo vyote vinajazwa kwa njia ile ile.

Sasa chaguo la kukokotoa ulilounda linaweza kujaribiwa kupitia kiweko cha msanidi, kisha ujuzi unaweza kuboreshwa na kuchapishwa.

Kuunda ujuzi wa hali ya juu kwa Alice kwenye kazi zisizo na seva za Yandex.Cloud na Python

Nini chini ya kofia

Makefile kweli ina hati rahisi ya kusanikisha utegemezi na kuziweka kwenye kumbukumbu dist.zip, takriban kama hii:

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

Zingine ni zana chache rahisi zilizofungwa kwenye maktaba tgalice. Mchakato wa kujaza data ya mtumiaji unaelezewa na usanidi 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Kazi ya kuchanganua usanidi huu na kuhesabu matokeo ya mwisho inachukuliwa na darasa 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

Kwa usahihi, darasa la msingi FormFillingDialogManager inahusika na kujaza "fomu", na njia ya darasa la watoto handle_completed_form inamwambia nini cha kufanya wakati yuko tayari.

Mbali na mtiririko huu kuu wa mazungumzo, mtumiaji lazima pia asalimiwe, na pia apewe msaada kwa kutumia amri ya "msaada" na kuachiliwa kutoka kwa ustadi kwa kutumia amri ya "kutoka". Kwa kusudi hili katika tgalice Pia kuna kiolezo, kwa hivyo meneja mzima wa mazungumzo ameundwa na vipande:

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 Inafanya kazi kwa urahisi: inajaribu kutumia vipengele vyake vyote kwa hali ya sasa ya mazungumzo kwa upande wake, na kuchagua ya kwanza inayofaa.

Meneja wa mazungumzo anarudisha kitu cha Python kama jibu kwa kila ujumbe. Response, ambayo inaweza kisha kubadilishwa kuwa maandishi wazi, au kuwa ujumbe katika Alice au Telegram - kulingana na wapi bot inafanya kazi; pia ina hali iliyobadilika ya mazungumzo ambayo inahitaji kuokolewa. Jikoni hii yote inashughulikiwa na darasa lingine, DialogConnector, kwa hivyo hati ya moja kwa moja ya kuzindua ustadi kwenye Kazi za Yandex inaonekana kama hii:

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

Kama unavyoona, nyingi za msimbo huu huunda muunganisho kwenye kiolesura cha S3 cha Hifadhi ya Kitu. Unaweza kusoma jinsi muunganisho huu unatumiwa moja kwa moja katika nambari ya tgalice.
Mstari wa mwisho huunda kazi alice_handler - ile ile ambayo tuliiambia Yandex.Cloud kuvuta tunapoweka parameter --entrypoint=main.alice_handler.

Hiyo ndiyo yote, kwa kweli. Faili za kusanyiko, Hifadhi ya Kitu kama S3 kwa muktadha wa kuhifadhi, na maktaba ya Python tgalice. Ikijumuishwa na kazi zisizo na seva na uwazi wa Python, hii inatosha kukuza ustadi wa afya wa binadamu.

Unaweza kuuliza kwa nini ilikuwa muhimu kuunda tgalice? Nambari zote za kuchosha ambazo huhamisha JSON kutoka ombi hadi jibu na kutoka kwa uhifadhi hadi kumbukumbu na nyuma ziko ndani yake. Pia kuna maombi ya kanuni ya kawaida, kazi ya kuelewa kwamba "Februari" ni sawa na "Februari", na NLU nyingine kwa maskini. Kulingana na wazo langu, hii inapaswa kuwa tayari kutosha ili uweze kuchora prototypes za ujuzi katika faili za yaml bila kupotoshwa sana na maelezo ya kiufundi.

Ikiwa unataka NLU mbaya zaidi, unaweza kuiambatanisha na ujuzi wako Rasa au DeepPavlov, lakini kuziweka kutahitaji densi za ziada na tambourini, haswa bila seva. Ikiwa hujisikii kuweka msimbo hata kidogo, unapaswa kutumia kijenzi cha kuona kama Aimylogic. Wakati wa kuunda tgalice, nilifikiria juu ya aina fulani ya njia ya kati. Wacha tuone nini kinakuja kutoka kwa hii.

Naam, sasa jiunge gumzo la msanidi ujuzi wa alice, soma nyaraka, na kuunda ajabu ujuzi!

Chanzo: mapenzi.com

Kuongeza maoni