Erstellt eng statesch Fäegkeet fir Alice mat serverlosen Funktiounen vu Yandex.Cloud a Python

Loosst eis mat den Neiegkeeten ufänken. Gëschter huet Yandex.Cloud de Start vun engem serverlosen Rechenservice ugekënnegt Yandex Cloud Funktiounen. Dëst bedeit: Dir schreift nëmmen de Code fir Äre Service (zum Beispill eng Webapplikatioun oder e Chatbot), an d'Cloud selwer erstellt an ënnerhält déi virtuell Maschinnen wou se leeft, a replizéiert se souguer wann d'Laascht eropgeet. Dir braucht guer net ze denken, et ass ganz bequem. An d'Bezuelung ass nëmme fir d'Berechnungszäit.

Wéi och ëmmer, e puer kënnen guer net bezuelen. Dëst sinn d'Entwéckler Alice seng extern Fäegkeeten, dat heescht, Chatbots dra gebaut. All Entwéckler kann esou eng Fäegkeet schreiwen, hosten an registréieren, a vun haut un brauchen d'Fäegkeeten net emol gehost ze ginn - lued just hire Code an d'Wollek a Form erop déi selwecht Serverlos Funktioun.

Awer et ginn e puer Nuancen. Als éischt kann Äre Pitcode e puer Ofhängegkeeten erfuerderen, an se an d'Cloud ze zéien ass net trivial. Zweetens, all normale Chatbot muss den Zoustand vum Dialog iergendwou späicheren (stateful also); Wat ass deen einfachste Wee fir dëst an enger serverloser Funktioun ze maachen? Drëttens, wéi kënnt Dir eng séier an dreckeg Fäegkeet fir Alice schreiwen oder souguer eng Aart Bot mat engem Net-Null Komplott? Den Artikel ass tatsächlech iwwer dës Nuancen.

Erstellt eng statesch Fäegkeet fir Alice mat serverlosen Funktiounen vu Yandex.Cloud a Python

Moralesch Virbereedung

