Yandex.Cloud eta Python-en zerbitzaririk gabeko funtzioetan Alicerentzat trebetasun egoera bat sortzea

Has gaitezen albisteekin. Atzo Yandex.Cloud-ek zerbitzaririk gabeko informatika-zerbitzu bat abian jarri zuela iragarri zuen Yandex Cloud Funtzioak. Horrek esan nahi du: zure zerbitzurako kodea soilik idazten duzu (adibidez, web aplikazio bat edo txatbot bat), eta Hodeiak berak sortzen eta mantentzen ditu exekutatzen dituen makina birtualak, eta karga handitzen bada ere errepikatu egiten ditu. Ez duzu batere pentsatu behar, oso erosoa da. Eta ordainketa kalkulatzeko denborarako bakarrik da.

Hala ere, pertsona batzuek ez dute batere ordaindu. Hauek garatzaileak dira Aliceren kanpoko trebetasunak, hau da, bertan eraikitako txatbotak. Edozein garatzailek horrelako trebetasun bat idatzi, ostalatu eta erregistratu dezake, eta gaurtik aurrera trebetasunak ez dira ostatatuta egon beharrik; kargatu bere kodea hodeira formularioan. zerbitzaririk gabeko funtzio bera.

Baina badira ñabardura pare bat. Lehenik eta behin, zure hobi-kodeak mendekotasun batzuk eska ditzake eta hodeira arrastatzea ez da hutsala. Bigarrenik, edozein chatbot-ek elkarrizketaren egoera nonbait gorde behar du (egoerazkoa, beraz); Zein da zerbitzaririk gabeko funtzio batean hori egiteko modurik errazena? Hirugarrenik, nola idatzi dezakezu Alicerako trebetasun bizkor eta zikin bat edo baita zero ez den argumentua duen bot motaren bat? Artikulua, hain zuzen, ñabardura horiei buruzkoa da.

Yandex.Cloud eta Python-en zerbitzaririk gabeko funtzioetan Alicerentzat trebetasun egoera bat sortzea

prestaketa morala

Pazientziarik ez dutenentzat: Makefile batekin beharrezko mendekotasunak biltzen ditut funtzioa hodeira igo aurretik, elkarrizketa-koadroaren egoera Yandex Object Storage-n gordetzen dut (S3 APIa onartzen du) eta nire liburutegia erabiltzen dut elkarrizketa kudeatzeko. tgalice. Ondorioz, bihurtzen da besteak beste, demo trebetasuna. Orain ikus dezagun hori guztia xehetasun pixka bat gehiagorekin.

Apur bat pazientzia gutxiago dutenentzat, nire konplexutasunaren istorioan murgildu aurretik, sinplea hastea gomendatzen dut. Hots, sortu fitxategi bakarreko echobot funtzioa, erregistratu eta probatu Dialog garatzaileen kontsolan; xehetasunak - in Blog Elkarrizketak и hodeiko dokumentazioa. Eta orduan bakarrik hasi.

Hemen borrokan ari garenagatik berehala sentitu nahi baduzu, galdetu Alizi'aktibatu "IT horoskopoa" trebetasuna'. Elkarrizketa hau egin behar da:

Alice: Kaixo! "IT horoskopoa" trebetasunean zaude. Esan "Hasi" izarrek agintzen dizutena jakiteko.
Erabiltzailea: Hasi
A: Mesedez, adierazi zure izena.
Yu: Vasisuly
A: Orain esaidazu zure jaiotze urtea. Lau digitu baino ez, ezer gehiago.
Yu: bigarrena
A: Saiatu berriro. Adierazi zure jaiotze urtea - lau digitu.
Urtea: 2002
A: Bikaina! Orain izendatu zure jaiotzaren hilabetea.
Yu: Otsaila
A: Bikaina! Azkenik, esan zure jaioteguna: zenbaki bat besterik ez, zifra bat edo bi besterik ez.
Urtea: 18
A: Eskerrik asko, Vasisualiy! Orain badakigu: 17 urte dituzu eta Aquarius bat zara. Tira, noski, zortea duzu! Izarrek esaten dizute: а что говорят звёзды, вы узнаете, запустив навык.

