Yandex.Cloud və Python-un serversiz funksiyaları üzrə Alice üçün statuslu bacarıq yaratmaq

Xəbərlərdən başlayaq. Dünən Yandex.Cloud serversiz hesablama xidmətinin istifadəyə verildiyini elan etdi Yandex Bulud funksiyaları. Bu o deməkdir ki: siz yalnız xidmətinizin kodunu yazırsınız (məsələn, veb proqram və ya chatbot) və Bulud özü işlədiyi yerdə virtual maşınlar yaradır və onlara xidmət göstərir və hətta yük artarsa ​​onları təkrarlayır. Heç düşünmək lazım deyil, çox rahatdır. Və ödəniş yalnız hesablamalar zamanı gedir.

Ancaq bəzi insanlar ümumiyyətlə ödəməyə bilər. Bunlar tərtibatçılardır Alisin xarici bacarıqları, yəni ona quraşdırılmış chatbotlar. İstənilən tərtibatçı belə bir bacarığı yaza, qəbul edə və qeydiyyatdan keçirə bilər və bu gündən etibarən bacarıqların yerləşdirilməsinə belə ehtiyac yoxdur – sadəcə olaraq öz kodunu formada buludlara yükləyin eyni serversiz funksiya.

Ancaq bir neçə nüans var. Birincisi, ev heyvanınızın kodu bəzi asılılıqlar tələb edə bilər və onları Buluda sürükləmək əhəmiyyətsiz deyil. İkincisi, hər hansı bir normal chatbot dialoqun vəziyyətini bir yerdə saxlamalıdır (buna görə də statuslu); serversiz funksiyada bunu necə etmək olar? Üçüncüsü, Alice üçün sürətli və çirkli bir bacarıq və ya hətta sıfırdan fərqli bir süjetli bir növ bot necə yaza bilərsiniz? Bu nüanslar haqqında, əslində, məqalə.

Yandex.Cloud və Python-un serversiz funksiyaları üzrə Alice üçün statuslu bacarıq yaratmaq

mənəvi hazırlıq

Səbirsizlər üçün: Funksiyanı buludda yükləməzdən əvvəl makefile ilə lazımi asılılıqları toplayıram, dialoqun vəziyyətini Yandex Obyekt Yaddaşında saxlayıram (o, S3 API-ni dəstəkləyir) və dialoqu idarə etmək üçün öz kitabxanamdan istifadə edirəm. tgalice. Nəticədə belə çıxır belə demo bacarığı. İndi isə gəlin bütün bunları bir az daha ətraflı təhlil edək.

Daha az səbirsiz olanlar üçün, mənim mürəkkəblik hekayəmə dalmadan əvvəl, sadə başlamağı tövsiyə edirəm. Məhz, tək fayllı echobot funksiyası yaradın, onu Dialoq tərtibatçı konsolunda qeydiyyatdan keçirin və sınayın; təfərrüatlar - in Bloq Dialoqları и bulud sənədləri. Və yalnız bundan sonra başlayın.

Nə üçün mübarizə apardığımızı dərhal hiss etmək istəyirsinizsə, Alicedən soruşun."IT ulduz falı" bacarığını işə salın'. Aşağıdakı dialoq aparılmalıdır:

Alice: Salam! Siz "IT ulduz falı" bacarığındasınız. Ulduzların sizə nə vəd etdiyini öyrənmək üçün "Başla" deyin.
İstifadəçi: Başlayın
A: Zəhmət olmasa adınızı qeyd edin.
Yu: Vasisuly
Cavab: İndi mənə doğum ilini de. Yalnız dörd rəqəm, başqa heç nə.
Yu: ikinci
A: Lütfən, yenidən cəhd edin. Doğulduğunuz ili qeyd edin - dörd rəqəm.
Yu: 2002
Böyük! İndi doğum ayı adlandırın.
Yu: Fevral
Böyük! Nəhayət, mənə doğum tarixinizi deyin - sadəcə bir rəqəm, yalnız bir və ya iki rəqəm.
Yu: 18
A: Təşəkkür edirəm, Vasisal! İndi bilirik: 17 yaşın var və Dolça bürcüsən. Burada, əlbəttə ki, şanslısınız! Ulduzlar deyir а что говорят звёзды, вы узнаете, запустив навык.

