Skep 'n statige vaardigheid vir Alice op die bedienerlose funksies van Yandex.Cloud en Python

Kom ons begin met die nuus. Yandex.Cloud het gister die bekendstelling van 'n bedienerlose rekenaardiens aangekondig Yandex Wolk Funksies. Dit beteken: jy skryf net die kode van jou diens (byvoorbeeld 'n webtoepassing of 'n kletsbot), en die Wolk self skep en onderhou virtuele masjiene waar dit loop, en herhaal dit selfs as die vrag toeneem. Jy hoef glad nie te dink nie, dis baie gerieflik. En die betaling gaan slegs vir die tyd van berekeninge.

Sommige mense kan egter glad nie betaal nie. Dit is die ontwikkelaars Alice se eksterne vaardighede, dit wil sê, kletsbotte wat daarin ingebou is. Enige ontwikkelaar kan so 'n vaardigheid skryf, huisves en registreer, en van vandag af hoef vaardighede nie eers gehuisves te word nie - laai net hul kode op na die wolk in die vorm dieselfde bedienerlose funksie.

Maar daar is 'n paar nuanses. Eerstens kan jou troeteldierkode 'n paar afhanklikhede vereis, en dit is nie triviaal om dit na die Wolk te sleep nie. Tweedens, enige normale kletsbot moet die toestand van die dialoog iewers stoor (staatvol dus); hoe om dit die maklikste manier in 'n bedienerlose funksie te doen? Derdens, hoe kan jy 'n vinnige en vuil vaardigheid vir Alice of selfs 'n soort bot met 'n nie-nul plot skryf? Oor hierdie nuanses, in werklikheid, die artikel.

Skep 'n statige vaardigheid vir Alice op die bedienerlose funksies van Yandex.Cloud en Python

morele voorbereiding

Vir die ongeduldige: Ek versamel die nodige afhanklikhede met 'n make-lêer voordat ek die funksie na die wolk oplaai, ek stoor die toestand van die dialoog in Yandex Object Storage (dit ondersteun die S3 API), en ek gebruik my eie biblioteek om die dialoog te bestuur tgalice. As gevolg hiervan, blyk dit sulke demo vaardigheid. En laat ons dit alles in 'n bietjie meer detail ontleed.

Vir die effens minder ongeduldige, voordat jy in my storie van kompleksiteit duik, beveel ek sterk aan om eenvoudig te begin. Skep naamlik 'n enkellêer eggobot-funksie, registreer en toets dit in die Dialog-ontwikkelaarkonsole; besonderhede - in Blogdialoë и wolk dokumentasie. En dan eers begin.

As jy dadelik wil voel waarvoor ons veg, vra vir Alice 'skakel die vaardigheid "IT-horoskoop" aan'. Die volgende dialoog moet plaasvind:

Alice: Hallo! Jy is in die "IT-horoskoop"-vaardigheid. Sê "Begin" om uit te vind wat die sterre jou belowe.
Gebruiker: Begin
A: Meld asseblief jou naam.
Yu: Vasisualy
A: Vertel my nou die jaar van jou geboorte. Slegs vier syfers, niks meer nie.
Yu: tweede
A: Probeer asseblief weer. Noem die jaar van jou geboorte - vier syfers.
Yu: 2002
N wonderlike! Noem nou die maand van jou geboorte.
Yu: Februarie
N wonderlike! Ten slotte, vertel my jou geboortedatum - net 'n nommer, net een of twee syfers.
Yu: 18
A: Dankie, Vasisual! Nou weet ons: jy is 17 jaar oud en jy is 'n Waterman. Hier is jy natuurlik gelukkig! Die sterre vertel jou а что говорят звёзды, вы узнаете, запустив навык.

Die probleem is dat om selfs so 'n eenvoudige dialoog te handhaaf, jy die naam en geboortedatum van die gebruiker moet onthou, en in 'n bedienerlose omgewing is dit nie triviaal nie. Dit sal nie werk om die konteks in RAM of as 'n lêer op skyf te stoor nie, want Yandex.Cloud kan die funksie op verskeie virtuele masjiene gelyktydig laat loop en arbitrêr tussen hulle wissel. Jy sal 'n soort eksterne berging moet gebruik. Object Storage is gekies as 'n redelik goedkoop en eenvoudige berging direk in Yandex.Cloud (dit wil sê, waarskynlik vinnig). As 'n gratis alternatief kan jy byvoorbeeld 'n gratis stuk probeer Bewolk Mongi iewers ver. Beide Object Storage (dit ondersteun die S3-koppelvlak) en Mongo het gerieflike Python-omhulsels.

Nog 'n probleem is dat om na Object Storage, MongoDB en enige ander databasis of datawinkel te gaan, jy 'n paar eksterne afhanklikhede nodig het wat jy saam met jou funksiekode na Yandex Functions moet oplaai. En ek wil dit graag gemaklik doen. Dit is heeltemal gerieflik (soos op heroku), helaas, dit sal nie werk nie, maar jy kan basiese gemak skep deur 'n skrif te skryf om die omgewing te bou (maak lêer).

