Yangilikdan boshlaylik. Kecha Yandex.Cloud serversiz hisoblash xizmati ishga tushirilganini e'lon qildi . Buning ma'nosi: siz faqat xizmatingiz kodini (masalan, veb-ilova yoki chatbot) yozasiz va Bulutning o'zi ishlaydigan joyda virtual mashinalarni yaratadi va ularga xizmat ko'rsatadi va hatto yuk ko'tarilsa, ularni takrorlaydi. Siz umuman o'ylamasligingiz kerak, bu juda qulay. Va to'lov faqat hisob-kitoblar vaqti uchun ketadi.
Biroq, ba'zi odamlar umuman to'lamasliklari mumkin. Bular ishlab chiquvchilar , ya'ni unga o'rnatilgan chatbotlar. Har qanday ishlab chiquvchi bunday mahoratni yozishi, joylashtirishi va ro‘yxatdan o‘tkazishi mumkin va bugundan boshlab ko‘nikmalarga ega bo‘lish shart emas — shunchaki o‘z kodini bulutga shaklda yuklang. .
Ammo bir nechta nuanslar mavjud. Birinchidan, sizning uy hayvonlari kodingiz ba'zi bog'liqliklarni talab qilishi mumkin va ularni Bulutga sudrab olib borish ahamiyatsiz emas. Ikkinchidan, har qanday oddiy chatbot dialog oynasining holatini biror joyda saqlashi kerak (shuning uchun statistik); buni serversiz funksiyada qanday qilish mumkin? Uchinchidan, Elis uchun tez va iflos mahoratni yoki hatto nolga teng bo'lmagan syujetli qandaydir botni qanday yozish mumkin? Bu nuances haqida, aslida, maqola.

