Alustame uudistest. Eile kuulutas Yandex.Cloud välja serverivabu arvutusteenuseid. . See tähendab, et sa kirjutad ainult oma teenuse koodi (näiteks veebirakenduse või vestlusrobot), samas kui Pilv loob ja haldab automaatselt virtuaalmasinaid, kus see töötab, ning isegi replitseerib neid koormuse suurenedes. Mõtlema ei pea, see on väga mugav. Ja maksta tuleb ainult arvutusaegade eest.
Kuid mõned ei pruugi maksta üldse. Need on arendajad , st neisse integreeritud vestlusrobotid. Sellise oskuse kirjutamine, hostimine ja registreerimine on võimalik igaühe jaoks, ja alates tänasest ei pea oskusi isegi hostima — piisab, kui laadida nende kood pilve .
Kuid on paar nüanssi. Esiteks võib teie kood vajada mingisuguseid sõltuvusi ning nende lisamine pilve võib olla keeruline. Teiseks, igasugune normaalne juturobot peab kuskil hoidma vestluse olekut; kuidas oleks lihtsaim viis seda salvestada serverita funktsioonis? Kolmandaks, kuidas kirjutada kiiresti ja lihtsalt oskus Allale või muule robotile, millel on mingisugune lugu? Nendest nüanssidest räägib artikkel.

Moraalne ettevalmistus
Kibedamatest: vajalikud sõltuvused kogun ma make-failiga enne funktsiooni pilve laadimist, vestluse oleku hoian Yandexi objektide salvestuses (seal toetatakse S3 API-d) ning dialooge juhin oma teegiga. . Lõpuks saame me demooskuse. Ja nüüd võtame selle kõik natuke põhjalikumalt lahti.
Veidi vähem kärsitutele: enne kui sukelduda minu loo keerukustesse, soovitan tõsiselt alustada millegi lihtsaga. Jah, luua ühes failis funktsioon-ehobot, registreerida ja testida seda Dialogide arenduse konsoolis; üksikasjad - ja . Ja alles seejärel edasi.
Kui soovite kohe teada, mille nimel me siin võitleme, paluge Alice'l ‘‘. Peaks toimuma umbes järgmine dialoog:
Alice: Tere! Olete oskuses 'IT-horoskoop'. Ütelge 'Alusta', et teada saada, mida tähed teile ennustavad.
Kasutaja: Alusta
A: Palun öelge oma nimi
K: Vasilij
A: Nüüd öelge mulle oma sünniaasta. Ainult neli numbrit, mitte midagi liigset.
K: Kaks
A: Palun proovige uuesti. Öelge oma sünniaasta — neli numbrit.
K: 2002
A: Suurepärane! Nüüd öelge oma sünnikuu.
K: Veebruar
A: Suurepärane! Lõpuks öelge mulle oma sünnipäev — ainult number, kokku üks või kaks numbrit.
K: 18
A: Aitäh, Vasilij! Nüüd teame: olete 17-aastane ja te olete Veevalaja. Te tõepoolest olete vedanud! Tähed ütlevad teile: kuid mida tähed ütlevad, saate teada, kui aktiveerite oskuse.
Probleem on see, et isegi nii lihtsa dialooge säilitamiseks tuleb meeles pidada kasutaja nime ja sünnipäeva, kuid serverivabade funktsioonide kontekstis on see keeruline. Konteksti hoidmine mälus või failina kettal ei toimi, kuna Yandex.Cloud võib sama funktsiooni käitada mitmel virtuaalmasinal samal ajal ja vahetada nende vahel juhuslikult. On vajalik leida mõni väline salvestuslahendus. Valituks osutus Object Storage, kuna see on suhteliselt odav ja lihtne lahendus otse Yandex.Cloudis (st tõenäoliselt kiire). Tasuta alternatiivina võib proovida näiteks tasuta varianti kusagil kaugel. N nii Object Storage (see toetab S3 liidest) kui ka Mongo jaoks on olemas mugavad Python'i wrapperid.
Teine probleem on see, et Object Storage'is, MongoDB's ja teistes andmebaasides või salvestites navigeerimiseks on vajalikud mingid välistingimused, mis tuleb koos oma funktsiooni koodiga Yandex Functions'i laadida. Sooviks, et see oleks mugav. Kahjuks ei saa me täielikult mugavust (näiteks nagu herokus), aga mingisuguse põhilise mugavuse saab luua, kirjutades keskkonna ehitamise skripti (make-faili).
Kuidas käivitada horoskoobi oskust
- Valmistage ette: minge mõnele Linuxi masinale. Tegelikult on võimalik ka Windowsiga töötada, kuid make-faili käitamisel tuleb siis natuke näputööd teha. Igal juhul vajate versiooni Pythonist, mis on vähemalt 3.6.
- Kloonige endale GitHub'ist .
- Registreerige Yandex.Cloud'is:
- Looge endale kaks ämbrit , nimetage need mis tahes nimega
{BUCKET NAME}jatgalice-test-cold-storage(see teine nimi on praegu kõvakooditudmain.pyminu näites). Esimene ämber on vajalik ainult juurutamiseks, teine - dialooge staatuste hoidmiseks. - Loo , andke sellele roll
editor, ja saage selle juurde staatilised mandaadid{KEY ID}ja{KEY VALUE}— neid on vajalik dialooge salvestada. See kõik on vajalik, et funktsioon Y.Cloud saaks pääseda Y.Cloud'i salvestusele. Loodetavasti muutub autoriseerimine automaatseks, kuid praegu on asi nii. - (Mitte kohustuslik) paigaldada
yc. Funktsiooni saab luua ka veebiliidese kaudu, kuid CLI on hea, kuna kõik uuendused ilmuvad seal kiiremini. - Nüüd saab tõeliselt ette valmistada sõltuvuste kogumist: käivitage käsurealt kaustast, kus on näiteoskuse kood
make all. Paigaldatakse hulk raamatukogusid (peamiselt, nagu tavaliselt, ebavajalikke) kaustadist. - Manuaalselt laadige Object Storage'i (ämbrisse
{BUCKET NAME}) eelmisel sammul loodud arhiiv.dist.zip. Soovi korral saab seda teha ka käsurealt, näiteks kasutades . - Looge serverita funktsioon veebiliidese kaudu või kasutades tööriista
yc. Tööriista käsk näeb välja järgmine:
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=3sManuaalselt funktsiooni loomisel täidetakse kõik parameetrid sarnaselt.
Nüüd saate oma loodud funktsiooni testida arendaja konsoolis, seejärel täiustada ja oskust avaldada.

