Masiqale ngeendaba. Izolo iYandex.Cloud ibhengeze ukuqaliswa kwenkonzo yekhompyutha engenaseva . Oku kuthetha ukuba: ubhala kuphela ikhowudi yenkonzo yakho (umzekelo, isicelo sewebhu okanye i-chatbot), kwaye i-Cloud ngokwayo idala kwaye igcine oomatshini benyani apho iqhuba khona, kwaye iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde iphinde isebenze. Awudingi ukucinga konke konke, kulula kakhulu. Kwaye umrhumo ngowexesha lokubala kuphela.
Nangona kunjalo, abanye basenokungahlawuli kwaphela. Aba ngabaphuhlisi , oko kukuthi, ii-chatbots ezakhelwe kuyo. Nawuphi na umthuthukisi angabhala, abambe kwaye abhalise isakhono esinjalo, kwaye ukususela namhlanje izakhono azidingeki nokuba zibanjwe - faka nje ikhowudi yabo efini kwifom. .
Kodwa kukho iinuances ezimbalwa. Okokuqala, ikhowudi yakho yomngxunya inokufuna ukuxhomekeka okuthile, kwaye ukuyitsalela kwiLifu ayisiyonto encinci. Okwesibini, nayiphi na i-chatbot eqhelekileyo idinga ukugcina imeko yencoko yababini kwindawo ethile (icacile ke ngoko); Yeyiphi eyona ndlela ilula yokwenza oku kumsebenzi ongenaseva? Okwesithathu, ungasibhala njani isakhono esikhawulezayo nesimdaka sika-Alice okanye uhlobo oluthile lwebhothi ngecebo elingelo-zero? Inqaku, enyanisweni, malunga nezi nuances.

