Le të fillojmë me lajmet. Dje, Yandex.Cloud njoftoi fillimin e shërbimit të llogaritjes pa server. . Kjo do të thotë: shkruani vetëm kodin e shërbimit tuaj (për shembull, një aplikacion në internet ose një chatbot), dhe Cloud krijon dhe mirëmban automatikisht makinat virtuale ku ai ekzekutohet, madje edhe i riprodhon ato nëse ngarkohet. Nuk keni nevojë të mendoni fare, shumë e përshtatshme. Dhe pagesa bëhet vetëm për kohën e llogaritjes.
Megjithatë, disa mund të mos paguajnë fare. Këta janë zhvilluesit , që do të thotë chatbot-et e ndërtuara në të. Çdo zhvillues mund të shkruajë, strehë dhe regjistrojë një aftësi të tillë, dhe nga sot, as nuk është e nevojshme ta strehoni atë — mjafton të ngarkoni kodin e tyre në cloud si .
Por një të dytë, kodeja juaj e pitnajë mund të kërkojë disa varësi, dhe të automatizosh ato në Cloud është e ndërlikuar. Për më tepër, çdo chatbot normal kërkon të ruajë ndonjëherë gjendjen e dialogut; si është më e lehtë ta bësh këtë në një funksion pa server? E treta, si mund ta shkruash shpejt dhe papërpunuar një aftësi për Alisa ose ndonjë bot tjetër me një ngjarje të kimiçte? Kjo është tema e artikullit.

