Krijimi i një aftësie shtetërore për Alice duke përdorur funksionet pa server të Yandex.Cloud dhe Python

Le të fillojmë me lajmet. Dje Yandex.Cloud njoftoi nisjen e një shërbimi kompjuterik pa server Funksionet e resë Yandex. Kjo do të thotë: ju shkruani vetëm kodin për shërbimin tuaj (për shembull, një aplikacion ueb ose një chatbot), dhe vetë Cloud krijon dhe mirëmban makinat virtuale ku funksionon, madje i përsërit ato nëse ngarkesa rritet. Nuk keni nevojë të mendoni fare, është shumë i përshtatshëm. Dhe pagesa është vetëm për kohën e llogaritjes.

Megjithatë, disa mund të mos paguajnë fare. Këta janë zhvilluesit Aftësitë e jashtme të Alice, domethënë, chatbot të integruara në të. Çdo zhvillues mund të shkruajë, presë dhe regjistrojë një aftësi të tillë, dhe nga sot aftësitë nuk kanë nevojë as të strehohen - thjesht ngarkoni kodin e tyre në cloud në formë i njëjti funksion pa server.

Por ka disa nuanca. Së pari, kodi juaj i gropës mund të kërkojë disa varësi dhe zvarritja e tyre në Cloud është jo e parëndësishme. Së dyti, çdo chatbot normal duhet të ruajë gjendjen e dialogut diku (për rrjedhojë, e paqartë); Cila është mënyra më e lehtë për ta bërë këtë në një funksion pa server? Së treti, si mund të shkruani një aftësi të shpejtë dhe të pistë për Alice apo edhe një lloj roboti me një komplot jo zero? Artikulli ka të bëjë, në fakt, për këto nuanca.

Krijimi i një aftësie shtetërore për Alice duke përdorur funksionet pa server të Yandex.Cloud dhe Python

Përgatitja morale

Për të paduruarit: Unë mbledh varësitë e nevojshme me një skedar make-file përpara se të ngarkoj funksionin në cloud, ruaj gjendjen e dialogut në Yandex Object Storage (ai mbështet S3 API) dhe përdor bibliotekën time për të menaxhuar dialogun tgalice. Në fund rezulton i tillë aftësi demo. Tani le t'i shohim të gjitha këto në pak më shumë detaje.

Për ata pak më pak të padurueshëm, përpara se të zhyten në historinë time rreth kompleksitetit, rekomandoj shumë të fillojnë me diçka të thjeshtë. Gjegjësisht, krijoni një funksion echobot me një skedar të vetëm, regjistrojeni dhe testoni atë në tastierën e zhvilluesit Dialogs; detaje - në Dialogu blog и Dokumentacioni në renë kompjuterike. Dhe vetëm atëherë filloni.

Nëse doni të ndjeni menjëherë se për çfarë po luftojmë këtu, pyesni Alice'aktivizoni aftësinë e "horoskopit të IT".'. Duhet të ndodhë një dialog i ngjashëm me sa vijon:

Alice: Përshëndetje! Ju jeni në aftësinë "Horoskopi IT". Thuaj "Start" për të zbuluar se çfarë ju premtojnë yjet.
Përdoruesi: Filloni
A: Ju lutemi tregoni emrin tuaj
Yu: Vasisualiy
Përgjigje: Tani më trego vitin e lindjes. Vetëm katër shifra, asgjë shtesë.
Ju: e dyta
Përgjigje: Ju lutemi provoni përsëri. Shkruani vitin e lindjes tuaj - katër shifra.
Yu: 2002
A: E shkëlqyeshme! Tani emërtoni muajin tuaj të lindjes.
Yu: Shkurt
A: E shkëlqyeshme! Më në fund, më tregoni datën tuaj të lindjes - vetëm një numër, vetëm një ose dy shifra.
Yu: 18
Përgjigje: Faleminderit, Vasisualiy! Tani e dimë: ju jeni 17 vjeç dhe një Ujor. Epo, sigurisht, ju jeni me fat! Yjet ju thonë: а что говорят звёзды, вы узнаете, запустив навык.

