Да почнеме со вестите. Вчера Yandex.Cloud го објави лансирањето на компјутерска услуга без сервер . Ова значи: вие го пишувате само кодот за вашата услуга (на пример, веб-апликација или чет-бот), а самиот Cloud ги создава и одржува виртуелните машини каде што работи, па дури и ги реплицира ако се зголеми оптоварувањето. Воопшто не треба да размислувате, тоа е многу погодно. А плаќањето е само за времето на пресметка.
Сепак, некои можеби нема да платат воопшто. Ова се програмерите , односно чет-ботови вградени во него. Секој развивач може да напише, хостира и регистрира таква вештина, а од денес вештините не треба ни да се хостираат - само прикачете го нивниот код во облакот во форма .
Но, постојат неколку нијанси. Прво, вашиот пит-код може да бара некои зависности, а нивното влечење во Облакот е нетривијално. Второ, секој нормален чет-бот треба некаде да ја зачува состојбата на дијалогот (затоа, несомнено); Кој е најлесниот начин да го направите ова во функција без сервер? Трето, како можете да напишете брза и валкана вештина за Алис или дури и некој вид бот со заговор не-нулта? Написот е, всушност, за овие нијанси.

Морална подготовка
За нетрпеливите: ги собирам потребните зависности со мејкфајл пред да ја подигнам функцијата во облакот, ја складирам состојбата на дијалогот во Yandex Object Storage (го поддржува S3 API) и користам сопствена библиотека за управување со дијалогот . На крајот излегува демо вештина. Сега да го разгледаме сето ова малку подетално.
За оние кои се малку помалку нетрпеливи, пред да се фрлам во мојата приказна за сложеноста, топло препорачувам да започнат со нешто едноставно. Имено, креирајте функција echobot со една датотека, регистрирајте ја и тестирајте ја во програмерската конзола Dialogs; детали - во и . И само тогаш започнете.
Ако сакате веднаш да почувствувате за што се бориме овде, прашајте ја Алис.'. Треба да се појави дијалог сличен на следниот:
Алис: Здраво! Вие сте во вештината „ИТ хороскоп“. Кажете „Start“ за да дознаете што ви ветуваат ѕвездите.
Корисник: Почеток
О: Ве молиме наведете го вашето име
Ју: Васисуалиј
О: Сега кажи ми ја годината на твоето раѓање. Само четири цифри, ништо дополнително.
Ју: второ
О: Ве молиме обидете се повторно. Внесете ја годината на вашето раѓање - четири цифри.
Ју: 2002 година
Голем! Сега именете го вашиот месец на раѓање.
Ју: февруари
Голем! Конечно, кажете ми го вашиот датум на раѓање - само број, само една или две цифри.
Ју: 18 година
О: Ви благодарам, Васисуалиј! Сега знаеме: имате 17 години и сте Водолија. Па, се разбира, имате среќа! Ѕвездите ви кажуваат: а что говорят звёзды, вы узнаете, запустив навык.
Проблемот е што за да одржите дури и таков едноставен дијалог, треба да го запомните името на корисникот и датумот на раѓање, а во функционална средина без сервер ова е нетривијално. Нема да биде можно да се зачува контекстот во RAM меморија или како датотека на дискот, бидејќи Yandex.Cloud може да изврши функција на неколку виртуелни машини во исто време и да се префрла меѓу нив по желба. Ќе мора да користите некој вид надворешно складирање. Складирањето на објекти беше избрано како прилично евтино и некомплицирано складирање директно во Yandex.Cloud (т.е. веројатно брзо). Како бесплатна алтернатива, можете да пробате, на пример, бесплатно парче некаде далеку. Постојат практични обвивки за Python и за складирање на објекти (го поддржува интерфејсот S3) и за Mongo.
Друг проблем е што за да пристапите до Object Storage, MongoDB и која било друга база на податоци или продавница за податоци, потребни ви се некои надворешни зависности што треба да се прикачат на Yandex Functions заедно со вашиот функционален код. И јас би сакал да го направам ова погодно. За жал, нема да биде целосно погодно (како на Хероку), но може да се создаде некоја основна удобност со пишување скрипта за да се изгради околината (направи датотека).
Како да започнете вештина за хороскоп
- Подготовка: најавете се на која било машина што работи со Linux. Во основа, со Windows Ова веројатно би можело да функционира, но стартувањето на makefile би барало малку магија. И во секој случај, ќе ви треба инсталиран Python 3.6 или понов.
- Клонирајте го од Github .
- Регистрирајте се во Y.Cloud:
- Направете си две кофи , наречете ги со кое било име
{BUCKET NAME}иtgalice-test-cold-storage(ова второ име сега е тврдокодираноmain.pyмојот пример). Првата кофа ќе биде потребна само за распоредување, втората - за складирање на состојби на дијалог. - создаде , дајте му улога
editor, и добијте статични акредитиви за тоа{KEY ID}и{KEY VALUE}— ќе ги искористиме за снимање на состојбата на дијалогот. Сето ова е потребно за функцијата од Ya.Cloud да може да пристапи до складиштето од Ya.Cloud. Еден ден, се надевам, овластувањето ќе стане автоматско, но засега е така. - (Незадолжително) инсталирај
yc. Можете исто така да креирате функција преку веб-интерфејсот, но CLI е добар затоа што секакви иновации се појавуваат во него побрзо. - Сега всушност можете да го подготвите склопот за зависност: извршете го на командната линија од папката со примерот за вештини
make all. Во папката ќе се инсталираат куп библиотеки (најчесто, како и обично, непотребни).dist. - Рачно истурете во Object Storage (во корпата
{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Кога рачно креирате функција, сите параметри се пополнуваат на ист начин.
Сега функцијата што ја создадовте може да се тестира преку програмерската конзола, а потоа вештината може да се подобри и објави.

Што има под хаубата
Фајл-датотеката всушност содржи прилично едноставна скрипта за инсталирање зависности и нивно ставање во архива 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.
Тоа е се, всушност. Make-датотеки за склопување, складирање на објекти слични на S3 за складирање контекст и библиотека на Python tgalice. Во комбинација со функциите без сервер и експресивноста на Python, ова е доволно за да се развие здрава човечка вештина.
Можеби ќе прашате зошто беше потребно да се создаде tgalice? Целиот здодевен код што пренесува JSON од барање до одговор и од складирање до меморија и назад лежи во него. Постои и редовна апликација за кодови, функција за разбирање дека „февруари“ е сличен на „февруари“ и други NLU за сиромашните. Според мојата идеја, ова веќе треба да биде доволно за да можете да скицирате прототипови на вештини во датотеките yaml без да бидете премногу расеан од техничките детали.
Ако сакате посериозен NLU, можете да го прикачите на вашата вештина или , но нивното поставување ќе бара дополнителни танци со тамбура, особено на без сервер. Ако воопшто не сакате да кодирате, треба да користите визуелен конструктор како . Кога создавав tgalice, размислував за некој вид на среден пат. Ајде да видиме што ќе излезе од ова.
Па, сега приклучи се , прочитајте , и создадете прекрасни !
Извор: www.habr.com
