Creazione di una cumpetenza statale per Alice nantu à e funzioni serverless di Yandex.Cloud è Python

Cuminciamu cù a nutizia. Aieri Yandex.Cloud hà annunziatu u lanciamentu di un serviziu informaticu senza servitore Funzioni di Yandex Cloud. Questu significa: scrivite solu u codice per u vostru serviziu (per esempiu, una applicazione web o un chatbot), è u Cloud stessu crea è mantene e macchine virtuali induve corre, è ancu riplicà si a carica aumenta. Ùn avete bisognu di pensà à tuttu, hè assai cunvenutu. È u pagamentu hè solu per u tempu di calculu.

Tuttavia, certi ùn pò micca pagà in tuttu. Questi sò i sviluppatori E cumpetenze esterne di Alice, vale à dì, i chatbots integrati in questu. Ogni sviluppatore pò scrive, ospitu è ​​registrà una tale abilità, è da oghje e cumpetenze ùn anu mancu bisognu di esse ospitu - basta à carica u so codice à u nuvulu in a forma a stessa funzione serverless.

Ma ci sò un paru di sfumature. Prima, u vostru codice di fossa pò esse bisognu di alcune dipendenze, è trascinà in u Cloud ùn hè micca triviale. Siconda, ogni chatbot normale hà bisognu di almacenà u statu di u dialogu in un locu (stateful dunque); Chì ghjè u modu più faciule per fà questu in una funzione senza servitore? In terzu, cumu pudete scrive una cumpetenza rapida è brutta per Alice o ancu un tipu di bot cù una trama micca zero? L'articulu hè, in fattu, di sti sfumature.

Creazione di una cumpetenza statale per Alice nantu à e funzioni serverless di Yandex.Cloud è Python

Preparazione morale

Per l'impatient: aghju cullucatu e dependenzii necessarii cù un makefile prima di cullà a funzione à u nuvulu, aghju guardatu u statu di u dialogu in Yandex Object Storage (supporta l'API S3), è aghju utilizatu a mo propria biblioteca per gestisce u dialogu. tgalice. À a fine si ne risulta tali un abilità demo. Avà guardemu à tuttu questu in un pocu più di dettu.

Per quelli un pocu menu impazienti, prima di tuffà in a mo storia di cumplessità, vi cunsigliu assai di principià cù qualcosa di simplice. Vale à dì, crea una funzione echobot unicu file, registrate è pruvate in a cunsola di sviluppatore Dialogs; dettagli - in Blog di dialoghi и Documentazione cloud. È solu dopu principià.

Se vulete sente immediatamente ciò chì ci battemu quì, dumandate à Alice "attivà a cumpetenza "horoscope IT".'. Un dialogu simile à i seguenti deve esse realizatu:

Alice : Salute ! Sò in l'abilità "IT Horoscope". Dite "Start" per sapè ciò chì e stelle vi prumettenu.
User: Start
A: Per piacè dichjarà u vostru nome
Yu: Vasisualiy
A: Avà dimmi l'annu di a to nascita. Solu quattru cifre, nunda in più.
Yu: secondu
A: Per piacè pruvate di novu. Inserite l'annu di a vostra nascita - quattru cifre.
Yu: 2002
A: Grande! Avà nome u vostru mese di nascita.
Yu: ferraghju
A: Grande! Infine, dimmi a vostra data di nascita - solu un numeru, solu unu o dui cifre.
Yu: 18
A: Grazie, Vasisualiy! Avà sapemu: avete 17 anni è un Aquarius. Ebbè, sicuru, site furtunatu ! E stelle vi dicenu : а что говорят звёзды, вы узнаете, запустив навык.

U prublema hè chì per mantene ancu un dialogu cusì simplice, avete bisognu di ricurdà u nome di l'utilizatore è a data di nascita, è in un ambiente di funzione senza servitore ùn hè micca trivial. Ùn serà micca pussibule di guardà u cuntestu in RAM o cum'è un schedariu nantu à u discu, perchè Yandex.Cloud pò eseguisce una funzione nantu à parechje macchine virtuali à u stessu tempu è cambià trà elli à vuluntà. You Mulateri Di L'avè aduprà qualchi tipu di almacenamentu esternu. U almacenamentu d'ughjettu hè statu sceltu cum'è un almacenamentu abbastanza prezzu è pocu cumplicatu direttamente in Yandex.Cloud (vale à dì, probabilmente veloce). Cum'è una alternativa libera, pudete pruvà, per esempiu, un pezzu liberu Monga nuvoloso in un locu luntanu. Ci sò cunvene Python wrappers per u Object Storage (chì sustene l'interfaccia S3) è Mongo.

Un altru prublema hè chì per accede à l'Object Storage, MongoDB, è qualsiasi altra basa di dati o data store, avete bisognu di alcune dipendenze esterne chì deve esse caricate in Yandex Functions cù u vostru codice di funzione. E mi piacerebbe fà questu cunvenemente. Sfurtunatamente, ùn serà micca cumplettamente cunvene (cum'è in Heroku), ma qualchì cunsulazione basica pò esse creatu scrivendu un script per custruisce l'ambienti (fà u schedariu).

