Tilallisen taidon luominen Alicelle Yandex.Cloudin ja Pythonin palvelimettomissa toiminnoissa

Aloitetaan uutisista. Yandex.Cloud ilmoitti eilen palvelimettoman laskentapalvelun käynnistämisestä Yandex Cloud Functions. Tämä tarkoittaa: kirjoitat vain palvelusi koodin (esimerkiksi verkkosovelluksen tai chatbotin), ja pilvi itse luo ja ylläpitää virtuaalikoneita siellä, missä se toimii, ja jopa replikoi ne, jos kuormitus kasvaa. Sinun ei tarvitse ajatella ollenkaan, se on erittäin kätevää. Ja maksu menee vain laskelmien ajaksi.

Jotkut ihmiset eivät kuitenkaan välttämättä maksa ollenkaan. Nämä ovat kehittäjät Alicen ulkoiset taidot, eli siihen sisäänrakennetut chatbotit. Kuka tahansa kehittäjä voi kirjoittaa, isännöidä ja rekisteröidä tällaisen taidon, ja nykyään taitoja ei tarvitse edes isännöidä – lataa vain koodinsa pilveen muodossa sama palvelinton toiminto.

Mutta on pari vivahdetta. Ensinnäkin lemmikkikoodisi saattaa vaatia joitain riippuvuuksia, eikä ole triviaalia vetää niitä pilveen. Toiseksi, minkä tahansa normaalin chatbotin on tallennettava dialogin tila jonnekin (täten tilallinen); miten se tehdään palvelimettomalla toiminnolla helpoimmin? Kolmanneksi, kuinka voit kirjoittaa Alicelle nopean ja likaisen taidon tai jopa jonkinlaisen botin, jonka juoni ei ole nolla? Näistä vivahteista itse asiassa artikkeli.

Tilallisen taidon luominen Alicelle Yandex.Cloudin ja Pythonin palvelimettomissa toiminnoissa

moraalinen valmistautuminen

Kärsimättömälle: Kerään tarvittavat riippuvuudet make-tiedostolla ennen funktion lataamista pilveen, tallennan valintaikkunan tilan Yandex Object Storageen (se tukee S3 API:ta) ja käytän omaa kirjastoani dialogin hallintaan. tgalice. Tuloksena käy ilmi sellainen demo taito. Ja nyt analysoidaan tätä kaikkea hieman yksityiskohtaisemmin.

Hieman vähemmän kärsimättömille, ennen kuin sukeltaa monimutkaiseen tarinaani, suosittelen aloittamaan yksinkertaisesta. Nimittäin luo yksitiedostoinen echobot-toiminto, rekisteröi ja testaa se Dialog-kehittäjäkonsolissa; tiedot - sisään Blogivuoropuhelut и pilvidokumentaatio. Ja vasta sitten aloita.

Jos haluat heti tuntea sen, minkä puolesta taistelemme, kysy Alicelta.ota käyttöön taito "IT-horoskooppi"'. Seuraavan vuoropuhelun pitäisi käydä:

Alice: Hei! Olet "IT-horoskoopin" taidolla. Sano "Aloita" saadaksesi selville, mitä tähdet lupaavat sinulle.
Käyttäjä: Aloita
V: Kerro nimesi.
Yu: Vasisualy
V: Kerro nyt syntymävuotesi. Vain neljä numeroa, ei mitään muuta.
Yu: toinen
V: Yritä uudelleen. Ilmoita syntymävuotesi - neljä numeroa.
Yu: 2002
Suuri! Nimeä nyt syntymäkuukausi.
Yu: Helmikuu
V: Loistavaa! Kerro lopuksi syntymäaikasi - vain numero, vain yksi tai kaksi numeroa.
Yu: 18
V: Kiitos, Vasisual! Nyt tiedämme: olet 17-vuotias ja olet Vesimies. Tässä olet tietysti onnekas! Tähdet kertovat а что говорят звёзды, вы узнаете, запустив навык.

