Սկսենք նորություններից։ Երեկ Yandex.Cloud-ը հայտարարեց առանց սերվերի հաշվողական ծառայության գործարկման մասին . Սա նշանակում է, որ դուք գրում եք միայն ձեր ծառայության կոդը (օրինակ՝ վեբ հավելված կամ չաթբոտ), և Cloud-ն ինքն է ստեղծում և պահպանում վիրտուալ մեքենաները, որտեղ աշխատում է, և նույնիսկ կրկնօրինակում է դրանք, եթե ծանրաբեռնվածությունը մեծանում է: Ընդհանրապես պետք չէ մտածել, դա շատ հարմար է։ Իսկ վճարը միայն հաշվարկման ժամանակի համար է։
Այնուամենայնիվ, որոշ մարդիկ կարող են ընդհանրապես չվճարել: Սրանք մշակողները են , այսինքն՝ դրա մեջ ներկառուցված չաթ-բոտեր։ Ցանկացած ծրագրավորող կարող է գրել, հյուրընկալել և գրանցել նման հմտություն, և այսօրվանից հմտությունները նույնիսկ կարիք չունեն հոսթինգի. .
Բայց կան մի քանի նրբերանգներ. Նախ, ձեր բարձրախոսական կոդը կարող է պահանջել որոշ կախվածություններ, և դրանք Cloud-ի մեջ քաշելը մանրուք չէ: Երկրորդ, ցանկացած նորմալ չաթբոտ պետք է ինչ-որ տեղ պահի երկխոսության վիճակը (այդ իսկ պատճառով այն պետական է); ո՞րն է դա անելու ամենահեշտ ձևը առանց սերվերի ֆունկցիայի մեջ: Երրորդ, ինչպե՞ս կարող ես արագ և կեղտոտ հմտություն գրել Ալիսի կամ ոչ զրոյական սյուժեով որևէ բոտի համար: Հոդվածն, ըստ էության, այս նրբությունների մասին է։