Cumu lancià una cumpetenza horoscope

  1. Preparate: andate à qualchì macchina cù Linux. In principiu, pudete probabilmente travaglià ancu cù Windows, ma allora avete da fà un pocu di magia cù lanciari u makefile. E in ogni casu, avete bisognu di almenu Python 3.6 installatu.
  2. Clona da Github esempiu di cumpetenza horoscope.
  3. Registrate in Y.Cloud: https://cloud.yandex.ru
  4. Crea tù stessu dui secchi Conservazione di l'ogni, chjamateli da ogni nome {BUCKET NAME} и tgalice-test-cold-storage (Stu secondu nome hè avà codificatu in hardcoded in main.py u mo esempiu). U primu bucket serà necessariu solu per a implementazione, u sicondu - per almacenà stati di dialogu.
  5. creà contu di serviziu, dà li un rolu editor, è uttene credenziali statiche per questu {KEY ID} и {KEY VALUE} - avemu aduprà per arregistrà u statu di u dialogu. Tuttu chistu hè necessariu per chì una funzione da Ya.Cloud pò accede à l'almacenamiento da Ya.Cloud. Un ghjornu, spergu, l'autorizazione diventerà automaticamente, ma per avà hè cusì.
  6. (Opcional) installà interfaccia di linea di cumanda yc. Pudete ancu creà una funzione attraversu l'interfaccia web, ma u CLI hè bonu perchè ogni tipu d'innuvazioni appare più veloce.
  7. Avà pudete veramente preparà l'assemblea di dipendenza: eseguite nantu à a linea di cummanda da u cartulare cù l'esempiu di cumpetenze make all. Una mansa di biblioteche (a maiò, cum'è di solitu, innecessarii) seranu installate in u cartulare dist.
  8. Versate in u magazzinu d'ughjettu cù a manu (in u bucket {BUCKET NAME}) archiviu ottenutu in u passu precedente dist.zip. Se vulete, pudete fà questu da a linea di cumanda, per esempiu, usendu AWS CLI.
  9. Crea una funzione senza servitore via l'interfaccia web o utilizendu una utilità yc. Per l'utilità, u cumandimu sarà cusì:

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

Quandu si crea manualmente una funzione, tutti i paràmetri sò riempiti in u listessu modu.

Avà a funzione chì avete creatu pò esse pruvata à traversu a cunsola di sviluppatore, è dopu l'abilità pò esse migliurata è publicata.

Creazione di una cumpetenza statale per Alice nantu à e funzioni serverless di Yandex.Cloud è Python

Chì ci hè sottu à u cappucciu

U makefile in realtà cuntene un script abbastanza simplice per installà dipendenze è mette in un archiviu dist.zip, circa cusì:

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

U restu hè uni pochi di arnesi simplici impannillati in una biblioteca tgalice. U prucessu di riempimentu di dati di l'utilizatori hè descrittu da a cunfigurazione 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

U travagliu di analizà sta cunfigurazione è di calculà u risultatu finali hè pigliatu da a classe 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

Più precisamente, a classa di basa FormFillingDialogManager tratta di cumpiendu u "formu", è u metudu di classi di u zitellu handle_completed_form li dice ciò chì deve fà quandu hè pronta.

In più di stu flussu principale di dialogu, l'utilizatore deve ancu esse salutatu, è ancu aiutu cù u cumandamentu "aiutu" è liberatu da l'abilità cù u cumandamentu "exit". Per questu scopu in tgalice Ci hè ancu un mudellu, cusì tuttu u gestore di dialogu hè custituitu di pezzi:

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 Funciona simpliciamente: prova à applicà tutti i so cumpunenti à u statu attuale di u dialogu à turnu, è selezziunate u primu apprupriatu.

U gestore di dialogu torna un oggettu Python cum'è risposta à ogni missaghju. Response, chì ponu esse cunvertiti in testu chjaru, o in un missaghju in Alice o Telegram - secondu induve u bot hè in esecuzione; cuntene ancu u statu cambiatu di u dialogu chì deve esse salvatu. Tutta sta cucina hè gestita da una altra classe, DialogConnector, cusì u script direttu per lancià una cumpetenza nantu à e Funzioni Yandex pare cusì:

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

Comu pudete vede, a maiò parte di stu codice crea una cunnessione à l'interfaccia S3 di Storage Object. Pudete leghje cumu sta cunnessione hè direttamente utilizata in codice tgalice.
L'ultima linea crea a funzione alice_handler - u listessu chì avemu dettu à Yandex.Cloud per tirà quandu avemu stabilitu u paràmetru --entrypoint=main.alice_handler.

Hè tuttu, in realtà. Makefiles per l'assemblea, S3-like Object Storage per almacenà u cuntestu, è una biblioteca Python tgalice. Cumminatu cù e funzioni senza servitore è l'espressività di Python, questu hè abbastanza per sviluppà una capacità umana sana.

Pudete dumandà perchè era necessariu di creà tgalice? Tuttu u codice noioso chì trasferisce JSON da a dumanda à a risposta è da u almacenamentu à a memoria è torna in questu. Ci hè ancu una applicazione di codice regulare, una funzione per capisce chì "Febbraiu" hè simili à "Febbraiu", è altre NLU per i poveri. Sicondu a mo idea, questu deve esse digià abbastanza per chì pudete sketch out prototipi di cumpetenze in i schedari yaml senza esse troppu distrattu da i dettagli tecnichi.

Se vulete un NLU più seriu, pudete aghjunghje à a vostra abilità Gustu o DeepPavlov, ma l'installazione di elli necessitarà balli supplementari cù un tamburinu, in particulare in serverless. Se ùn avete micca bisognu di codificà, duvete aduprà un constructore visuale cum'è Aimylogic. Quandu creanu tgalice, aghju pensatu à un tipu di caminu intermediu. Videmu ciò chì vene da questu.

Ebbè, avà unisciti chat di sviluppatore di capacità di alice, leghje documentazione, è crea maraviglia cumpetenze!

Source: www.habr.com

Add a comment