Përgatitja morale
Për ata që nuk kanë shumë durim: varësitë e nevojshme i përmbledh me një skedar make përpara se të ngarkoj funksionin në cloud, gjendjen e dialogut e ruaj në Object Storage të Yandex (ajo mbështet API S3), dhe për të menaxhuar dialogun përdor bibliotekën time të vetme . Në fund rezulton një aftësi demonstration. Tani le t'i shqyrtojmë këto në një mënyrë më të detajuar.
Për ata që kanë pak më shumë durim: para se të filloni historinë time për sfidat, rekomandoj shumë të filloni me diçka të thjeshtë. Pra, krijoni një funksion njëskedarësh të ekobotit, regjistroni dhe testoni atë në konsolën e zhvilluesit të Dialogëve; informacion më i hollësishëm është në dhe . Dhe vetëm pastaj të kaloni.
Nëse dëshironi të ndieni menjëherë për çfarë po luftojmë, kërkoni nga Alisa ‘‘. Një bisedë e tillë duhet të ndodhë:
Alisa: Përshëndetje! Jeni në aftësinë «Horoskopi IT». Thoni «Fillimi» për të mësuar se çfarë parashikojnë yjet për ju.
Përdoruesi: Fillimi
A: Ju lutem, thoni emrin tuaj
P: Vasissuali
A: Tani më thoni vitin e lindjes tuaj. Vetëm katër shifra, asgjë më shumë.
P: dy
A: Ju lutem, provoni përsëri. Jepte vitin tuaj të lindjes — katër shifra.
P: 2002
A: Shkëlqyer! Tani, thoni muajin e lindjes tuaj.
P: Shkurt
A: Shkëlqyer! Në fund, thoni datën tuaj të lindjes — vetëm numrin, një ose dy shifra.
P: 18
A: Faleminderit, Vasissuali! Tani e dimë: jeni 17 vjeç dhe jeni Ujor. Kjo është fat! Yjet ju thonë: dhe çfarë thonë yjet, do ta mësoni duke aktivizuar aftësinë.
Problemi është se për të mbajtur një dialog edhe kaq të thjeshtë, duhet të mbash mend emrin dhe datën e lindjes së përdoruesit, dhe në një mjedis funksionesh pa server, kjo nuk është triviale. Nuk është e mundur të ruash kontekstin në memorien operativë ose në një skedar në disk, sepse Yandex.Cloud mund të aktivizojë një funksion në disa makina virtuale njëkohësisht dhe të kalojë mes tyre në mënyrë të rastësishme. Duhet të përdorësh ndonjë magazinë të jashtme. U zgjodh Object Storage, si një magazinë mjaft të përballueshme dhe e lehtë direkt në Yandex.Cloud (dmth, ndoshta e shpejtë). Si një alternativë falas, mund të provosh, për shembull, një copë falas. diku larg. Si për Object Storage (ai mbështet ndërfaqen S3), ashtu edhe për Mongo ekzistojnë v wrapping Python të përshtatshme.
Një problem tjetër është se për të punuar në Object Storage, MongoDB, ose çfarëdo baze tjetër ose depozite, nevojiten disa varësi të jashtme që duhet ngarkuar në Yandex Functions së bashku me kodin e funksionit tuaj. Do të ishte mirë ta bënim këtë në një mënyrë të përshtatshme. Në mënyrë të plotë të rehatshme (si në heroku), nuk do të jetë e mundur, por mund të krijoni ndonjë komfort bazik duke shkruar një skenar për ndërtimin e mjedisit (skedari make).
Si të nisni njohjen e horoskopit
- Përgatituni: hyni në ndonjë makinë me Linux. Në parim, ndoshta mund të punoni edhe me Windows, por do t'ju duhet të përballeni me nisjen e skedarit make. Dhe në çdo rast, do t'ju nevojitet një Python i instaluar, jo më i ulët se 3.6.
- Klononi nga GitHub-i .
- Regjistrohuni në Yandex Cloud:
- Krijoni dy buxhe në , emërtoni ato me çdo emër
{BUCKET NAME}dhetgalice-test-cold-storage(ky emër i dytë aktualisht është i hardkoduar nëmain.pytë shembujve të mi). Buxheku i parë do të nevojitet vetëm për shpërndarjen, buxheku i dytë për ruajtjen e gjendjeve të dialogut. - Krijo , jepini atij rol
editor, dhe merrni akreditimet statike{KEY ID}dhe{KEY VALUE}— do të përdoren për regjistrimin e gjendjes së dialogut. Të gjitha këto janë të nevojshme në mënyrë që funksioni nga Y.Cloud të ketë qasje në magazinën nga Y.Cloud. Shpresoj që një ditë, autorizimi të bëhet automatik, por deri atëherë — kështu. - (Jo domosdoshmërisht) instalo
yc. Mund të krijohet një funksion edhe përmes ndërfaqes së uebit, por CLI është i mirë sepse novatorët shfaqen aty më shpejt. - Tani mund të përgatitni ndërtimin e varësive: lëshoni në komandën e linjës nga dosja me shembujin e aftësisë
make all. Do të instalohen shumë biblioteka (në shumicë të rastit, si zakonisht, të panevojshme) në dosjendist. - Ngarkoni manualisht në Object Storage (në bucket
{BUCKET NAME}) arkivin e krijuar në hapin e mëparshëm.dist.zip. Nëse dëshironi, mund ta bëni këtë edhe nga komandat e linjës, për shembull, duke përdorur . - Krijoni një funksion pa server përmes ndërfaqes së uebit ose duke përdorur utilitarin
yc. Për utilitarin, komanda do të duket kështu:
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=3sKur krijoni funksionin manualisht, të gjitha parametrat plotësohen në mënyrë të ngjashme.
Tani, funksioni që keni krijuar mund të testohet përmes konsolës së zhvilluesit, pastaj të përmirësohet dhe të publikohet si një aftësi.