Ongelmana on, että jopa niin yksinkertaisen dialogin ylläpitämiseksi sinun on muistettava käyttäjän nimi ja syntymäaika, ja palvelimettomassa ympäristössä tämä ei ole triviaalia. Kontekstin tallentaminen RAM-muistiin tai tiedostona levylle ei toimi, koska Yandex.Cloud voi suorittaa toiminnon useissa virtuaalikoneissa samanaikaisesti ja vaihtaa niiden välillä mielivaltaisesti. Sinun on käytettävä jonkinlaista ulkoista tallennustilaa. Object Storage valittiin melko edulliseksi ja yksinkertaiseksi tallennuspaikaksi suoraan Yandex.Cloudissa (eli luultavasti nopea). Ilmaisena vaihtoehtona voit kokeilla esimerkiksi ilmaista kappaletta Pilvistä Mongi jossain kaukana. Sekä Object Storagessa (se tukee S3-liitäntää) että Mongossa on kätevät Python-kääreet.

Toinen ongelma on, että päästäksesi Object Storageen, MongoDB:hen ja mihin tahansa muuhun tietokantaan tai tietosäilöön, tarvitset joitain ulkoisia riippuvuuksia, jotka sinun on ladattava Yandex Functionsiin yhdessä toimintokoodisi kanssa. Ja haluaisin tehdä sen mukavasti. Se on täysin kätevä (kuten herokussa), valitettavasti se ei toimi, mutta voit luoda perusmukavuutta kirjoittamalla skriptin ympäristön rakentamiseksi (tee tiedosto).

Kuinka aloittaa horoskooppitaito

  1. Valmistaudu: mene johonkin koneeseen, jossa on Linux. Periaatteessa voit luultavasti työskennellä myös Windowsin kanssa, mutta silloin sinun täytyy loihtia makefile-käynnistyksen kanssa. Ja joka tapauksessa tarvitset vähintään 3.6 asennetun Pythonin.
  2. Klooni githubista esimerkki horoskoopin taidosta.
  3. Rekisteröidy Ya.Cloudissa: https://cloud.yandex.ru
  4. Luo itsellesi kaksi ämpäriä Objektien varastointi, kutsu niitä millä nimellä tahansa {BUCKET NAME} и tgalice-test-cold-storage (tämä toinen nimi on nyt kovakoodattu main.py minun esimerkkini). Ensimmäistä säilöä tarvitaan vain käyttöönottoa varten, toista - dialogitilojen tallentamiseen.
  5. luoda palvelutili, anna hänelle rooli editor, ja hanki sitä varten staattiset tunnistetiedot {KEY ID} и {KEY VALUE} - käytämme niitä vuoropuhelun tilan tallentamiseen. Kaikki tämä on tarpeen, jotta Ya.Cloudin toiminto voi käyttää Ya.Cloudin tallennustilaa. Toivon, että valtuuttaminen tulee jonain päivänä automaattiseksi, mutta toistaiseksi - niin.
  6. (Valinnainen) asennus komentorivin käyttöliittymä yc. Toiminnon voi luoda myös web-rajapinnan kautta, mutta CLI on hyvä, koska kaikenlaiset innovaatiot ilmestyvät siihen nopeammin.
  7. Nyt voit itse asiassa valmistella riippuvuuksien kokoonpanon: suorita komentorivillä kansiosta taitoesimerkillä make all. Kansioon asennetaan joukko kirjastoja (enimmäkseen, kuten tavallista, tarpeettomia). dist.
  8. Täytä kynillä Object Storage (ämpäriin {BUCKET NAME}) edellisessä vaiheessa hankittu arkisto dist.zip. Halutessasi voit tehdä tämän myös komentoriviltä, ​​esimerkiksi käyttämällä AWS CLI.
  9. Luo palvelimeton toiminto verkkokäyttöliittymän tai apuohjelman avulla yc. Apuohjelmassa komento näyttää tältä:

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

Kun funktio luodaan manuaalisesti, kaikki parametrit täytetään samalla tavalla.