Arazoa da elkarrizketa sinple hori mantentzeko, erabiltzailearen izena eta jaiotze data gogoratu behar dituzula, eta zerbitzaririk gabeko ingurune batean hori ez da hutsala. Ez du funtzionatuko testuingurua RAM edo diskoan fitxategi gisa gordetzeko, zeren Yandex.Cloud-ek funtzioa hainbat makina birtualetan exekutatu dezake aldi berean eta haien artean arbitrarioki alda daiteke. Kanpoko biltegiratze moduko bat erabili beharko duzu. Object Storage biltegiratze nahiko merke eta sinple gisa aukeratu zen zuzenean Yandex.Cloud-en (hau da, ziurrenik azkarra). Doako alternatiba gisa, adibidez, doako pieza bat probatu dezakezu Hodeitsua Monga nonbait urrun. Object Storage (S3 interfazea onartzen du) eta Mongok Python bilgarri erosoak dituzte.

Beste arazo bat da Object Storage, MongoDB eta beste edozein datu-base edo datu biltegira joateko, Yandex Functions-era zure funtzio-kodearekin batera igo behar dituzun kanpoko mendekotasun batzuk behar dituzula. Eta eroso egin nahiko nuke. Erabat erosoa da (heroku-n bezala), ai, ez du funtzionatuko, baina oinarrizko erosotasun bat sor dezakezu ingurunea eraikitzeko script bat idatziz (fitxategia egin).

Nola hasi horoskopoaren trebetasuna

  1. Presta zaitez: joan Linux-ekin makina batera. Printzipioz, ziurrenik Windows-ekin ere lan egin dezakezu, baina gero makefile abiarazi behar duzu. Eta nolanahi ere, gutxienez 3.6 instalatutako Python beharko duzu.
  2. Github-etik klonatu horoskopo trebetasunaren adibidea.
  3. Erregistratu Ya.Cloud-en: https://cloud.yandex.ru
  4. Sortu zeure burua bi ontzi Objektuaren biltegia, deitu edozein izenez {BUCKET NAME} и tgalice-test-cold-storage (Erdiko izen hau orain gogor kodetuta dago main.py nire adibidea). Lehenengo ontzia inplementatzeko soilik beharko da, bigarrena elkarrizketa-egoerak gordetzeko.
  5. sortzen zerbitzu kontua, eman rol bat editor, eta lortu kredentzial estatikoak {KEY ID} и {KEY VALUE} - elkarrizketaren egoera erregistratzeko erabiliko ditugu. Hori guztia beharrezkoa da Ya.Cloud-eko funtzioak Ya.Cloud-eko biltegiratzera sartzeko. Noizbait, espero dut baimena automatikoki bihurtuko dela, baina oraingoz, beraz.
  6. (Aukerakoa) instalatu komando-lerroko interfazea yc. Web interfazearen bidez ere sor dezakezu funtzio bat, baina CLI ona da, era guztietako berrikuntzak azkarrago agertzen direlako bertan.
  7. Orain, hain zuzen ere, mendekotasunen muntaia prestatu dezakezu: exekutatu karpetako komando-lerroan trebetasun adibidearekin make all. Liburutegi mordo bat (gehienetan, ohi bezala, beharrezkoak ez direnak) karpetan instalatuko dira dist.
  8. Bete boligrafoz objektuen biltegian (ontzi batean {BUCKET NAME}) aurreko urratsean lortutako artxiboa dist.zip. Nahi izanez gero, komando lerrotik egin dezakezu, adibidez, erabiliz AWS CLI.
  9. Sortu zerbitzaririk gabeko funtzio bat web interfazearen bidez edo utilitatea erabiliz yc. Erabilgarritasunerako, komandoak itxura hau izango du:

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

Funtzio bat eskuz sortzerakoan, parametro guztiak modu berean betetzen dira.

Orain sortu duzun funtzioa garatzaileen kontsolaren bidez probatu daiteke, eta gero trebetasuna hobetu eta argitaratu daiteke.

