Állapotjelző készség létrehozása Alice számára a Yandex.Cloud és a Python szerver nélküli funkcióin

Kezdjük a hírekkel. Tegnap a Yandex.Cloud bejelentette egy szerver nélküli számítástechnikai szolgáltatás elindítását Yandex Cloud Functions. Ez azt jelenti: Ön csak a szolgáltatásának (például egy webalkalmazásnak vagy egy chatbotnak) a kódját írja meg, a Cloud pedig maga hozza létre és karbantartja azokat a virtuális gépeket, ahol fut, sőt, ha a terhelés növekszik, le is replikálja azokat. Egyáltalán nem kell gondolkodni, nagyon kényelmes. A fizetés pedig csak a számítási időre vonatkozik.

Néhányan azonban egyáltalán nem fizetnek. Ezek a fejlesztők Alice külső képességei, vagyis a bele épített chatbotok. Bármely fejlesztő írhat, tárolhat és regisztrálhat egy ilyen képességet, és mától a készségeket nem is kell tárolni – elég csak feltölteni a kódját a felhőbe az űrlapon ugyanaz a szerver nélküli funkció.

De van egy-két árnyalat. Először is, a pitkódhoz szükség lehet bizonyos függőségekre, és ezeknek a felhőbe húzása nem triviális. Másodszor, minden normál chatbotnak el kell tárolnia valahol a párbeszéd állapotát (tehát állapotjelző); Mi a legegyszerűbb módja ennek egy szerver nélküli funkcióban? Harmadszor, hogyan lehet Alice-nek gyors és piszkos képességet írni, vagy akár valamilyen botot, amelynek nem nulla a cselekménye? A cikk valójában ezekről az árnyalatokról szól.

Állapotjelző készség létrehozása Alice számára a Yandex.Cloud és a Python szerver nélküli funkcióin

Erkölcsi felkészülés

Türelmetleneknek: a függvény felhőbe való feltöltése előtt makefile-lel összegyűjtöm a szükséges függőségeket, a párbeszédpanel állapotát a Yandex Object Storage-ban tárolom (támogatja az S3 API-t), és a párbeszédablakot saját könyvtárammal kezelem. tgalice. A végén kiderül ilyen demo készség. Most nézzük meg mindezt egy kicsit részletesebben.

Azok számára, akik kevésbé türelmetlenek, mielőtt belemerülnének a bonyolultságról szóló történetembe, azt javaslom, hogy kezdjenek valami egyszerűvel. Nevezetesen hozzon létre egy egyfájlos echobot függvényt, regisztrálja és tesztelje a Dialogs fejlesztői konzolban; részletek - be Párbeszédek blog и Felhő dokumentáció. És csak ezután kezdje el.

Ha azonnal érezni akarod, hogy miért harcolunk itt, kérdezd meg Alice-t.lehetővé teszi az „IT horoszkóp” képességet'. A következőhöz hasonló párbeszédnek kell létrejönnie:

Alice: Szia! Ön az „IT Horoszkóp” készségben jár. Mondja a „Start” kifejezést, hogy megtudja, mit ígérnek neked a csillagok.
Felhasználó: Indítás
V: Kérjük, adja meg a nevét
Yu: Vasisualiy
V: Most mondd meg a születésed évét. Csak négy számjegy, semmi extra.
Yu: második
V: Kérjük, próbálja újra. Írja be a születési évét - négy számjegy.
Yu: 2002
Nagy! Most nevezze meg születési hónapját.
Yu: Február
Nagy! Végül mondja meg a születési dátumát – csak egy szám, csak egy vagy két számjegy.
Yu: 18
V: Köszönöm, Vasisualiy! Most már tudjuk: 17 éves vagy és Vízöntő. Hát persze, hogy szerencsés vagy! A csillagok azt mondják: а что говорят звёзды, вы узнаете, запустив навык.

A probléma az, hogy egy ilyen egyszerű párbeszéd fenntartásához meg kell jegyezni a felhasználó nevét és születési dátumát, és ez egy szerver nélküli függvénykörnyezetben nem triviális. A kontextust nem lehet majd tárolni a RAM-ban vagy fájlként a lemezen, mert A Yandex.Cloud egyszerre több virtuális gépen is futtathat egy funkciót, és tetszés szerint válthat közöttük. Valamilyen külső tárolót kell használnia. Az Object Storage-t meglehetősen olcsó és egyszerű tárhelynek választották közvetlenül a Yandex.Cloudban (azaz valószínűleg gyors). Ingyenes alternatívaként kipróbálhat például egy ingyenes darabot Felhős Monga valahol a távolban. Vannak kényelmes Python-burkolók az Object Storage-hoz (amely támogatja az S3 interfészt) és a Mongo-hoz.

Egy másik probléma az, hogy az Object Storage, a MongoDB és bármely más adatbázis vagy adattár eléréséhez külső függőségekre van szükség, amelyeket a függvénykóddal együtt fel kell tölteni a Yandex Functionsba. És ezt szeretném kényelmesen megtenni. Sajnos nem lesz teljesen kényelmes (mint a Heroku-nál), de némi alapvető kényelem megteremthető, ha írunk egy szkriptet a környezet felépítéséhez (make file).