Mis seal kapoti all
Make-fail sisaldab tegelikult üsna lihtsat skripti sõltuvuste installimiseks ja nende arhiveerimiseks. dist.zip, ligikaudu sellist:
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 ./Ülejäänud on mõned lihtsad tööriistad, mis on pakitud teeki. tgalice. Protsess, kuidas kasutaja andmed täidetakse, on kirjeldatud konfigureerimises. form.yaml:
form_name: 'horoscope_form'
start:
regexp: 'algus|alustada'
suggests:
- Algus
fields:
- name: 'name'
question: Palun öelge oma nimi.
- name: 'year'
question: Nüüd öelge mulle oma sünniaasta. Ainult neli numbrit, mitte midagi muud.
validate_regexp: '^[0-9]{4}$'
validate_message: Palun proovige uuesti. Öelge oma sünniaasta - neli numbrit.
- name: 'month'
question: Suurepärane! Nüüd öelge oma sünnikuu.
options:
- jaanuar
- veebruar
- märts
- aprill
- mai
- juuni
- juuli
- august
- september
- oktoober
- november
- detsember
validate_message: See, mida te ütlesite, ei tundu olevat kuu. Palun öelge oma sünnikuu, ilma teiste sõnadeta.
- name: 'day'
question: Suurepärane! Lõpuks, öelge mulle oma sünnikuupäev - ainult number, üks või kaks numbrit.
validate_regexp: '[0123]?\d$'
validate_message: Palun proovige uuesti. Te peate nimetama oma sünnikuupäeva (näiteks kahekümnes); see on üks või kaks numbrit.Töö selle konfi analüüsimiseks ja lõpliku tulemuse arvutamiseks võtab enda kanda Python klass
class CheckableFormFiller(tgalice.dialog_manager.form_filling.FormFillingDialogManager):
SIGNS = {
'jaanuar': 'Kaljukits',
...
}
def handle_completed_form(self, form, user_object, ctx):
response = tgalice.dialog_manager.base.Response(
text='Aitäh, {}! Nüüd teame: olete {} aastat vana ja olete {}. n'
'Teie jaoks on tõeliselt vedanud! Tähed ütlevad: {}'.format(
form['fields']['name'],
2019 - int(form['fields']['year']),
self.SIGNS[form['fields']['month']],
random.choice(FORECASTS),
),
user_object=user_object,
)
return responseTäpsemalt öeldes, põhiklasse FormFillingDialogManager tegeleb „vormi“ täitmisega, samas kui alamsordi meetod handle_completed_form ütleb, mida teha, kui see on valmis.
Lisaks sellele põhidialogile tuleb kasutajat ka tervitada ja anda abi tellimuse peale „abi“, ning lõpetada oskus tellimuse peale „väljuda“. Selleks tgalice on samuti malli jagu, seega on tervikliku dialoogihalduri koostamine tükkidest:
dm = tgalice.dialog_manager.CascadeDialogManager(
tgalice.dialog_manager.GreetAndHelpDialogManager(
greeting_message=DEFAULT_MESSAGE,
help_message=DEFAULT_MESSAGE,
exit_message='Head aega, tulge "IT horoskoop" oskusesse tagasi!'
),
CheckableFormFiller(`form.yaml`, default_message=DEFAULT_MESSAGE)
)CascadeDialogManager töötab lihtsalt: proovib rakendada kõik oma osad järjestikku praegusele dialooge olekule ja valib esimese sobiva.
Iga sõnumi vastusena tagastab dialooge haldur Python'i objekti Vastus, mille saab seejärel konverteerida puhtaks tekstiks või sõnumiks Alices või Telegramis — sõltuvalt sellest, kus bot on käivitatud; selles on ka muudetud dialooge olek, mida tuleb salvestada. Kogu selle tööga tegeleb veel üks klass, DialogConnector, seetõttu näeb Yandex Functions'i oskuse käivitamise skript otseselt välja järgmiselt:
...
sessioon = boto3.session.Session()
s3 = sessioon.client(
teenuse_nimi='s3',
lõpp-punkt_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_handlerNagu näete, loob enamik sellest koodist ühenduse S3-objektide salvestamise liidestega. Kuidas see ühendus konkreetselt kasutatakse, saab lugeda .
Viimane rida loob funktsiooni alice_handler — see, mida me palusime Yandex.Cloudi tõmmata, kui seadsime parameetri --entrypoint=main.alice_handler.
Siin see on. Make-failid ehitamiseks, S3-sarnane objektide salvestamine konteksti jaoks ja Python’i teek tgalice. Koos serverivabade funktsioonide ja Pythoni väljendusrikkusega on seda piisavalt terve inimese oskuse arendamiseks.
Võite küsida, miks seda üldse luua oli vaja tgalice? Весь скучный код, перекладывающий JSON’ы из запроса в ответ и из хранилища в память и обратно, лежит в ней. Там же лежит применялка регулярок, функция для понимания того, что «феврарь» похоже на «февраль», и прочее NLU для бедных. По моей задумке, этого уже должно быть достаточно, чтобы можно было набрасывать прототипы навыков в yaml-файлах, не слишком отвлекаясь на технические детали.
Kui soovite tõsisemat NLU-d, saate oma oskusele lisada või , kuid nende seadistamiseks on vajalikud lisamängud, eriti serverivabas. Kui ei soovi üldse kodeerida, tasub kasutada visuaalset ehitajat, näiteks . Tgalice'i loomisel mõtlesin mingile vahepealsele teele. Näis, mis sellest välja tuleb.
Noh, nüüd liituge , lugege , ja looge imelisi !
Allikas: habr.com