Çfarë ka nën kapak?
Të vërtetën, skedari Make përmban një skript mjaft të thjeshtë për instalimin e varësive dhe paketimin e tyre në një arkiv. dist.zip, diçka 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ë paketuara në një bibliotekë. tgalice. Procesi i plotësimit të të dhënave për përdoruesin përshkruhet në konfigurim. form.yaml:
form_name: 'horoscope_form'
start:
regexp: 'fill|nisni'
suggests:
- Fill
fields:
- name: 'name'
question: Ju lutem, thuaj emrin tënd.
- name: 'year'
question: Tani, më trego vitin e lindjes tënde. Vetëm katër shifra, asgjë më shumë.
validate_regexp: '^[0-9]{4}$'
validate_message: Ju lutem, provoni përsëri. Jepni vitin e lindjes tuaj - katër shifra.
- name: 'month'
question: Fantastic! Tani thuaj muajin e lindjes tënde.
options:
- janar
...
- dhjetor
validate_message: Ajo që the nuk duket si një muaj. Ju lutem, jepni muajin e lindjes tuaj, pa fjalë të tjera.
- name: 'day'
question: Shkëlqyeshëm! Në fund, më thuaj datën e lindjes tënde - vetëm numrin, vetëm një ose dy shifra.
validate_regexp: '[0123]?d$'
validate_message: Ju lutem, provoni përsëri. Ju nevojitet të thoni numrin e lindjes tuaj (p.sh., e njëmbëdhjeta); kjo është një ose dy shifra.Puna për analizimin e këtij konfigurimi dhe llogaritjen e rezultatit përfundimtar e merr mbi vete klasa e Python-it.
class CheckableFormFiller(tgalice.dialog_manager.form_filling.FormFillingDialogManager):
SIGNS = {
'janar': 'Shigjetari',
...
}
def handle_completed_form(self, form, user_object, ctx):
response = tgalice.dialog_manager.base.Response(
text='Faleminderit, {}! Tani e dimë: jeni {} vjeç dhe jeni {}. n'
'Padyshim keni fat! Yjet ju thonë: {}'.format(
form['fields']['name'],
2019 - int(form['fields']['year']),
self.SIGNS[form['fields']['month']],
random.choice(FORECASTS),
),
user_object=user_object,
)
return responseMë saktësisht, klasa bazë FormFillingDialogManager merret me plotësimin e "formës", dhe metoda e klasës nënpër handle_completed_form tregon se çfarë duhet bërë kur ajo është e përfunduar.
Përveç këtij rrjedhës kryesore të bisedës, duhet gjithashtu të përshëndetë përdoruesin dhe të japë informacion mbi komandën "ndihmë" dhe të dalë nga aftësia nëpërmjet komandës "dalje". Për këtë, në tgalice ka gjithashtu një shabllon, kështu që menaxheri i bisedës është përbërë nga copa:
dm = tgalice.dialog_manager.CascadeDialogManager(
tgalice.dialog_manager.GreetAndHelpDialogManager(
greeting_message=DEFAULT_MESSAGE,
help_message=DEFAULT_MESSAGE,
exit_message='Mirupafshim, kthehuni në aftësinë "Horoskopi IT"!'
),
CheckableFormFiller(`form.yaml`, default_message=DEFAULT_MESSAGE)
)CascadeDialogManager funksionon thjesht: provon të aplikojë të gjitha komponentët e saj në gjendjen aktuale të dialogut njëri pas tjetrit dhe zgjedh të parin e përshtatshëm.
Si përgjigje ndaj çdo mesazhi, menaxheri i dialogut kthen një objekt Python Përgjigje, i cili më pas mund të konvertohet në tekst të thjeshtë, ose në një mesazh në Alisa ose Telegram — varësisht nga ku është aktivizuar boti; gjithashtu përmban gjendjen e ndryshuar të dialogut, e cila duhet ruajtur. Të gjitha këto detyra kryhen nga një klasë tjetër, DialogConnector, prandaj skenari i drejtpërdrejtë për të filluar aftësinë në Yandex Functions duket kështu:
...
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_handlerSiç e shihni, pjesa më e madhe e këtij kodi krijon një lidhje me S3-interface Object Storage. Si përdoret konkretisht kjo lidhje, mund të lexoni .
Rreshti i fundit krijon një funksion alice_handler — ajo që i thamë Yandex.Cloud që ta tërhiqte, kur vendosëm parametrin --entrypoint=main.alice_handler.
Ja, vetë kjo është gjithçka. Skedarët Make për ndërtim, Object Storage si S3 për ruajtjen e kontekstit, dhe biblioteka Python tgalice. Bashkë me funksionet serverless dhe shprehshmërinë e Python-it, kjo është e mjaftueshme për zhvillimin e një aftësie përdoruesi të shëndetshëm.
Ju mund të pyesni, pse është e nevojshme të krijohet tgalice? Весь скучный код, перекладывающий JSON’ы из запроса в ответ и из хранилища в память и обратно, лежит в ней. Там же лежит применялка регулярок, функция для понимания того, что «феврарь» похоже на «февраль», и прочее NLU для бедных. По моей задумке, этого уже должно быть достаточно, чтобы можно было набрасывать прототипы навыков в yaml-файлах, не слишком отвлекаясь на технические детали.
Nëse dëshironi një NLU më serioze, mund të lidhni në aftësinë tuaj ose , por për konfigurimin e tyre do të nevojiten disa përpjekje shtesë, veçanërisht në serverless. Nëse nuk dëshironi fare të kodoni, ia vlen të përdorni një ndërtues vizual si . Kur krijoja tgalice, mendova për një lloj rruge të mesme. Le të shohim se çfarë do të dalë nga kjo.
Po tani bashkohuni me , lexoni , dhe krijoni aftësi të mrekullueshme !
Burimi: habr.com