Problemi është se për të mbajtur edhe një dialog kaq të thjeshtë, duhet të mbani mend emrin e përdoruesit dhe datën e lindjes, dhe në një mjedis funksioni pa server kjo nuk është e parëndësishme. Nuk do të jetë e mundur të ruhet konteksti në RAM ose si skedar në disk, sepse Yandex.Cloud mund të ekzekutojë një funksion në disa makina virtuale në të njëjtën kohë dhe të kalojë mes tyre sipas dëshirës. Ju do të duhet të përdorni një lloj ruajtjeje të jashtme. Ruajtja e objekteve u zgjodh si një ruajtje mjaft e lirë dhe e pakomplikuar drejtpërdrejt në Yandex.Cloud (d.m.th., ndoshta e shpejtë). Si një alternativë falas, mund të provoni, për shembull, një pjesë falas Monga me re diku larg. Ka mbështjellës të përshtatshëm Python për ruajtjen e objekteve (që mbështet ndërfaqen S3) dhe Mongo.

Një problem tjetër është se për të hyrë në Object Storage, MongoDB dhe çdo bazë të dhënash ose dyqan tjetër të dhënash, ju nevojiten disa varësi të jashtme që duhet të ngarkohen në Yandex Functions së bashku me kodin tuaj të funksionit. Dhe unë do të doja ta bëja këtë me lehtësi. Fatkeqësisht, nuk do të jetë plotësisht i përshtatshëm (si në Heroku), por mund të krijohet njëfarë rehatie bazë duke shkruar një skenar për të ndërtuar mjedisin (krijoni skedar).

Si të filloni një aftësi horoskopi

  1. Përgatitja: shkoni te një makinë me Linux. Në parim, ndoshta mund të punoni edhe me Windows, por më pas do t'ju duhet të bëni disa magji me lançimin e skedarit. Dhe në çdo rast, do t'ju duhet të paktën të instaluar Python 3.6.
  2. Klononi atë nga Github shembull i aftësisë së horoskopit.
  3. Regjistrohu në Y.Cloud: https://cloud.yandex.ru
  4. Krijoni vetes dy kova brenda Ruajtja e objekteve, thirrini me çdo emër {BUCKET NAME} и tgalice-test-cold-storage (ky emër i dytë tani është i koduar main.py shembulli im). Kova e parë do të nevojitet vetëm për vendosjen, e dyta - për të ruajtur gjendjet e dialogut.
  5. krijoj llogaria e shërbimit, jepini atij një rol editor, dhe merrni kredencialet statike për të {KEY ID} и {KEY VALUE} — do t'i përdorim për të regjistruar gjendjen e dialogut. E gjithë kjo është e nevojshme në mënyrë që një funksion nga Ya.Cloud të mund të aksesojë hapësirën ruajtëse nga Ya.Cloud. Një ditë, shpresoj, autorizimi do të bëhet automatik, por tani për tani është kështu.
  6. (Opsionale) instaloni ndërfaqja e linjës së komandës yc. Ju gjithashtu mund të krijoni një funksion përmes ndërfaqes në internet, por CLI është i mirë sepse të gjitha llojet e risive shfaqen në të më shpejt.
  7. Tani mund të përgatisni asamblenë e varësisë: ekzekutoni atë në vijën e komandës nga dosja me shembullin e aftësive make all. Një grup bibliotekash (kryesisht, si zakonisht, të panevojshme) do të instalohen në dosje dist.
  8. Hidheni me dorë në Object Storage (në kovë {BUCKET NAME}) arkivi i marrë në hapin e mëparshëm dist.zip. Nëse dëshironi, mund ta bëni këtë nga linja e komandës, për shembull, duke përdorur AWS CLI.
  9. Krijoni një funksion pa server përmes ndërfaqes në internet ose duke përdorur një program yc. Për shërbimin, komanda do të duket si kjo:

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

Kur krijoni manualisht një funksion, të gjithë parametrat plotësohen në të njëjtën mënyrë.

Tani funksioni që keni krijuar mund të testohet përmes tastierës së zhvilluesit dhe më pas aftësia mund të përmirësohet dhe publikohet.