Problem ondadır ki, belə sadə dialoqu saxlamaq üçün istifadəçinin adını və doğum tarixini yadda saxlamaq lazımdır və serversiz mühitdə bu, əhəmiyyətsiz deyil. Konteksti RAM-da və ya diskdə fayl kimi saxlamaq işləməyəcək, çünki Yandex.Cloud funksiyanı eyni vaxtda bir neçə virtual maşında işlədə və onlar arasında özbaşına keçid edə bilər. Bir növ xarici yaddaşdan istifadə etməli olacaqsınız. Obyekt Storage birbaşa Yandex.Cloud-da (yəni, yəqin ki, sürətli) kifayət qədər ucuz və sadə saxlama yeri kimi seçildi. Pulsuz bir alternativ olaraq, məsələn, pulsuz bir parça cəhd edə bilərsiniz Buludlu Mongi uzaq bir yerdə. Həm Object Storage (o, S3 interfeysini dəstəkləyir), həm də Mongo rahat Python sarğılarına malikdir.

Başqa bir problem Obyekt Yaddaşına, MongoDB-yə və hər hansı digər verilənlər bazasına və ya məlumat anbarına getmək üçün funksiya kodunuzla birlikdə Yandex Funksiyalarına yükləməli olduğunuz bəzi xarici asılılıqlara ehtiyacınız olmasıdır. Və mən bunu rahat etmək istərdim. Tamamilə rahatdır (heroku-da olduğu kimi), təəssüf ki, işləməyəcək, ancaq mühit yaratmaq üçün skript yazmaqla bəzi əsas rahatlıq yarada bilərsiniz (fayl yaratmaq).

Bürclər bacarığına necə başlamaq olar

  1. Hazır olun: Linux ilə hansısa maşına gedin. Prinsipcə, yəqin ki, Windows ilə də işləyə bilərsiniz, lakin sonra makefile-nin işə salınması ilə ağlınıza gəlməli olacaqsınız. Və hər halda, sizə ən azı 3.6 quraşdırılmış Python lazımdır.
  2. Github-dan klon ulduz falı bacarığının nümunəsi.
  3. Ya.Cloud-da qeydiyyatdan keçin: https://cloud.yandex.ru
  4. Özünüzə iki vedrə yaradın Obyekt Anbarı, onları istənilən adla çağırın {BUCKET NAME} и tgalice-test-cold-storage (bu orta ad indi kodlaşdırılıb main.py mənim nümunəm). Birinci vedrə yalnız yerləşdirmə üçün, ikincisi - dialoq vəziyyətlərini saxlamaq üçün lazım olacaq.
  5. yaratmaq xidmət hesabı, ona rol verin editor, və bunun üçün statik etimadnaməsini əldə edin {KEY ID} и {KEY VALUE} - dialoqun vəziyyətini qeyd etmək üçün onlardan istifadə edəcəyik. Bütün bunlar Ya.Cloud-dan olan funksiyanın Ya.Cloud-dan yaddaşa daxil ola bilməsi üçün lazımdır. Nə vaxtsa, ümid edirəm, avtorizasiya avtomatik olacaq, amma hələlik - belə.
  6. (İstəyə görə) quraşdırın komanda xətti interfeysi yc. Siz həmçinin veb interfeysi vasitəsilə funksiya yarada bilərsiniz, lakin CLI yaxşıdır, çünki bütün növ yeniliklər onda daha sürətli görünür.
  7. İndi, əslində, asılılıqların yığılmasını hazırlaya bilərsiniz: bacarıq nümunəsi ilə qovluqdan əmr satırında işləyin. make all. Qovluqda bir dəstə kitabxana (əsasən, həmişəki kimi, lazımsız) quraşdırılacaq. dist.
  8. Obyekt Yaddaşına qələmlərlə doldurun (bir vedrəyə {BUCKET NAME}) əvvəlki addımda əldə edilmiş arxiv dist.zip. İstəyirsinizsə, bunu əmr satırından da edə bilərsiniz, məsələn, istifadə edərək AWS CLI.
  9. Veb interfeysi və ya yardım proqramından istifadə edərək serversiz funksiya yaradın yc. Utilit üçün əmr belə görünəcək:

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

Funksiyanı əl ilə yaratarkən bütün parametrlər eyni şəkildə doldurulur.

