Cuminciamu cù a nutizia. Aieri Yandex.Cloud hà annunziatu u lanciamentu di un serviziu informaticu senza servitore . Questu significa: scrivite solu u codice per u vostru serviziu (per esempiu, una applicazione web o un chatbot), è u Cloud stessu crea è mantene e macchine virtuali induve corre, è ancu riplicà si a carica aumenta. Ùn avete bisognu di pensà à tuttu, hè assai cunvenutu. È u pagamentu hè solu per u tempu di calculu.
Tuttavia, certi ùn pò micca pagà in tuttu. Questi sò i sviluppatori , vale à dì, i chatbots integrati in questu. Ogni sviluppatore pò scrive, ospitu è registrà una tale abilità, è da oghje e cumpetenze ùn anu mancu bisognu di esse ospitu - basta à carica u so codice à u nuvulu in a forma .
Ma ci sò un paru di sfumature. Prima, u vostru codice di fossa pò esse bisognu di alcune dipendenze, è trascinà in u Cloud ùn hè micca triviale. Siconda, ogni chatbot normale hà bisognu di almacenà u statu di u dialogu in un locu (stateful dunque); Chì ghjè u modu più faciule per fà questu in una funzione senza servitore? In terzu, cumu pudete scrive una cumpetenza rapida è brutta per Alice o ancu un tipu di bot cù una trama micca zero? L'articulu hè, in fattu, di sti sfumature.