Fir déi Ongedëlleg: Ech sammelen déi néideg Ofhängegkeete mat engem Make-File ier ech d'Funktioun an d'Wollek eropluede, ech späicheren den Zoustand vum Dialog an der Yandex Object Storage (et ënnerstëtzt d'S3 API), an ech benotzen meng eege Bibliothéik fir den Dialog ze managen tgalice. Um Enn stellt sech eraus esou Demo Fäegkeet. Elo kucke mer dat alles e bësse méi am Detail.

Fir déi e bësse manner Ongedëlleg, ier ech a meng Geschicht iwwer Komplexitéit tauchen, recommandéieren ech staark mat eppes einfaches unzefänken. Nämlech eng Single-Datei Echobot Funktioun erstellen, registréiert an testen se an der Dialogs Entwéckler Konsol; Detailer - an Dialogen Blog и Cloud Dokumentatioun. An nëmmen dann ufänken.

Wann Dir direkt wëllt fille fir wat mir hei kämpfen, frot d'Alice 'aktivéiert d'Fäegkeet "IT Horoskop".'. En Dialog ähnlech wéi déi folgend soll geschéien:

Alice: Moien! Dir sidd an der "IT Horoskop" Fäegkeet. Sot "Start" fir erauszefannen wat d'Stären Iech verspriechen.
Benotzer: Start
A: Gitt weg Ären Numm
Yu: Vasisualiy
A: Sot mir elo d'Joer vun Ärer Gebuert. Nëmme véier Zifferen, näischt extra.
Yu: zweet
A: Probéiert w.e.g. nach eng Kéier. Gitt d'Joer vun Ärer Gebuert - véier Zifferen.
Joer: 2002
A: Super! Numm elo Äre Gebuerts Mount.
Yu: Februar
A: Super! Endlech, sot mir Äre Gebuertsdatum - just eng Zuel, just eng oder zwou Zifferen.
Joer: 18
A: Merci, Vasisualiy! Elo wësse mer: Dir sidd 17 Joer al an en Aquarius. Gutt, natierlech, Dir hutt Gléck! D'Stären soen Iech: а что говорят звёзды, вы узнаете, запустив навык.

De Problem ass datt fir esou en einfachen Dialog ze erhalen, musst Dir de Benotzernumm an de Gebuertsdatum erënneren, an an engem serverlosen Funktiounsëmfeld ass dëst net trivial. Et wäert net méiglech sinn de Kontext am RAM oder als Datei op Disk ze späicheren, well Yandex.Cloud kann eng Funktioun op e puer virtuelle Maschinnen zur selwechter Zäit lafen a wiesselen tëscht hinnen op Wëllen. Dir musst eng Zort extern Späichere benotzen. Object Storage gouf als zimlech preiswert an onkomplizéiert Späichere direkt an Yandex.Cloud gewielt (dh wahrscheinlech séier). Als gratis Alternativ kënnt Dir zum Beispill e gratis Stéck probéieren Wolleken Monga iergendwou wäit ewech. Et gi praktesch Python-Wrapper fir béid Object Storage (wat d'S3 Interface ënnerstëtzt) a Mongo.

En anere Problem ass datt fir Zougang zu Object Storage, MongoDB an all aner Datebank oder Dategeschäft ze kréien, braucht Dir e puer extern Ofhängegkeeten, déi op Yandex Functions zesumme mat Ärem Funktiounscode eropgeluede musse ginn. An ech wéilt dat bequem maachen. Leider wäert et net ganz bequem sinn (wéi op Heroku), awer e puer Basiskomfort kann erstallt ginn andeems Dir e Skript schreift fir d'Ëmwelt ze bauen (Fichier maachen).

Wéi lancéiert een en Horoskop Fäegkeet

  1. Preparéieren: gitt op eng Maschinn mat Linux. Am Prinzip kënnt Dir wahrscheinlech och mat Windows schaffen, awer da musst Dir Zauber maachen mat der Makefile ze lancéieren. An op alle Fall braucht Dir op d'mannst Python 3.6 installéiert.
  2. Klon et vu Github Beispill vun Horoskop Fäegkeet.
  3. Aschreiwen an Y.Cloud: https://cloud.yandex.ru
  4. Erstellt Iech zwee Eemer an Objekt Storage, rufft se mat all Numm {BUCKET NAME} и tgalice-test-cold-storage (Den zweeten Numm ass elo hardcoded an main.py mäi Beispill). Den éischten Eemer gëtt nëmme gebraucht fir den Ofbau, deen zweeten - fir Dialogzoustand ze späicheren.
  5. schafen Service Kont, gitt him eng Roll editor, a kritt statesch Umeldungsinformatiounen dofir {KEY ID} и {KEY VALUE} - mir benotze se fir den Zoustand vum Dialog opzehuelen. All dat ass néideg fir datt eng Funktioun vu Ya.Cloud op d'Späichere vu Ya.Cloud zougräifen. Iergendwann, hoffen ech, wäert d'Autorisatioun automatesch ginn, awer fir de Moment ass et esou.
  6. (Optional) installéieren Kommando Linn Interface yc. Dir kënnt och eng Funktioun duerch d'Web-Interface erstellen, awer de CLI ass gutt, well all Zorte vun Innovatiounen méi séier erschéngen.
  7. Elo kënnt Dir tatsächlech d'Ofhängegkeetsversammlung virbereeden: lafen op der Kommandozeil aus dem Dossier mam Fäegkeet Beispill make all. Eng Rëtsch Bibliothéiken (meeschtens, wéi gewinnt, onnéideg) ginn am Dossier installéiert dist.
  8. Pour an Object Storage mat der Hand (an den Eemer {BUCKET NAME}) Archiv am virege Schrëtt kritt dist.zip. Wann Dir wëllt, kënnt Dir dat aus der Kommandozeil maachen, zum Beispill, benotzt AWS CLI.
  9. Erstellt eng serverlos Funktioun iwwer de Webinterface oder mat engem Utility yc. Fir den Utility gesäit de Kommando esou aus:

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

Wann Dir eng Funktioun manuell erstellt, ginn all Parameteren op déiselwecht Manéier gefëllt.

Elo kann d'Funktioun déi Dir erstallt hutt duerch d'Entwécklerkonsol getest ginn, an da kann d'Fäegkeet verbessert a publizéiert ginn.

Erstellt eng statesch Fäegkeet fir Alice mat serverlosen Funktiounen vu Yandex.Cloud a Python

Wat ass ënnert der Hood

D'Makefile enthält tatsächlech e relativ einfache Skript fir Ofhängegkeeten z'installéieren an se an en Archiv ze setzen dist.zip, ongeféier esou:

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

De Rescht ass e puer einfach Tools, déi an enger Bibliothéik gewéckelt sinn tgalice. De Prozess fir d'Benotzerdaten auszefëllen gëtt vun der Configuratioun beschriwwen 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

D'Aarbecht fir dës Konfiguratioun ze analyséieren an d'Endresultat ze berechnen gëtt vun der Python Klass iwwerholl

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

Méi präzis, d'Basisklass FormFillingDialogManager beschäftegt sech mat der Ausfëllen vun der "Form", an der Kand Klass Method handle_completed_form seet hir wat ze maachen wann si prett ass.

Zousätzlech zu dësem Haaptfloss vum Dialog, muss de Benotzer och begréisst ginn, souwéi Hëllef mat dem Kommando "Hëllef" ginn an aus der Fäegkeet befreit mat dem Kommando "Exit". Fir dësen Zweck an tgalice Et gëtt och eng Schabloun, sou datt de ganzen Dialogmanager aus Stécker besteet:

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 Et funktionnéiert einfach: et probéiert all seng Komponenten op den aktuellen Zoustand vum Dialog ëmzegoen, a wielt déi éischt passend.

Den Dialog Manager gëtt e Python Objet als Äntwert op all Message zréck. Response, deen dann an einfachen Text ëmgewandelt ka ginn, oder an e Message an Alice oder Telegram - jee nodeem wou de Bot leeft; et enthält och de geännerten Zoustand vum Dialog, dee gespäichert muss ginn. Dës ganz Kichen gëtt vun enger anerer Klass gehandhabt, DialogConnector, also den direkten Skript fir eng Fäegkeet op Yandex Functions ze lancéieren gesäit esou aus:

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

Wéi Dir gesitt, erstellt de gréissten Deel vun dësem Code eng Verbindung mat der S3 Interface vun Object Storage. Dir kënnt liesen wéi dës Verbindung direkt benotzt gëtt an tgalice Code.
Déi lescht Linn erstellt d'Funktioun alice_handler - déi selwecht déi mir gesot hunn Yandex.Cloud ze zéien wann mir de Parameter setzen --entrypoint=main.alice_handler.

Dat ass alles, eigentlech. Maacht Dateie fir Assemblée, S3-ähnlech Objektlagerung fir Kontext ze späicheren, an eng Python-Bibliothéik tgalice. Kombinéiert mat de Serverlosen Funktiounen an Expressivitéit vum Python, ass dëst genuch fir eng gesond mënschlech Fäegkeet z'entwéckelen.

Dir kënnt froen firwat et néideg war ze kreéieren tgalice? All de langweilege Code deen JSONs vun Ufro op Äntwert a vu Späicheren op Erënnerung an zréck transferéiert läit dran. Et gëtt och eng regulär Code Applikatioun, eng Funktioun fir ze verstoen datt "Februar" ähnlech ass wéi "Februar", an aner NLU fir déi Aarm. No menger Iddi soll dëst scho genuch sinn fir datt Dir Prototypen vu Fäegkeeten an yaml Dateien skizzéiere kënnt ouni ze vill vun techneschen Detailer ofgelenkt ze ginn.

Wann Dir eng méi sérieux NLU wëllt, kënnt Dir et op Är Fäegkeet befestigen rasa oder DeepPavlov, mee ageriicht hinnen wäert zousätzlech dances mat enger tambourine verlaangen, virun allem op serverless. Wann Dir guer net Loscht hutt ze kodéieren, sollt Dir e visuelle Konstruktor benotzen wéi Aimylogic. Wann ech tgalice erstallt hunn, hunn ech un eng Zort Zwëschenwee geduecht. Mol kucken wat dovunner kënnt.

Ma, elo maacht mat alice Fäegkeetentwéckler Chat, liesen Dokumentatioun, a schafen wonnerbar Fäegkeeten!

Source: will.com

Setzt e Commentaire