Yandex.Cloud eta Python-en zerbitzaririk gabeko funtzioetan Alicerentzat trebetasun egoera bat sortzea

Kaputxa azpian dagoena

Makefile-ak mendekotasunak instalatzeko eta artxibo batean sartzeko script nahiko sinple bat dauka. dist.zip, honelako zerbait:

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

Gainerakoa, liburutegi batean bildutako tresna sinple batzuk dira tgalice. Erabiltzailearen datuak betetzeko prozesua konfigurazioan deskribatzen da 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Python klaseak konfigurazio hau analizatzeko eta azken emaitza kalkulatzeko lana hartzen du

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

Zehazkiago, oinarrizko klasea FormFillingDialogManager "inprimakia" eta haur klasearen metodoa betetzen ari da handle_completed_form prest dagoenean zer egin behar duen esaten du.

Erabiltzailearen elkarrizketaren fluxu nagusi honetaz gain, erabiltzailea agurtzea ere beharrezkoa da, baita "laguntza" komandoan laguntza ematea eta "irten" komandoan trebetasunetik askatu. Horretarako tgalice txantiloi bat ere badago, beraz, elkarrizketa-kudeatzaile osoa piezaz osatuta dago:

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 Besterik gabe funtzionatzen du: bere osagai guztiak elkarrizketaren uneko egoerari aplikatzen saiatzen da txandaka, eta egokia den lehenengoa hautatzen du.

Mezu bakoitzaren erantzun gisa, elkarrizketa-kudeatzaileak python objektu bat itzultzen du Response, gero testu arrunt batean edo Alice edo Telegramen mezu batean bihur daitekeen - bot-a exekutatzen ari den lekuaren arabera; gorde behar den elkarrizketa-koadroaren aldatutako egoera ere jasotzen du. Sukalde hau guztia beste klase batek kudeatzen du, DialogConnector, beraz, Yandex Functions-en trebetasun bat hasteko zuzeneko gidoia honelakoa da:

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

Ikus dezakezunez, kode honen gehienek konexio bat sortzen dute Object Storage S3 interfazearekin. Konexio hau zuzenean nola erabiltzen den, irakur dezakezu tgalice kodean.
Azken lerroak funtzio bat sortzen du alice_handler - parametroa ezarri dugunean Yandex.Cloud tiratzeko agindu genuena --entrypoint=main.alice_handler.

Hori da guztia, egia esan. Makefiles muntatzeko, S3 antzeko Object Storage testuingurua gordetzeko eta Python liburutegi bat tgalice. Python-en zerbitzaririk gabeko funtzioekin eta adierazkortasunarekin konbinatuta, nahikoa da giza trebetasun osasuntsu bat garatzeko.

Galdetuko duzu zergatik sortu behar duzun tgalice? JSONak eskaeratik erantzunera eta biltegiratzetik memoriara eta atzera transferitzen dituen kode aspergarri guztiak bertan daude. Adierazpen erregular aplikazio bat ere badago, "otsaila" "otsailaren" antzekoa dela ulertzeko funtzio bat eta pobreentzako beste NLU batzuk. Nire ideiaren arabera, nahikoa izan beharko litzateke yaml fitxategietan trebetasun-prototipoak zirriborratu ahal izateko xehetasun teknikoekin gehiegi distraitu gabe.

NLU serioagoa nahi baduzu, zure trebetasunari erantsi diezaiokezu Rasa edo DeepPavlov, baina horiek ezartzeak dantza osagarriak beharko ditu panderoarekin, batez ere zerbitzaririk gabekoetan. Kodetzeko gogorik ez baduzu, bezalako eraikitzaile bisual bat erabili beharko zenuke Aimylogic. tgalice sortzean, tarteko bideren bat pentsatu nuen. Ea zer gertatzen den.

Beno, orain elkartu Aliy trebetasunak garatzaileen txata, irakurri dokumentazioaeta harrigarria sortu trebetasunak!

Iturria: www.habr.com

Gehitu iruzkin berria