axloqiy tayyorgarlik
Sabrsizlar uchun: funktsiyani bulutga yuklashdan oldin makefile yordamida kerakli bog'liqliklarni to'playman, dialog oynasining holatini Yandex Object Storage-da saqlayman (u S3 API-ni qo'llab-quvvatlaydi) va dialogni boshqarish uchun o'z kutubxonamdan foydalanaman. . Natijada, bu chiqadi demo mahorati. Va endi bularning barchasini biroz batafsilroq tahlil qilaylik.
Bir oz sabrsizlar uchun, mening murakkablik haqidagi hikoyamga sho'ng'ishdan oldin, men oddiy boshlashni tavsiya qilaman. Ya'ni, bitta faylli echobot funksiyasini yarating, uni Dialog dasturchi konsolida ro'yxatdan o'tkazing va sinab ko'ring; tafsilotlar - ichida и . Va shundan keyingina boshlang.
Agar biz nima uchun kurashayotganimizni darhol his qilishni istasangiz, Elisdan so'rang.'. Quyidagi dialog bo'lishi kerak:
Elis: Salom! Siz "IT munajjimlar bashorati" mahoratidasiz. Yulduzlar sizga nimani va'da qilishini bilish uchun "Boshlash" deb ayting.
Foydalanuvchi: Boshlash
Javob: Iltimos, ismingizni ayting.
Yu: Vasisuly
Javob: Endi menga tug'ilgan yilingizni ayting. Faqat to'rtta raqam, boshqa hech narsa.
Yu: ikkinchi
Javob: Qayta urinib ko‘ring. Tug'ilgan yilingizni ko'rsating - to'rtta raqam.
Yu: 2002 yil
A: Ajoyib! Endi tug'ilgan oyingizni nomlang.
Yu: fevral
A: Ajoyib! Nihoyat, menga tug'ilgan kuningizni ayting - faqat raqam, faqat bitta yoki ikkita raqam.
Yu: 18 yil
Javob: Rahmat, Vasisal! Endi biz bilamiz: siz 17 yoshdasiz va siz Aquarius. Mana, albatta, omadingiz bor! Yulduzlar sizga aytadi а что говорят звёзды, вы узнаете, запустив навык.
Muammo shundaki, hatto bunday oddiy dialogni saqlab qolish uchun siz foydalanuvchining ismi va tug'ilgan sanasini eslab qolishingiz kerak va serversiz muhitda bu ahamiyatsiz emas. Kontekstni operativ xotirada yoki diskdagi fayl sifatida saqlash ishlamaydi, chunki Yandex.Cloud funksiyani bir vaqtning o'zida bir nechta virtual mashinalarda ishga tushirishi va ular o'rtasida o'zboshimchalik bilan almashishi mumkin. Siz qandaydir tashqi xotiradan foydalanishingiz kerak bo'ladi. Ob'ektni saqlash to'g'ridan-to'g'ri Yandex.Cloud-da (ya'ni, ehtimol tez) juda arzon va oddiy saqlash sifatida tanlangan. Bepul muqobil sifatida, masalan, bepul parchani sinab ko'rishingiz mumkin uzoqroq joyda. Object Storage (u S3 interfeysini qo‘llab-quvvatlaydi) va Mongo ham qulay Python o‘ramlariga ega.
Yana bir muammo shundaki, Object Storage, MongoDB va boshqa ma'lumotlar bazasi yoki ma'lumotlar do'koniga o'tish uchun sizga funktsiya kodingiz bilan birga Yandex Funktsiyalariga yuklashingiz kerak bo'lgan ba'zi tashqi bog'liqliklar kerak bo'ladi. Va men buni bemalol qilishni xohlayman. Bu mutlaqo qulay (geroku-da bo'lgani kabi), afsuski, u ishlamaydi, lekin siz muhitni yaratish (fayl yaratish) uchun skript yozish orqali ba'zi asosiy qulayliklarni yaratishingiz mumkin.
Munajjimlar bashorati mahoratini qanday boshlash kerak
- Tayyorlang: Linux ishlaydigan har qanday mashinaga kiring. Asosan, bilan Windows Bu ham ish berishi mumkin, ammo makefile ni ishga tushirish uchun sehr kerak bo'ladi. Va har qanday holatda ham sizga Python 3.6 yoki undan yuqori versiyasi o'rnatilgan bo'lishi kerak.
- Github'dan klonlash .
- Ya.Cloud-da ro'yxatdan o'ting:
- O'zingizga ikkita chelak yarating , ularni istalgan nom bilan chaqiring
{BUCKET NAME}иtgalice-test-cold-storage(bu otasining ismi endi qattiq kodlanganmain.pymening misolim). Birinchi chelak faqat joylashtirish uchun kerak bo'ladi, ikkinchisi - dialog holatini saqlash uchun. - yaratish , unga rol bering
editor, va buning uchun statik hisobga olish ma'lumotlarini oling{KEY ID}и{KEY VALUE}- biz ulardan dialog holatini yozib olish uchun foydalanamiz. Bularning barchasi Ya.Cloud funksiyasi Ya.Cloud-dan saqlashga kirishi uchun kerak. Umid qilamanki, qachondir avtorizatsiya avtomatik bo'ladi, ammo hozircha - shunday. - (ixtiyoriy) o'rnatish
yc. Bundan tashqari, veb-interfeys orqali funksiya yaratishingiz mumkin, ammo CLI yaxshi, chunki unda barcha turdagi yangiliklar tezroq paydo bo'ladi. - Endi siz, aslida, bog'liqliklar yig'ilishini tayyorlashingiz mumkin: mahorat namunasi bilan papkadan buyruq satrida ishga tushiring.
make all. Jildga bir qator kutubxonalar (asosan, odatdagidek, keraksiz) o'rnatiladi.dist. - Ob'ektlarni saqlash joyiga qalam bilan to'ldiring (chelakga
{BUCKET NAME}) oldingi bosqichda olingan arxivdist.zip. Agar xohlasangiz, buni buyruq satridan ham qilishingiz mumkin, masalan, yordamida . - Veb-interfeys yoki yordamchi dastur yordamida serversiz funksiya yarating
yc. Yordamchi dastur uchun buyruq quyidagicha ko'rinadi:
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=3sFunktsiyani qo'lda yaratishda barcha parametrlar bir xil tarzda to'ldiriladi.
Endi siz yaratgan funktsiyani ishlab chiquvchi konsoli orqali sinab ko'rish mumkin, so'ngra mahoratni yakunlash va nashr etish mumkin.

Kaput ostida nima bor
Makefile aslida bog'liqliklarni o'rnatish va ularni arxivga qo'yish uchun juda oddiy skriptni o'z ichiga oladi. dist.zip, shunga o'xshash narsa:
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 ./*Qolganlari kutubxonaga o'ralgan bir nechta oddiy vositalardir tgalice. Foydalanuvchi ma'lumotlarini to'ldirish jarayoni konfiguratsiya bilan tavsiflanadi 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 klassi ushbu konfiguratsiyani tahlil qilish va yakuniy natijani hisoblash ishini oladi
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 responseAniqrog'i, asosiy sinf FormFillingDialogManager "shakl" ni to'ldirish bilan shug'ullanadi va bola sinfining usuli handle_completed_form tayyor bo'lganda nima qilish kerakligini aytadi.
Ushbu asosiy dialog oqimiga qo'shimcha ravishda, foydalanuvchi ham salomlashishi kerak, shuningdek, "yordam" buyrug'i bo'yicha yordam berish va "chiqish" buyrug'i bo'yicha mahoratdan ozod qilish kerak. Buning uchun in tgalice shablon ham mavjud, shuning uchun barcha dialog menejeri qismlardan iborat:
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 oddiygina ishlaydi: u dialogning hozirgi holatiga uning barcha tarkibiy qismlarini navbat bilan qo'llashga harakat qiladi va birinchi tegishlisini tanlaydi.
Har bir xabarga javob sifatida dialog menejeri python ob'ektini qaytaradi Response, keyinchalik uni oddiy matnga yoki Elis yoki Telegramdagi xabarga aylantirish mumkin - bot qayerda ishlayotganiga qarab; u shuningdek, saqlanishi kerak bo'lgan muloqot oynasining o'zgartirilgan holatini o'z ichiga oladi. Bu oshxonaning hammasi boshqa sinf tomonidan boshqariladi, DialogConnector, shuning uchun Yandex Funktsiyalarida mahoratni boshlash uchun to'g'ridan-to'g'ri skript quyidagicha ko'rinadi:
...
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_handlerKo'rib turganingizdek, ushbu kodning aksariyati Object Storage S3 interfeysiga ulanishni yaratadi. Ushbu ulanish to'g'ridan-to'g'ri qanday ishlatiladi, siz o'qishingiz mumkin .
Oxirgi qator funksiya yaratadi alice_handler - biz parametrni o'rnatganimizda Yandex.Cloud-ni tortib olishni buyurgan narsa --entrypoint=main.alice_handler.
Bu, aslida, hammasi. Qurilish uchun makefiles, kontekstni saqlash uchun S3-ga o'xshash Ob'ektlarni saqlash va python kutubxonasi tgalice. Pythonning serversiz xususiyatlari va ekspressivligi bilan birgalikda bu sog'lom odamning mahoratini rivojlantirish uchun etarli.
Siz nima uchun yaratishingiz kerakligini so'rashingiz mumkin tgalice? JSON-larni so'rovdan javobga, xotiradan xotiraga va orqaga o'tkazadigan barcha zerikarli kod unda yotadi. Bundan tashqari, muntazam dastur, "fevral" ning "fevral" ga o'xshashligini tushunish funktsiyasi va kambag'allar uchun boshqa NLU mavjud. Mening fikrimga ko'ra, bu texnik tafsilotlar bilan chalg'imasdan yaml fayllarida mahorat prototiplarini chizish uchun etarli bo'lishi kerak.
Agar siz jiddiyroq NLUni xohlasangiz, uni o'z mahoratingizga moslashtira olasiz yoki , lekin ularni o'rnatish, ayniqsa serversiz daf bilan qo'shimcha raqs qilishni talab qiladi. Agar kodlashni umuman xohlamasangiz, vizual turdagi konstruktordan foydalanishingiz kerak . Tgalice yaratishda men qandaydir oraliq yo'l haqida o'yladim. Keling, nima bo'lishini ko'rib chiqaylik.
Xo'sh, endi qo'shiling o'qing va ajoyib yarating !
Manba: www.habr.com