Բարոյական նախապատրաստություն
Անհամբերների համար. ես հավաքում եմ անհրաժեշտ կախվածությունները makefile-ով նախքան ֆունկցիան ամպ բեռնելը, երկխոսության վիճակը պահում եմ Yandex Object Storage-ում (այն աջակցում է S3 API-ին), և ես օգտագործում եմ իմ սեփական գրադարանը՝ երկխոսությունը կառավարելու համար։ . Արդյունքն այն է ցուցադրական հմտություն. Հիմա այս ամենին նայենք մի փոքր ավելի մանրամասն։
Մի փոքր ավելի քիչ անհամբերների համար, նախքան բարդությունների իմ պատմության մեջ խորանալը, ես խորհուրդ եմ տալիս սկսել պարզից: Մասնավորապես, ստեղծեք մեկ ֆայլով echobot ֆունկցիա, գրանցեք և փորձարկեք այն Dialogs մշակողի վահանակում; մանրամասները - մեջ и . Եվ միայն դրանից հետո սկսեք:
Եթե ցանկանում եք անմիջապես զգալ, թե ինչի համար ենք մենք այստեղ պայքարում, հարցրեք Ալիսին.'. Հետևյալ երկխոսությունը պետք է տեղի ունենա.
Ալիս: Բարև: Դուք «IT Horoscope» հմտության մեջ եք։ Ասեք «Սկսեք»՝ պարզելու համար, թե ինչ են պատրաստել ձեզ աստղերը:
Օգտագործող: Սկսել
Ա. Խնդրում եմ նշեք ձեր անունը։
Յու՝ Վասիլի
Ա: Հիմա ասա ինձ քո ծննդյան տարեթիվը: Ընդամենը չորս նիշ, ոչ ավելին:
Յու: Երկրորդ
A: Խնդրում ենք կրկին փորձել: Նշեք ձեր ծննդյան տարեթիվը՝ չորս նիշ:
U: 2002 թ
A: Հրաշալի! Այժմ նշեք ձեր ծննդյան ամիսը:
Y: Փետրվար
A: Գերազանց! Ի վերջո, ասա ինձ քո ծննդյան ամսաթիվը՝ ընդամենը մի թիվ, ընդամենը մեկ կամ երկու թվանշան:
U: 18 թ
A: Շնորհակալություն, Վասիլի! Այժմ մենք գիտենք՝ դուք 17 տարեկան եք և Ջրհոս եք։ Դուք, անշուշտ, հաջողակ եք: Աստղերը ձեզ ասում են. а что говорят звёзды, вы узнаете, запустив навык.
Խնդիրն այն է, որ նույնիսկ նման պարզ երկխոսություն պահպանելու համար հարկավոր է հիշել օգտվողի անունը և ծննդյան ամսաթիվը, իսկ առանց սերվերի գործառույթների միջավայրում դա աննշան է: Հնարավոր չէ կոնտեքստը պահել RAM-ում կամ որպես ֆայլ սկավառակի վրա, քանի որ Yandex.Cloud-ը կարող է գործառույթը միաժամանակ մի քանի վիրտուալ մեքենաների վրա գործարկել և կամայականորեն անցնել դրանց միջև: Դուք ստիպված կլինեք օգտագործել որոշ արտաքին հիշողություն: Object Storage-ը ընտրվել է որպես բավականին էժան և պարզ պահեստ անմիջապես Yandex.Cloud-ում (այսինքն՝ հավանաբար արագ): Որպես անվճար այլընտրանք, դուք կարող եք փորձել, օրինակ, անվճար կտոր ինչ-որ տեղ հեռու: Կան հարմար Python փաթաթիչներ ինչպես Object Storage-ի (այն աջակցում է S3 ինտերֆեյսին), այնպես էլ Mongo-ի համար:
Մեկ այլ խնդիր այն է, որ Object Storage, MongoDB և ցանկացած այլ տվյալների շտեմարան կամ տվյալների պահպանման համար գնալու համար ձեզ անհրաժեշտ են որոշ արտաքին կախվածություններ, որոնք պետք է վերբեռնվեն Yandex Functions-ում՝ ձեր ֆունկցիայի կոդով: Եվ ես կցանկանայի դա անել հարմար: Ցավոք, դա լիովին հարմար չի լինի (ինչպես Heroku-ում), բայց որոշ հիմնական հարմարավետություն կարելի է ստեղծել՝ գրելով միջավայրը հավաքելու սցենար (make file):
Ինչպես սկսել հորոսկոպի հմտությունը
- Պատրաստվեք. մուտք գործեք Linux-ով աշխատող ցանկացած համակարգիչ։ Հիմնականում, Windows Սա նույնպես հավանաբար կարող է աշխատել, բայց makefile-ը գործարկելը կպահանջի որոշակի հնարքներ։ Եվ ամեն դեպքում, ձեզ անհրաժեշտ կլինի տեղադրված Python 3.6 կամ ավելի բարձր տարբերակ։
- Կլոնավորեք այն GitHub-ից .
- Գրանցվեք Yandex.Cloud-ում.
- Ստեղծեք երկու դույլ ինքներդ ձեզ համար , կոչեք նրանց ցանկացած անունով
{BUCKET NAME}иtgalice-test-cold-storage(այս երկրորդ անունը այժմ կոշտ կոդավորված էmain.pyիմ օրինակը): Առաջին դույլը անհրաժեշտ կլինի միայն տեղակայման համար, երկրորդը` երկխոսության վիճակները պահելու համար: - ստեղծել , նրան դեր տվեք
editorև ստացեք ստատիկ հավատարմագրեր դրա համար{KEY ID}и{KEY VALUE}— մենք դրանք կօգտագործենք երկխոսության վիճակը արձանագրելու համար։ Այս ամենը անհրաժեշտ է, որպեսզի Yandex.Cloud-ի գործառույթը կարողանա մուտք գործել պահեստ Yandex.Cloud-ից: Մի օր, հուսով եմ, լիազորումը կդառնա ավտոմատ, բայց առայժմ այդպես է։ - (ըստ ցանկության) տեղադրել
yc. Կարող եք նաև գործառույթ ստեղծել վեբ ինտերֆեյսի միջոցով, բայց CLI-ն լավ է, քանի որ բոլոր տեսակի նորամուծություններն ավելի արագ են հայտնվում դրանում: - Այժմ դուք կարող եք իրականում պատրաստել կախվածության կառուցումը. գործարկել այն հրամանի տողում պանակից օրինակի հմտությամբ:
make all. Պանակում կտեղադրվեն գրադարանների մի փունջ (հիմնականում, ինչպես միշտ, անհարկի):dist. - Ձեռքով վերբեռնեք օբյեկտների պահոց (դույլի մեջ)
{BUCKET NAME}) նախորդ քայլում ձեռք բերված արխիվըdist.zip. Եթե ցանկանում եք, կարող եք դա անել հրամանի տողից, օրինակ՝ օգտագործելով . - Ստեղծեք առանց սերվերի գործառույթ վեբ ինտերֆեյսի միջոցով կամ օգտագործելով կոմունալ ծրագիրը
yc. Կոմունալ ծառայության համար հրամանը կունենա հետևյալ տեսքը.
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Ձեռքով ֆունկցիա ստեղծելիս բոլոր պարամետրերը լրացվում են նույն ձևով։
Այժմ դուք կարող եք փորձարկել ձեր ստեղծած գործառույթը մշակողի վահանակի միջոցով, այնուհետև կատարելագործել և հրապարակել հմտությունը:

Ինչ կա գլխարկի տակ
Makefile-ն իրականում պարունակում է բավականին պարզ սցենար՝ կախվածությունները տեղադրելու և դրանք արխիվում տեղադրելու համար: dist.zip, այսպիսի մի բան.
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 ./*Մնացածը գրադարանի մեջ փաթաթված մի քանի պարզ գործիքներ են: tgalice. Օգտագործողի տվյալների լրացման գործընթացը նկարագրված է կոնֆիգուրացիայի միջոցով 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 դասը
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Ավելի ճիշտ՝ բազային դասը FormFillingDialogManager զբաղվում է «ձևաթուղթը» լրացնելով, և երեխայի դասի մեթոդը handle_completed_form ասում է նրան, թե ինչ անել, երբ նա պատրաստ լինի:
Բացի երկխոսության այս հիմնական հոսքից, օգտագործողին պետք է նաև ողջունել, ինչպես նաև օգնություն տրամադրել «օգնություն» հրամանի միջոցով և ազատվել «ելք» հրամանի միջոցով: Այդ նպատակով ս.թ. tgalice կա նաև ձևանմուշ, ուստի ամբողջ երկխոսության կառավարիչը կազմված է մասերից.
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 աշխատում է պարզապես. այն հերթով փորձում է կիրառել իր բոլոր բաղադրիչները երկխոսության ներկա վիճակին և ընտրում է առաջին համապատասխանը:
Որպես պատասխան յուրաքանչյուր հաղորդագրության, երկխոսության կառավարիչը վերադարձնում է Python օբյեկտ: Response, որը կարող է այնուհետև վերածվել պարզ տեքստի կամ հաղորդագրության Alice-ում կամ Telegram-ում՝ կախված այն բանից, թե որտեղ է աշխատում բոտը; այն նաև պարունակում է երկխոսության փոփոխված վիճակը, որը պետք է պահպանվի: Կա մեկ այլ դաս, որը զբաղվում է այս ամբողջ խոհանոցով, DialogConnector, այնպես որ Yandex Functions-ի վրա հմտությունը գործարկելու ուղիղ սցենարը հետևյալն է.
...
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Ինչպես տեսնում եք, այս կոդի մեծ մասը կապ է ստեղծում S3 Object Storage ինտերֆեյսի հետ: Դուք կարող եք կարդալ այն մասին, թե ինչպես է ուղղակիորեն օգտագործվում այս կապը .
Վերջին տողը ստեղծում է գործառույթը alice_handler — նույնը, որը մենք ասացինք Yandex.Cloud-ին, որ քաշի, երբ մենք սահմանեցինք պարամետրը --entrypoint=main.alice_handler.
Դե, իրականում այսքանը: Ստեղծման համար նախատեսված ֆայլեր, կոնտեքստը պահելու համար S3-ի նմանվող օբյեկտների պահոց և Python գրադարան tgalice. Առանց սերվերի գործառույթների և Python-ի արտահայտչականության հետ մեկտեղ սա բավական է առողջ մարդու հմտությունները զարգացնելու համար:
Դուք կարող եք հարցնել, թե ինչու էր անհրաժեշտ ստեղծել tgalice? Ամբողջ ձանձրալի ծածկագիրը, որը JSON-ները տեղափոխում է հարցումից պատասխան և պահեստից հիշողություն և ետ, գտնվում է դրանում: Գոյություն ունի նաև սովորական արտահայտությունների հավելված, գործառույթ՝ հասկանալու, որ «փետրվարը» նման է «փետրվարին», և այլ NLU աղքատների համար: Իմ կարծիքով, սա արդեն բավական է, որպեսզի կարողանանք ուրվագծել հմտությունների նախատիպերը yaml ֆայլերում՝ առանց տեխնիկական մանրամասներից շատ շեղվելու:
Եթե ցանկանում եք ավելի լուրջ NLU, կարող եք այն կցել ձեր հմտությանը կամ , բայց դրանց տեղադրումը կպահանջի լրացուցիչ պարեր դափի հետ, հատկապես առանց սերվերի: Եթե դուք ընդհանրապես չեք ցանկանում կոդավորել, ապա պետք է օգտագործեք վիզուալ դիզայներ . Երբ ես ստեղծեցի tgalice-ը, ես մտածում էի ինչ-որ միջանկյալ ճանապարհի մասին: Տեսնենք, թե ինչ է ստացվում սրանից:
Դե, հիմա միացեք կարդալ , և ստեղծել հիանալի !
Source: www.habr.com
