Yandex.Cloud va Python-ning serversiz funksiyalarida Alice uchun davlat malakasini yaratish

Yangilikdan boshlaylik. Kecha Yandex.Cloud serversiz hisoblash xizmati ishga tushirilganini e'lon qildi Yandex bulut funktsiyalari. 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 Elisning tashqi qobiliyatlari, 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. bir xil serversiz funksiya.

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.

Yandex.Cloud va Python-ning serversiz funksiyalarida Alice uchun davlat malakasini yaratish

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. tgalice. Natijada, bu chiqadi bunday 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 Blog dialoglari и bulutli hujjatlar. Va shundan keyingina boshlang.

Agar biz nima uchun kurashayotganimizni darhol his qilishni istasangiz, Elisdan so'rang."IT munajjimlar bashorati" mahoratini yoqing'. 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 Bulutli Mongi 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

  1. Tayyor bo'ling: Linux bilan ishlaydigan mashinaga o'ting. Asosan, ehtimol siz Windows bilan ham ishlashingiz mumkin, ammo keyin makefile ishga tushirilishi bilan bog'lanishingiz kerak. Va har qanday holatda, sizga kamida 3.6 o'rnatilgan Python kerak bo'ladi.
  2. Github'dan klonlash munajjimlar bashorati mahoratining namunasi.
  3. Ya.Cloud-da ro'yxatdan o'ting: https://cloud.yandex.ru
  4. O'zingizga ikkita chelak yarating Ob'ektni saqlash, ularni istalgan nom bilan chaqiring {BUCKET NAME} и tgalice-test-cold-storage (bu otasining ismi endi qattiq kodlangan main.py mening misolim). Birinchi chelak faqat joylashtirish uchun kerak bo'ladi, ikkinchisi - dialog holatini saqlash uchun.
  5. yaratish xizmat hisobi, 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.
  6. (ixtiyoriy) o'rnatish buyruq qatori interfeysi yc. Bundan tashqari, veb-interfeys orqali funksiya yaratishingiz mumkin, ammo CLI yaxshi, chunki unda barcha turdagi yangiliklar tezroq paydo bo'ladi.
  7. 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.
  8. Ob'ektlarni saqlash joyiga qalam bilan to'ldiring (chelakga {BUCKET NAME}) oldingi bosqichda olingan arxiv dist.zip. Agar xohlasangiz, buni buyruq satridan ham qilishingiz mumkin, masalan, yordamida AWS CLI.
  9. 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=3s

Funktsiyani 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.

Yandex.Cloud va Python-ning serversiz funksiyalarida Alice uchun davlat malakasini yaratish

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 response

Aniqrog'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_handler

Ko'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 tgalice kodida.
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 Taste yoki Chuqur Pavlov, lekin ularni o'rnatish, ayniqsa serversiz daf bilan qo'shimcha raqs qilishni talab qiladi. Agar kodlashni umuman xohlamasangiz, vizual turdagi konstruktordan foydalanishingiz kerak Aimiyologik. Tgalice yaratishda men qandaydir oraliq yo'l haqida o'yladim. Keling, nima bo'lishini ko'rib chiqaylik.

Xo'sh, endi qo'shiling Aliy qobiliyatlarini ishlab chiquvchi suhbatio'qing hujjatlarva ajoyib yarating ko'nikmalar!

Manba: www.habr.com

a Izoh qo'shish