Ukulungiselela ukuziphatha
Kwabangenamonde: Ndiqokelela ukuxhomekeka okuyimfuneko ngefayile yokwenza phambi kokulayisha umsebenzi efini, ndigcina imeko yencoko yababini kwiYandex Object Storage (ixhasa i-S3 API), kwaye ndisebenzisa ilayibrari yam ukulawula ingxoxo. . Ekugqibeleni kuvela isakhono demo. Ngoku makhe sijonge kuyo yonke le nto ngeenkcukacha ezincinci.
Kwabo bangenamonde kancinci, ngaphambi kokuntywila kwibali lam malunga nobunzima, ndincoma kakhulu ukuqala ngento elula. Oko kukuthi, yenza umsebenzi we-echobot yefayile enye, bhalisa kwaye uyivavanye kwi-Dialog developer console; iinkcukacha - kwi и . Kwaye kuphela emva koko uqale.
Ukuba ufuna ukuva kwangoko ukuba silwela ntoni apha, buza uAlice ''. Incoko yababini efana nale ilandelayo kufuneka yenzeke:
UAlice: Molo! Ukwisakhono se "IT Horoscope". Yithi "Qala" ukufumanisa ukuba iinkwenkwezi zikuthembisa ntoni.
Umsebenzisi: Qala
A: Ndicela uchaze igama lakho
Yu:Vasisualiy
IMPENDULO: Ndixelele ngoku unyaka wokuzalwa kwakho. Amanani amane kuphela, akukho nto ingaphezulu.
Yu: okwesibini
A: Ndicela uzame kwakhona. Faka unyaka wokuzalwa kwakho - amanani amane.
Yu: 2002
A: Mkhulu! Ngoku chaza inyanga yakho yokuzalwa.
Yu: February
A: Mkhulu! Okokugqibela, ndixelele usuku lwakho lokuzalwa - inani nje, idijithi enye okanye ezimbini.
Yu: 18
A: Enkosi, Vasisualiy! Ngoku siyazi: uneminyaka eyi-17 kunye ne-Aquarius. Ewe, kunjalo, unethamsanqa! Iinkwenkwezi ziyakuxelela: а что говорят звёзды, вы узнаете, запустив навык.
Ingxaki kukuba ukuze ulondoloze incoko yababini elula, kufuneka ukhumbule igama lomsebenzisi kunye nomhla wokuzalwa, kwaye kwindawo yokusebenza engenamsebenzi oku akukho nto. Akunakwenzeka ukugcina umxholo kwi-RAM okanye njengefayile kwidiski, kuba I-Yandex.Cloud inokuqhuba umsebenzi koomatshini abaninzi benyani ngexesha elifanayo kwaye utshintshe phakathi kwabo ngokuthanda. Kuya kufuneka usebenzise uhlobo oluthile logcino lwangaphandle. I-Object Storage ikhethwe njengendawo yokugcina engabizi kwaye ilula kakhulu kwi-Yandex.Cloud (oko kukuthi, mhlawumbi ngokukhawuleza). Njengenye indlela yamahhala, unokuzama, umzekelo, isiqwenga samahhala kwindawo ekude. Kukho ii-wrappers zePython ezifanelekileyo kuzo zombini uGcino lweNto (exhasa ujongano lwe-S3) kunye neMongo.
Enye ingxaki kukuba ukufikelela kwi-Object Storage, i-MongoDB, kunye nayiphi na enye i-database okanye isitoreji sedatha, udinga ukuxhomekeka kwangaphandle okufunekayo ukulayishwa kwi-Yandex Functions kunye nekhowudi yakho yokusebenza. Kwaye ndingathanda ukwenza oku ngokulula. Ngelishwa, ayiyi kulungeleka ngokupheleleyo (njenge-Heroku), kodwa enye induduzo eyisiseko inokudalwa ngokubhala iskripthi sokwakha indawo (yenza ifayile).
Indlela yokuqalisa isakhono se-horoscope
- Lungisa: ngena kuyo nayiphi na imashini esebenzisa iLinux. Ngokusisiseko, nge Windows Oku kusenokwenzeka ukuba kusebenze, kodwa ukusebenzisa i-makefile kuya kufuna umlingo. Kwaye nokuba kunjalo, kuya kufuneka ufake iPython 3.6 okanye ngaphezulu.
- Yivale kwiGithub .
- Bhalisa kwi-Y.Cloud:
- Zenzele iibhakethi ezimbini ngaphakathi , Babize ngalo naliphi na igama
{BUCKET NAME}иtgalice-test-cold-storage(eli gama lesibini ngoku lifakwe kwi-hardcodedmain.pyumzekelo wam). Ibhakethi yokuqala iya kufunwa kuphela ukusasazwa, okwesibini - ukugcina amazwe encoko. - Yenza , mnike indima
editor, kwaye ufumane iziqinisekiso ezimileyo zayo{KEY ID}и{KEY VALUE}— siya kuzisebenzisa ukurekhoda ubume bengxoxo. Konke oku kuyafuneka ukuze umsebenzi ovela kwi-Ya.Cloud unokufikelela kwindawo yokugcina kwi-Ya.Cloud. Ngenye imini, ndiyathemba, ugunyaziso luya kuzenzekela, kodwa okwangoku lunjalo. - (Ngokhetho) faka
yc. Unokwenza umsebenzi ngokusebenzisa ujongano lwewebhu, kodwa i-CLI ilungile kuba zonke iintlobo zezinto ezintsha zivela kuyo ngokukhawuleza. - Ngoku ungenza ngokwenene ukulungiselela indibano yokuxhomekeka: yiqhube kumgca womyalelo kwifolda ngomzekelo wesakhono
make all. Iqela lamathala eencwadi (ubukhulu becala, njengesiqhelo, ngokungeyomfuneko) liya kufakwa kwifoldadist. - Galela kwi-Object Storage ngesandla (kwi-emele
{BUCKET NAME}) uvimba ofunyenwe kwinyathelo langaphambilidist.zip. Ukuba uyanqwena, unokwenza oku kumgca womyalelo, umzekelo, usebenzisa . - Yenza umsebenzi ongenamncedisi usebenzisa ujongano lwewebhu okanye usebenzisa into eluncedo
yc. Kumsebenzi, umyalelo uya kujongeka ngolu hlobo:
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=3sXa udala umsebenzi ngesandla, zonke iiparameters zizaliswe ngendlela efanayo.
Ngoku umsebenzi owenziweyo unokuvavanywa nge-console yonjiniyela, kwaye ke isakhono sinokuphuculwa kwaye sipapashwe.