Hogyan indítsunk el egy horoszkóp-készséget

  1. Készülj fel: menj valami Linuxos gépre. Elvileg valószínűleg Windows-al is dolgozhatsz, de akkor kell varázsolni a makefile elindításával. És mindenesetre telepítenie kell legalább a Python 3.6-ot.
  2. Klónozz a Githubból példa a horoszkóp készségre.
  3. Regisztráció az Y.Cloudban: https://cloud.yandex.ru
  4. Hozz létre magadnak két vödröt Objektum tárolása, hívd őket bármilyen néven {BUCKET NAME} и tgalice-test-cold-storage (ez a második név most be van kódolva main.py az én példám). Az első vödörre csak a telepítéshez lesz szükség, a másodikra ​​a párbeszédpanel-állapotok tárolására.
  5. teremt szolgáltatási fiók, adj neki szerepet editor, és statikus hitelesítési adatokat szerezhet be hozzá {KEY ID} и {KEY VALUE} — ezek segítségével rögzítjük a párbeszéd állapotát. Minderre azért van szükség, hogy a Ya.Cloud egy funkciója hozzáférjen a Ya.Cloud tárhelyéhez. Egyszer, remélem, az engedélyezés automatikus lesz, de most ez így van.
  6. (Opcionális) telepítse parancssori felület yc. A webes felületen keresztül is lehet függvényt létrehozni, de a CLI azért jó, mert gyorsabban jelennek meg benne mindenféle újítások.
  7. Most már ténylegesen elkészítheti a függőségi összeállítást: futtassa a parancssorban a készségpéldával rendelkező mappából make all. Egy csomó könyvtár (többnyire, mint általában, szükségtelen) lesz telepítve a mappába dist.
  8. Öntse kézzel az objektumtárolóba (a vödörbe {BUCKET NAME}) az előző lépésben kapott archívum dist.zip. Ha szükséges, ezt megteheti a parancssorból, például a segítségével AWS CLI.
  9. Hozzon létre egy szerver nélküli funkciót a webes felületen vagy egy segédprogram segítségével yc. A segédprogram esetében a parancs így fog kinézni:

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

Függvény manuális létrehozásakor minden paraméter ugyanúgy kitöltésre kerül.

Mostantól a létrehozott funkció a fejlesztői konzolon keresztül tesztelhető, majd a készség továbbfejleszthető és publikálható.

Állapotjelző készség létrehozása Alice számára a Yandex.Cloud és a Python szerver nélküli funkcióin

Mi van a motorháztető alatt

A makefile valójában egy meglehetősen egyszerű szkriptet tartalmaz a függőségek telepítéséhez és archívumba helyezéséhez dist.zip, körülbelül így:

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

A többi néhány egyszerű eszköz egy könyvtárba csomagolva tgalice. A felhasználói adatok kitöltésének folyamatát a config írja le 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Ennek a konfigurációnak az elemzését és a végeredmény kiszámítását a Python osztály veszi át

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

Pontosabban az alaposztály FormFillingDialogManager az „űrlap” kitöltésével és a gyermekosztály módszerével foglalkozik handle_completed_form megmondja neki, mit tegyen, ha készen áll.

A párbeszéd ezen főfolyamatán túlmenően a felhasználót üdvözölni kell, valamint segítséget kell adni a „help” paranccsal, és fel kell szabadítani a készségtől az „exit” paranccsal. Erre a célra be tgalice Van egy sablon is, így a teljes párbeszédkezelő darabokból áll:

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 Egyszerűen működik: sorra megpróbálja alkalmazni az összes összetevőjét a párbeszéd aktuális állapotára, és kiválasztja az első megfelelőt.

A párbeszédkezelő minden üzenetre válaszként egy Python objektumot ad vissza. Response, amely ezután sima szöveggé, vagy Alice-ben vagy Telegram-ban üzenetté alakítható - attól függően, hogy a bot hol fut; tartalmazza a párbeszéd menteni kívánt megváltozott állapotát is. Ezt az egész konyhát egy másik osztály kezeli, DialogConnector, tehát a Yandex Functions készség elindításához szükséges közvetlen szkript így néz ki:

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

Mint látható, ennek a kódnak a nagy része kapcsolatot hoz létre az Object Storage S3 interfészével. Elolvashatja, hogyan használják ezt a kapcsolatot közvetlenül tgalice kódjában.
Az utolsó sor létrehozza a függvényt alice_handler — ugyanaz, amelyet a Yandex.Cloud-nak mondtunk, hogy húzza le a paraméter beállításakor --entrypoint=main.alice_handler.

Valójában ennyi. Makefiles az összeállításhoz, S3-szerű Object Storage a kontextus tárolására és egy Python könyvtár tgalice. A Python szerver nélküli funkcióival és kifejezőképességével kombinálva ez elegendő egy egészséges emberi képesség fejlesztéséhez.

Felmerülhet a kérdés, miért volt szükség az alkotásra tgalice? Ebben rejlik az összes unalmas kód, amely a JSON-okat a kérésről a válaszra, valamint a tárhelyről a memóriába és vissza továbbítja. Van egy normál kódalkalmazás is, egy funkció annak megértésére, hogy a „február” hasonló a „februárhoz”, és más NLU a szegények számára. Elképzelésem szerint ennek már elégnek kell lennie ahhoz, hogy yaml-fájlokban felvázolhassa a készségek prototípusait anélkül, hogy a technikai részletek túlzottan elzavarnák.

Ha komolyabb NLU-t szeretnél, azt a skilledhez kötheted Íz vagy Mély Pavlov, de felállításuk további táncokat igényel tamburával, különösen szerver nélküli esetén. Ha egyáltalán nincs kedve kódolni, használjon vizuális konstruktort, például Aimylogic. A tgalice létrehozásakor valami köztes útra gondoltam. Lássuk, mi sül ki ebből.

No, most csatlakozz alice készségek fejlesztő chat, olvas dokumentáció, és hozzon létre csodálatos készségeket!

Forrás: will.com

Hozzászólás