Preparazione morale
Per l'impatient: aghju cullucatu e dependenzii necessarii cù un makefile prima di cullà a funzione à u nuvulu, aghju guardatu u statu di u dialogu in Yandex Object Storage (supporta l'API S3), è aghju utilizatu a mo propria biblioteca per gestisce u dialogu. . À a fine si ne risulta abilità demo. Avà guardemu à tuttu questu in un pocu più di dettu.
Per quelli un pocu menu impazienti, prima di tuffà in a mo storia di cumplessità, vi cunsigliu assai di principià cù qualcosa di simplice. Vale à dì, crea una funzione echobot unicu file, registrate è pruvate in a cunsola di sviluppatore Dialogs; dettagli - in и . È solu dopu principià.
Se vulete sente immediatamente ciò chì ci battemu quì, dumandate à Alice "'. Un dialogu simile à i seguenti deve esse realizatu:
Alice : Salute ! Sò in l'abilità "IT Horoscope". Dite "Start" per sapè ciò chì e stelle vi prumettenu.
User: Start
A: Per piacè dichjarà u vostru nome
Yu: Vasisualiy
A: Avà dimmi l'annu di a to nascita. Solu quattru cifre, nunda in più.
Yu: secondu
A: Per piacè pruvate di novu. Inserite l'annu di a vostra nascita - quattru cifre.
Yu: 2002
A: Grande! Avà nome u vostru mese di nascita.
Yu: ferraghju
A: Grande! Infine, dimmi a vostra data di nascita - solu un numeru, solu unu o dui cifre.
Yu: 18
A: Grazie, Vasisualiy! Avà sapemu: avete 17 anni è un Aquarius. Ebbè, sicuru, site furtunatu ! E stelle vi dicenu : а что говорят звёзды, вы узнаете, запустив навык.
U prublema hè chì per mantene ancu un dialogu cusì simplice, avete bisognu di ricurdà u nome di l'utilizatore è a data di nascita, è in un ambiente di funzione senza servitore ùn hè micca trivial. Ùn serà micca pussibule di guardà u cuntestu in RAM o cum'è un schedariu nantu à u discu, perchè Yandex.Cloud pò eseguisce una funzione nantu à parechje macchine virtuali à u stessu tempu è cambià trà elli à vuluntà. You Mulateri Di L'avè aduprà qualchi tipu di almacenamentu esternu. U almacenamentu d'ughjettu hè statu sceltu cum'è un almacenamentu abbastanza prezzu è pocu cumplicatu direttamente in Yandex.Cloud (vale à dì, probabilmente veloce). Cum'è una alternativa libera, pudete pruvà, per esempiu, un pezzu liberu in un locu luntanu. Ci sò cunvene Python wrappers per u Object Storage (chì sustene l'interfaccia S3) è Mongo.
Un altru prublema hè chì per accede à l'Object Storage, MongoDB, è qualsiasi altra basa di dati o data store, avete bisognu di alcune dipendenze esterne chì deve esse caricate in Yandex Functions cù u vostru codice di funzione. E mi piacerebbe fà questu cunvenemente. Sfurtunatamente, ùn serà micca cumplettamente cunvene (cum'è in Heroku), ma qualchì cunsulazione basica pò esse creatu scrivendu un script per custruisce l'ambienti (fà u schedariu).
Cumu lancià una cumpetenza horoscope
- Preparate: cunnettatevi à qualsiasi macchina chì esegue Linux. In fondu, cù Windows Questu puderia probabilmente funziunà ancu, ma eseguisce u makefile richiederebbe un pocu di magia. È in ogni casu, avete bisognu di Python 3.6 o superiore installatu.
- Clona da Github .
- Registrate in Y.Cloud:
- Crea tù stessu dui secchi , chjamateli da ogni nome
{BUCKET NAME}иtgalice-test-cold-storage(Stu secondu nome hè avà codificatu in hardcoded inmain.pyu mo esempiu). U primu bucket serà necessariu solu per a implementazione, u sicondu - per almacenà stati di dialogu. - creà , dà li un rolu
editor, è uttene credenziali statiche per questu{KEY ID}и{KEY VALUE}- avemu aduprà per arregistrà u statu di u dialogu. Tuttu chistu hè necessariu per chì una funzione da Ya.Cloud pò accede à l'almacenamiento da Ya.Cloud. Un ghjornu, spergu, l'autorizazione diventerà automaticamente, ma per avà hè cusì. - (Opcional) installà
yc. Pudete ancu creà una funzione attraversu l'interfaccia web, ma u CLI hè bonu perchè ogni tipu d'innuvazioni appare più veloce. - Avà pudete veramente preparà l'assemblea di dipendenza: eseguite nantu à a linea di cummanda da u cartulare cù l'esempiu di cumpetenze
make all. Una mansa di biblioteche (a maiò, cum'è di solitu, innecessarii) seranu installate in u cartularedist. - Versate in u magazzinu d'ughjettu cù a manu (in u bucket
{BUCKET NAME}) archiviu ottenutu in u passu precedentedist.zip. Se vulete, pudete fà questu da a linea di cumanda, per esempiu, usendu . - Crea una funzione senza servitore via l'interfaccia web o utilizendu una utilità
yc. Per l'utilità, u cumandimu sarà cusì:
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=3sQuandu si crea manualmente una funzione, tutti i paràmetri sò riempiti in u listessu modu.
Avà a funzione chì avete creatu pò esse pruvata à traversu a cunsola di sviluppatore, è dopu l'abilità pò esse migliurata è publicata.

Chì ci hè sottu à u cappucciu
U makefile in realtà cuntene un script abbastanza simplice per installà dipendenze è mette in un archiviu dist.zip, circa cusì:
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 ./*U restu hè uni pochi di arnesi simplici impannillati in una biblioteca tgalice. U prucessu di riempimentu di dati di l'utilizatori hè descrittu da a cunfigurazione 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.U travagliu di analizà sta cunfigurazione è di calculà u risultatu finali hè pigliatu da a classe Python
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 responsePiù precisamente, a classa di basa FormFillingDialogManager tratta di cumpiendu u "formu", è u metudu di classi di u zitellu handle_completed_form li dice ciò chì deve fà quandu hè pronta.
In più di stu flussu principale di dialogu, l'utilizatore deve ancu esse salutatu, è ancu aiutu cù u cumandamentu "aiutu" è liberatu da l'abilità cù u cumandamentu "exit". Per questu scopu in tgalice Ci hè ancu un mudellu, cusì tuttu u gestore di dialogu hè custituitu di pezzi:
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 Funciona simpliciamente: prova à applicà tutti i so cumpunenti à u statu attuale di u dialogu à turnu, è selezziunate u primu apprupriatu.
U gestore di dialogu torna un oggettu Python cum'è risposta à ogni missaghju. Response, chì ponu esse cunvertiti in testu chjaru, o in un missaghju in Alice o Telegram - secondu induve u bot hè in esecuzione; cuntene ancu u statu cambiatu di u dialogu chì deve esse salvatu. Tutta sta cucina hè gestita da una altra classe, DialogConnector, cusì u script direttu per lancià una cumpetenza nantu à e Funzioni Yandex pare cusì:
...
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_handlerComu pudete vede, a maiò parte di stu codice crea una cunnessione à l'interfaccia S3 di Storage Object. Pudete leghje cumu sta cunnessione hè direttamente utilizata .
L'ultima linea crea a funzione alice_handler - u listessu chì avemu dettu à Yandex.Cloud per tirà quandu avemu stabilitu u paràmetru --entrypoint=main.alice_handler.
Hè tuttu, in realtà. Makefiles per l'assemblea, S3-like Object Storage per almacenà u cuntestu, è una biblioteca Python tgalice. Cumminatu cù e funzioni senza servitore è l'espressività di Python, questu hè abbastanza per sviluppà una capacità umana sana.
Pudete dumandà perchè era necessariu di creà tgalice? Tuttu u codice noioso chì trasferisce JSON da a dumanda à a risposta è da u almacenamentu à a memoria è torna in questu. Ci hè ancu una applicazione di codice regulare, una funzione per capisce chì "Febbraiu" hè simili à "Febbraiu", è altre NLU per i poveri. Sicondu a mo idea, questu deve esse digià abbastanza per chì pudete sketch out prototipi di cumpetenze in i schedari yaml senza esse troppu distrattu da i dettagli tecnichi.
Se vulete un NLU più seriu, pudete aghjunghje à a vostra abilità o , ma l'installazione di elli necessitarà balli supplementari cù un tamburinu, in particulare in serverless. Se ùn avete micca bisognu di codificà, duvete aduprà un constructore visuale cum'è . Quandu creanu tgalice, aghju pensatu à un tipu di caminu intermediu. Videmu ciò chì vene da questu.
Ebbè, avà unisciti , leghje , è crea maraviglia !
Source: www.habr.com
