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

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. . A végén kiderül 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 и . És csak ezután kezdje el.
Ha azonnal érezni akarod, hogy miért harcolunk itt, kérdezd meg Alice-t.'. 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 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
- Előkészületek: jelentkezzen be bármelyik Linuxot futtató gépre. Alapvetően a következővel: Windows Ez valószínűleg működhetne, de a makefile futtatásához némi varázslatra lenne szükség. És mindenesetre telepíteni kell a Python 3.6-os vagy újabb verzióját.
- Klónozz a Githubból .
- Regisztráció az Y.Cloudban:
- Hozz létre magadnak két vödröt , hívd őket bármilyen néven
{BUCKET NAME}иtgalice-test-cold-storage(ez a második név most be van kódolvamain.pyaz é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. - teremt , 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. - (Opcionális) telepítse
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. - 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ábadist. - Öntse kézzel az objektumtárolóba (a vödörbe
{BUCKET NAME}) az előző lépésben kapott archívumdist.zip. Ha szükséges, ezt megteheti a parancssorból, például a segítségével . - 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=3sFü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ó.

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 responsePontosabban 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_handlerMint 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 .
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 vagy , 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 . A tgalice létrehozásakor valami köztes útra gondoltam. Lássuk, mi sül ki ebből.
No, most csatlakozz , olvas , és hozzon létre csodálatos !
Forrás: will.com
