Loosst eis mat den Neiegkeeten ufänken. Gëschter huet Yandex.Cloud de Start vun engem serverlosen Rechenservice ugekënnegt . 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 , 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 .
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.

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 . Um Enn stellt sech eraus 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 и . An nëmmen dann ufänken.
Wann Dir direkt wëllt fille fir wat mir hei kämpfen, frot d'Alice ''. 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 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
- Virbereeden: Mellt Iech op all Maschinn un, déi op Linux leeft. Am Fong, mat Windows Dëst kéint wahrscheinlech och funktionéieren, awer d'Ausféierung vum Makefile géif e bësse Magie erfuerderen. An op alle Fall braucht Dir Python 3.6 oder méi héich installéiert.
- Klon et vu Github .
- Aschreiwen an Y.Cloud:
- Erstellt Iech zwee Eemer an , rufft se mat all Numm
{BUCKET NAME}иtgalice-test-cold-storage(Den zweeten Numm ass elo hardcoded anmain.pymäi Beispill). Den éischten Eemer gëtt nëmme gebraucht fir den Ofbau, deen zweeten - fir Dialogzoustand ze späicheren. - schafen , 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. - (Optional) installéieren
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. - 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éiertdist. - Pour an Object Storage mat der Hand (an den Eemer
{BUCKET NAME}) Archiv am virege Schrëtt krittdist.zip. Wann Dir wëllt, kënnt Dir dat aus der Kommandozeil maachen, zum Beispill, benotzt . - 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=3sWann 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.

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 responseMé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_handlerWé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 .
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 oder , 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 . Wann ech tgalice erstallt hunn, hunn ech un eng Zort Zwëschenwee geduecht. Mol kucken wat dovunner kënnt.
Ma, elo maacht mat , liesen , a schafen wonnerbar !
Source: will.com