Hoe om die horoskoopvaardigheid te begin

  1. Maak gereed: gaan na een of ander masjien met Linux. In beginsel kan jy seker ook met Windows werk, maar dan moet jy toor met die bekendstelling van die makefile. En in elk geval, sal jy ten minste 3.6 geïnstalleerde Python nodig hê.
  2. Kloon vanaf github voorbeeld van 'n horoskoopvaardigheid.
  3. Registreer in Ya.Cloud: https://cloud.yandex.ru
  4. Skep vir jou twee emmers in Object berging, noem hulle op enige naam {BUCKET NAME} и tgalice-test-cold-storage (hierdie middelnaam is nou hardgekodeer in main.py my voorbeeld). Die eerste emmer sal slegs nodig wees vir ontplooiing, die tweede - vir die stoor van dialoogtoestande.
  5. Skep diens rekening, gee hom 'n rol editor, en kry statiese geloofsbriewe daarvoor {KEY ID} и {KEY VALUE} - ons sal dit gebruik om die toestand van die dialoog op te teken. Dit alles is nodig sodat die funksie van Ya.Cloud toegang tot die stoor van Ya.Cloud kan kry. Eendag, hoop ek, sal magtiging outomaties word, maar vir eers – so.
  6. (Opsioneel) installeer opdragreël-koppelvlak yc. Jy kan ook 'n funksie deur die webkoppelvlak skep, maar die CLI is goed omdat allerhande innovasies vinniger daarin verskyn.
  7. Nou kan jy in werklikheid die samestelling van afhanklikhede voorberei: hardloop op die opdragreël vanaf die gids met die vaardigheidsvoorbeeld make all. 'n Klomp biblioteke (meestal, soos gewoonlik, onnodig) sal in die gids geïnstalleer word dist.
  8. Vul met penne in Object Storage (in 'n emmer {BUCKET NAME}) die argief wat by die vorige stap verkry is dist.zip. As jy wil, kan jy dit ook vanaf die opdragreël doen, byvoorbeeld deur AWS CLI.
  9. Skep 'n bedienerlose funksie deur die webkoppelvlak of deur die hulpprogram te gebruik yc. Vir die nut sal die opdrag soos volg lyk:

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

Wanneer 'n funksie met die hand geskep word, word alle parameters op dieselfde manier ingevul.

Nou kan die funksie wat jy geskep het deur die ontwikkelaarkonsole getoets word, en dan gefinaliseer en gepubliseerde vaardigheid.

Skep 'n statige vaardigheid vir Alice op die bedienerlose funksies van Yandex.Cloud en Python

Wat is onder die enjinkap

Die makefile bevat eintlik 'n redelik eenvoudige skrif vir die installering van afhanklikhede en om dit in 'n argief te plaas. dist.zip, iets soos hierdie:

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

Die res is 'n paar eenvoudige gereedskap wat in 'n biblioteek toegedraai is tgalice. Die proses om gebruikersdata in te vul word beskryf deur die config 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Die luislangklas neem die werk oor om hierdie konfigurasie te ontleed en die finale resultaat te bereken

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

Meer presies, die basisklas FormFillingDialogManager is besig met die invul van die "vorm", en die metode van die kinderklas handle_completed_form vertel wat om te doen wanneer sy gereed is.

Benewens hierdie hoofvloei van die gebruiker se dialoog, is dit ook nodig om die gebruiker te groet, asook hulp uit te reik op die "help"-opdrag en vry te laat van die vaardigheid op die "exit"-opdrag. Hiervoor in tgalice daar is ook 'n sjabloon, so die hele dialoogbestuurder bestaan ​​uit stukke:

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 werk eenvoudig: dit probeer om al sy komponente op sy beurt toe te pas op die huidige toestand van die dialoog, en kies die eerste relevante een.

As 'n reaksie op elke boodskap gee die dialoogbestuurder 'n luislangvoorwerp terug Response, wat dan omgeskakel kan word in gewone teks, of in 'n boodskap in Alice of Telegram - afhangende van waar die bot loop; dit bevat ook die veranderde toestand van die dialoog wat gestoor moet word. Al hierdie kombuis word deur 'n ander klas hanteer, DialogConnector, so die direkte skrif vir die begin van 'n vaardigheid op Yandex Functions lyk soos volg:

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

Soos u kan sien, skep die meeste van hierdie kode 'n verbinding met die Object Storage S3-koppelvlak. Hoe hierdie verbinding direk gebruik word, kan jy lees in tgalice-kode.
Die laaste reël skep 'n funksie alice_handler - die een wat ons beveel het om Yandex.Cloud te trek toe ons die parameter stel --entrypoint=main.alice_handler.

Dit is eintlik al. Maak lêers vir die bou, S3-agtige objekberging vir konteksberging, en 'n luislang-biblioteek tgalice. Saam met die bedienerlose kenmerke en ekspressiwiteit van luislang, is dit genoeg om die vaardigheid van 'n gesonde persoon te ontwikkel.

Jy kan vra hoekom jy moet skep tgalice? Alle vervelige kode wat JSONs van versoek na reaksie en van berging na geheue en terug oordra, lê daarin. Daar is ook 'n gereelde toepassing, 'n funksie om te verstaan ​​dat "Februarie" soortgelyk is aan "Februarie", en ander NLU vir die armes. Volgens my idee behoort dit reeds genoeg te wees om vaardigheidsprototipes in yaml-lêers te kan skets sonder om te veel deur tegniese besonderhede afgelei te word.

As jy 'n meer ernstige NLU wil hê, kan jy dit aan jou vaardigheid skroef Rasa of DeepPavlov, maar om hulle op te stel sal bykomende dans met 'n tamboeryn vereis, veral op bedienerlose. As jy glad nie lus is vir kodering nie, moet jy die visuele tipe-konstruktor gebruik Aimylogic. Toe ek tgalice skep, het ek aan 'n soort tussenpad gedink. Kom ons kyk wat gebeur.

Wel, sluit nou aan Aliy vaardighede ontwikkelaar gesels, lees dokumentasieen skep ongelooflik vaardighede!

Bron: will.com

Voeg 'n opmerking