Yintoni phantsi kwe-hood
I-makefile eneneni iqulethe iskripthi esilula ngokufanelekileyo sokuhlohla ukuxhomekeka kunye nokubeka kwindawo yokugcina dist.zip, malunga noku:
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 ./*Intsalela zizixhobo ezimbalwa ezilula ezisongelwe kwithala leencwadi tgalice. Inkqubo yokuzalisa idatha yomsebenzisi ichazwa yi-config 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.Umsebenzi wokwahlulahlula le config kunye nokubala umphumo wokugqibela uthathwa yiklasi yePython
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 responseNgokuchanekileyo, iklasi yesiseko FormFillingDialogManager ijongene nokuzalisa “ifomu”, kunye nendlela yeklasi yomntwana handle_completed_form umxelela ukuba enze ntoni xa sele elungile.
Ukongeza kolu hambo luphambili lwencoko yababini, umsebenzisi kufuneka abuliswe, kwaye anikwe uncedo usebenzisa "uncedo" umyalelo kwaye akhululwe kwisakhono usebenzisa umyalelo "wokuphuma". Ukwenza oku kwi tgalice Kukwakho itemplate, ngoko ke wonke umphathi wencoko yababini yenziwe ngamaqhekeza:
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 Isebenza ngokulula: izama ukusebenzisa onke amalungu ayo kwimeko yangoku yencoko yababini ngokutshintshana, kwaye ikhethe eyokuqala efanelekileyo.
Umphathi wencoko yababini ubuyisela into yePython njengempendulo kumyalezo ngamnye. Response, enokuthi emva koko iguqulelwe kwisicatshulwa esicacileyo, okanye kumyalezo kwi-Alice okanye kwiTelegram - kuxhomekeke apho ibhot isebenza khona; ikwaqulathe imeko etshintshileyo yencoko yababini efuna ukugcinwa. Eli khitshi lilonke liphathwa yenye iklasi, DialogConnector, ngoko ke iskripthi esithe ngqo sokusungula isakhono kwiYandex Functions sijongeka ngolu hlobo:
...
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_handlerNjengoko ubona, uninzi lwale khowudi yenza uqhagamshelo kujongano lwe-S3 lweNto yoGcino. Unokufunda indlela olu qhagamshelwano lusetyenziswa ngayo ngokuthe ngqo .
Umgca wokugqibela udala umsebenzi alice_handler - efanayo leyo sathi Yandex.Cloud ukutsala xa siseta parameter --entrypoint=main.alice_handler.
Yiloo nto kuphela, eneneni. Iifayile zendibano, iS3-efana noGcino lwento yokugcina umxholo, kunye nelayibrari yePython tgalice. Idityaniswe nemisebenzi engenamsebenzi kunye nokucaciswa kwePython, oku kwanele ukuphuhlisa isakhono somntu esinempilo.
Unokubuza ukuba kutheni bekuyimfuneko ukuyila tgalice? Yonke ikhowudi ekruqulayo ehambisa ii-JSONs ukusuka kwisicelo ukuya kwimpendulo kwaye ukusuka kwisitoreji ukuya kwimemori kunye nomqolo ilele kuyo. Kukho kwakhona isicelo esiqhelekileyo sekhowudi, umsebenzi wokuqonda ukuba "uFebruwari" ufana no "Februwari", kunye nenye i-NLU yabahluphekileyo. Ngokombono wam, oku kufanele ukuba sele kwanele ukuze ukwazi ukuzoba iiprototypes zezakhono kwiifayile ze-yaml ngaphandle kokuphazanyiswa kakhulu neenkcukacha zobugcisa.
Ukuba ufuna i-NLU enzulu ngakumbi, ungayincamathisela kwisakhono sakho okanye , kodwa ukuseta kuya kufuna imidaniso eyongezelelweyo ngentambula, ngakumbi kwi-serverless. Ukuba awuziva ngathi ukhowuda konke konke, kuya kufuneka usebenzise umakhi obonakalayo onje . Xa usenza i-tgalice, ndacinga ngohlobo oluthile lwendlela ephakathi. Makhe sibone ukuba yintoni eza kwenzeka kule nto.
Ewe, ngena ngoku , funda , kwaye udale ngokumangalisayo !
umthombo: www.habr.com