İndi yaratdığınız funksiya inkişaf etdirici konsolu vasitəsilə sınaqdan keçirilə, sonra yekunlaşdırılaraq bacarıq dərc oluna bilər.

Yandex.Cloud və Python-un serversiz funksiyaları üzrə Alice üçün statuslu bacarıq yaratmaq

Başlıq altında nə var

Makefile əslində asılılıqları quraşdırmaq və onları arxivə yerləşdirmək üçün kifayət qədər sadə skript ehtiva edir. dist.zip, bu kimi bir şey:

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 ./*

Qalanları kitabxanaya bükülmüş bir neçə sadə alətdir tgalice. İstifadəçi məlumatlarının doldurulması prosesi konfiqurasiya ilə təsvir olunur 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 sinfi bu konfiqurasiyanın təhlili və yekun nəticənin hesablanması işini öz üzərinə götürür

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

Daha doğrusu, əsas sinif FormFillingDialogManager “forma”nın doldurulması ilə məşğul olur və uşaq sinfinin metodu handle_completed_form hazır olduqda nə edəcəyini söyləyir.

İstifadəçinin dialoqunun bu əsas axınına əlavə olaraq, istifadəçini salamlamaq, həmçinin "kömək" əmri ilə yardım vermək və "çıxış" əmri ilə bacarıqdan azad etmək lazımdır. Bunun üçün in tgalice şablon da var, ona görə də bütün dialoq meneceri parçalardan ibarətdir:

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 sadə işləyir: dialoqun hazırkı vəziyyətinə onun bütün komponentlərini növbə ilə tətbiq etməyə çalışır və birinci müvafiq olanı seçir.

Hər mesaja cavab olaraq dialoq meneceri python obyektini qaytarır Response, daha sonra düz mətnə ​​və ya Alice və ya Telegram-da mesaja çevrilə bilər - botun harada işlədiyindən asılı olaraq; o, həmçinin saxlanmalı olan dialoqun dəyişdirilmiş vəziyyətini ehtiva edir. Bütün bu mətbəx başqa sinif tərəfindən idarə olunur, DialogConnector, buna görə Yandex Funksiyalarında bir bacarıq başlamaq üçün birbaşa skript belə görünür:

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

Gördüyünüz kimi, bu kodun əksəriyyəti Object Storage S3 interfeysi ilə əlaqə yaradır. Bu əlaqənin birbaşa necə istifadə edildiyini oxuya bilərsiniz tgalice kodunda.
Sonuncu sətir funksiya yaradır alice_handler - parametri təyin edərkən Yandex.Cloud-u çəkməyi əmr etdiyimiz --entrypoint=main.alice_handler.

Əslində, hamısı budur. Tikinti üçün makefiles, kontekst saxlama üçün S3-ə bənzər Obyekt Yaddaşı və python kitabxanası tgalice. Python-un serversiz xüsusiyyətləri və ifadəliliyi ilə birlikdə bu, sağlam insanın bacarığını inkişaf etdirmək üçün kifayətdir.

Niyə yaratmalı olduğunuzu soruşa bilərsiniz tgalice? JSON-ları sorğudan cavaba, yaddaşdan yaddaşa və arxaya köçürən bütün darıxdırıcı kodlar ondadır. Daimi bir tətbiq, "Fevral" ın "Fevral" a bənzər olduğunu anlamaq üçün bir funksiya və yoxsullar üçün digər NLU var. Fikrimə görə, bu, texniki detallardan çox yayınmadan yaml fayllarında bacarıq prototiplərinin eskizini çəkə bilmək üçün artıq kifayət olmalıdır.

Daha ciddi bir NLU istəyirsənsə, onu öz bacarığına çevirə bilərsən Rasa və ya Dərin Pavlov, lakin onları qurmaq, xüsusən də serversiz rejimdə qavalla əlavə rəqs tələb edəcək. Əgər kodlaşdırmanı ümumiyyətlə istəmirsinizsə, vizual tip konstruktordan istifadə etməlisiniz Aimylogic. Tgalice yaratarkən bir növ ara yol haqqında düşündüm. Gəlin görək nə baş verir.

Yaxşı, indi qoşul Aliy bacarıqları inkişaf etdirici söhbətioxumaq sənədlərvə heyrətamiz yaradır bacarıqlar!

Mənbə: www.habr.com

Добавить комментарий