Krijimi i një aftësie shtetërore për Alice duke përdorur funksionet pa server të Yandex.Cloud dhe Python

Çfarë ka nën kapuç

Makefile në fakt përmban një skript mjaft të thjeshtë për instalimin e varësive dhe vendosjen e tyre në një arkiv dist.zip, përafërsisht si kjo:

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

Pjesa tjetër janë disa mjete të thjeshta të mbështjella në një bibliotekë tgalice. Procesi i plotësimit të të dhënave të përdoruesit përshkruhet nga konfigurimi 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Puna e analizimit të këtij konfigurimi dhe llogaritja e rezultatit përfundimtar merret nga klasa 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

Më saktësisht, klasa bazë FormFillingDialogManager merret me plotësimin e “formës”, dhe metodën e klasës fëmijë handle_completed_form i thotë se çfarë të bëjë kur të jetë gati.

Përveç kësaj rrjedhe kryesore të dialogut, përdoruesi duhet gjithashtu të përshëndetet, si dhe t'i jepet ndihmë duke përdorur komandën "ndihmë" dhe të lirohet nga aftësia duke përdorur komandën "dalje". Për këtë qëllim në tgalice Ekziston gjithashtu një shabllon, kështu që i gjithë menaxheri i dialogut përbëhet nga pjesë:

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 Funksionon thjesht: përpiqet të zbatojë me radhë të gjithë përbërësit e tij në gjendjen aktuale të dialogut dhe zgjedh të parën e duhur.

Menaxheri i dialogut kthen një objekt Python si përgjigje për çdo mesazh. Response, i cili më pas mund të konvertohet në tekst të thjeshtë, ose në një mesazh në Alice ose Telegram - në varësi të vendit ku po funksionon roboti; ai përmban gjithashtu gjendjen e ndryshuar të dialogut që duhet të ruhet. E gjithë kjo kuzhinë trajtohet nga një klasë tjetër, DialogConnector, kështu që skenari i drejtpërdrejtë për fillimin e një aftësie në funksionet Yandex duket si ky:

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

Siç mund ta shihni, shumica e këtij kodi krijon një lidhje me ndërfaqen S3 të Object Storage. Ju mund të lexoni se si përdoret drejtpërdrejt kjo lidhje në kodin tgalice.
Rreshti i fundit krijon funksionin alice_handler — i njëjti që i thamë Yandex.Cloud të tërheqë kur vendosim parametrin --entrypoint=main.alice_handler.

Kjo është e gjitha, në fakt. Skedarët e krijuar për montim, ruajtja e objekteve të ngjashme me S3 për ruajtjen e kontekstit dhe një bibliotekë Python tgalice. E kombinuar me funksionet pa server dhe ekspresivitetin e Python, kjo është e mjaftueshme për të zhvilluar një aftësi të shëndetshme njerëzore.

Ju mund të pyesni pse ishte e nevojshme të krijohej tgalice? I gjithë kodi i mërzitshëm që transferon JSON nga kërkesa në përgjigje dhe nga ruajtja në memorie dhe mbrapa qëndron në të. Ekziston edhe një aplikacion i rregullt kodi, një funksion për të kuptuar se "shkurti" është i ngjashëm me "shkurt" dhe NLU të tjera për të varfërit. Sipas idesë sime, kjo tashmë duhet të jetë e mjaftueshme në mënyrë që të mund të skiconi prototipet e aftësive në skedarët yaml pa u hutuar shumë nga detajet teknike.

Nëse dëshironi një NLU më serioze, mund ta lidhni atë me aftësinë tuaj Shija ose DeepPavlov, por vendosja e tyre do të kërkojë kërcime shtesë me një dajre, veçanërisht në pa server. Nëse nuk ju pëlqen fare të kodoni, duhet të përdorni një konstruktor vizual si Aimilogjik. Kur krijova tgalice, mendova për një lloj rruge të ndërmjetme. Le të shohim se çfarë vjen nga kjo.

Epo, bashkohuni tani biseda e zhvilluesit të aftësive alice, lexoni dokumentacionin, dhe krijoni të mrekullueshme aftësitë!

Burimi: www.habr.com

Shto një koment