Nyt luomaasi toimintoa voidaan testata kehittäjäkonsolin kautta ja sen jälkeen viimeistellä ja julkaista taitoja.

Tilallisen taidon luominen Alicelle Yandex.Cloudin ja Pythonin palvelimettomissa toiminnoissa

Mitä on konepellin alla

Makefile sisältää itse asiassa melko yksinkertaisen skriptin riippuvuuksien asentamiseen ja niiden sijoittamiseen arkistoon. dist.zip, jotain tällaista:

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

Loput ovat muutamia yksinkertaisia ​​työkaluja, jotka on kääritty kirjastoon tgalice. Käyttäjätietojen täyttöprosessi kuvataan konfiguraatiossa 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-luokka ottaa vastuulleen tämän konfiguraation jäsentämisen ja lopputuloksen laskemisen

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

Tarkemmin sanottuna perusluokka FormFillingDialogManager on mukana "lomakkeen" ja lapsiluokan menetelmän täyttämisessä handle_completed_form kertoo mitä tehdä, kun hän on valmis.

Tämän käyttäjän dialogin päävirran lisäksi on myös tarpeen tervehtiä käyttäjää, antaa apua "help"-komennolla ja vapauttaa taidosta "exit"-komennolla. Tätä varten sisään tgalice siellä on myös malli, joten koko dialogihallinta koostuu osista:

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 toimii yksinkertaisesti: se yrittää soveltaa dialogin nykyiseen tilaan vuorotellen kaikkia sen komponentteja ja valitsee ensimmäisen asiaankuuluvan.

Vastauksena jokaiseen viestiin dialoginhallinta palauttaa python-objektin Response, joka voidaan sitten muuntaa tavalliseksi tekstiksi tai viestiksi Alicessa tai Telegramissa - riippuen siitä, missä botti on käynnissä; se sisältää myös dialogin muuttuneen tilan, joka on tallennettava. Koko tätä keittiötä hoitaa toinen luokka, DialogConnector, joten suora komentosarja taidon aloittamiseksi Yandex Functionsissa näyttää tältä:

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

Kuten näet, suurin osa tästä koodista luo yhteyden Object Storage S3 -liittymään. Voit lukea kuinka tätä yhteyttä käytetään suoraan tgalice-koodissa.
Viimeinen rivi luo funktion alice_handler - se, jonka käskimme vetää Yandex.Cloud, kun asetimme parametrin --entrypoint=main.alice_handler.

Siinä itse asiassa kaikki. Makefiles rakentamiseen, S3-tyyppinen Object Storage kontekstin tallennusta varten ja python-kirjasto tgalice. Yhdessä pythonin palvelimettomien ominaisuuksien ja ilmaisukyvyn kanssa tämä riittää kehittämään terveen ihmisen taitoa.

Saatat kysyä, miksi sinun on luotava tgalice? Kaikki tylsä ​​koodi, joka siirtää JSONit pyynnöstä vastaukseen ja tallennustilasta muistiin ja takaisin, on siinä. Siellä on myös tavallinen sovellus, toiminto, jolla ymmärretään, että "helmikuu" on samanlainen kuin "helmikuu", ja muita köyhille tarkoitettuja NLU:ita. Ajatukseni mukaan tämän pitäisi jo riittää, jotta voidaan luonnostella taitojen prototyyppejä yaml-tiedostoihin ilman, että tekniset yksityiskohdat häiritsevät liikaa.

Jos haluat vakavamman NLU:n, voit korjata sen taitosi mukaan Rasa tai Syvä Pavlov, mutta niiden asettaminen vaatii lisää tanssimista tamburiinilla, varsinkin ilman palvelinta. Jos et halua koodata ollenkaan, sinun kannattaa käyttää visuaalisen tyypin konstruktoria Aimyloginen. Kun luon tgalicea, ajattelin jonkinlaista välipolkua. Katsotaan, mitä tapahtuu.

No, liity nyt Aliy-taitojen kehittäjäkeskustelu, lukea dokumentointija luoda hämmästyttäviä taitoja!

Lähde: will.com

Lisää kommentti