α
αΌαα
αΆααααααΎαααΆαα½αααΉαααααααΆαα ααΆαααΈαααα·ααα·α Yandex.Cloud ααΆααααααΆαααΈααΆαααΎαααααΎαααΆαααααΆαααααα»αααααΌααααααααααΆααααΆαααΈααα
ααααααΆαααΆααααα ααα»ααααα½αα
ααα½ααααα ααααΆαα·ααααααααΆααααΆαααααααα ααΆαααααααΊααΆα’αααα’αα·αααααα
ααα»ααααααΆα nuances αα½αα ααα½αα ααΈαα½α αααααΌαααααα α·ααα αΉαααααα’αααα’αΆα ααΆαααΆαααΆαα’αΆααααααα½αα ααα½α α αΎαααΆαα·αααααΆαααααααα»αααΆαα’αΌααα½αααΆαα αααα»ααααα ααΈααΈα chatbot ααααααΆααΆαα½αααααΌααααααΆαα»αααααΆαααΆααααααα’αααα ααααααααΆαα½α (ααΌα αααααααΆααααΆαααΆα); ααααααααΎααΆαααα»ααα»αααΆα serverless αα·ααΈααΆααααα½ααααα»α? ααΈααΈ ααΎβα’αααβα’αΆα βαααααβααααΆαβααααααβαα ααβαααααΆαα Alice α¬βααΌααααΈααβαααααα Bot αα½αα ααα½αβαααβααΆαβαααααβαα·αβααΌαααβαααβααααααΆ? α’αααΈ nuances ααΆααααααα αααα»αααΆααα·α, α’αααααα
ααΆααααα αααΈαααα
αααααΆααα’ααααα·αα
ααα’αααααααα αααα»ααααααΌαααΆαα’αΆαααααα
αΆαααΆα
αααΆαα½α makefile αα»αααααααα»ααα»αααΆααα
ααα αααα»ααααααΆαα»αααααΆαααΆααααααα’αααα
αααα»α Yandex Object Storage (ααΆααΆαααα S3 API) α αΎααααα»αααααΎαααααΆαααααααΆαααααα½ααααααααα»αααΎααααΈααααααααααααα’ααα
αααααΆααβα’αααβαααβαα·αβα
ααβα’αααααααβααααα·α
αα»αβααΉαβα
αΌαβαα
βαααα»αβααΏαβαααα»αααααΆαβααααβαααα»α αααα»αβααΌαβααααΆαβα²ααβα
αΆααααααΎαβααΆααααα αααααΊαααααΎααα»αααΆα echobot α―αααΆααααα½α α
α»αααααα αα·αααΆαααααααΆαα
αααα»ααα»αααΌαα’αααα’αα·αααααααααα’ααα ααααααΆααααα’α·α - αααα»α
ααααα·αααΎα’αααα
ααααΆαα’αΆααααααααααΆααα’αααΈα’αααΈαααααΎααααα»αααααα»αααααΌααα½α Alice '
α’αΆααΈαα αα½ααααΈ! α’ααααααα·ααααα»αααααΆα "IT horoscope"α αα·ααΆαααΆ "α
αΆααααααΎα" ααΎααααΈααααΎαα’αααΈαααααααΆααααααΆα’αααα
α’αααααααΎααααΆααα α
αΆααααααΎα
α
ααααΎαα ααΌααααααΆαααααααααααα’αααα
Yu: Vasisualy
α
ααααΎαα α₯α‘αΌαααααΆαααααα»αααΈααααΆαααααΎαααααα’αααα ααΆααααα½αααααααα ααααΆαα’αααΈαααααα
ααΌα ααΈααΈα
α
ααααΎαα ααΌαααααΆααΆααααααααα αααααΆααααααΆαααααΎαααααα’ααα - αα½ααααααα
ααΌα α’α α α’
α’ααα
αΆααα! α₯α‘αΌαααΆαααααααααααααΎαααααα’αααα
ααΌα αααα»αααα
α’ααα
αΆααα! α
α»ααααααααααΆαααααα»αααααααααααΆαααααΎαααααα’ααα - ααααΆααααααααα½αα¬ααΈααααααα
ααΌα α’α α α’
α
ααααΎαα α’ααα»αβααα αααΆ αααΈαααΌα! α₯α‘αΌααααααΎαααΉαα αΎαααΆα’αααααΆαα’αΆαα» 17 ααααΆαα αΎαα’αααααΊααΆ Aquarius α αα
ααΈαααα’ααααα·αααΆααααΆαααΆαα! ααααΆαααααΆααα’αααα Π° ΡΡΠΎ Π³ΠΎΠ²ΠΎΡΡΡ Π·Π²ΡΠ·Π΄Ρ, Π²Ρ ΡΠ·Π½Π°Π΅ΡΠ΅, Π·Π°ΠΏΡΡΡΠΈΠ² Π½Π°Π²ΡΠΊ.
αααα αΆααΊααΆ ααΎααααΈαααααΆααΌααααΈαααααα’ααααααΆαααααααααα α’αααααααΌαα
αα
αΆαααααα αα·αααααααααααΆαααααΎαααααα’αααααααΎααααΆαα α αΎααα
αααα»αααα·ααΆααΆααααααααΆααααΆαααΈααα ααααα·ααααααΆααΏαααΌα
ααΆα
αααααα ααΆααΉααα·αααααΎαααΆαααΎααααΈαααααΆαα»αααα·αααααα»α RAM α¬ααΆα―αααΆααα
ααΎααΆαααααααα Yandex.Cloud α’αΆα
ααααΎαααΆααα»αααΆααα
ααΎαααΆαααΈααα·αααα·αααΆα
αααΎααααα»αααααααα½α α αΎαααααΌααααΆααα½αααΆααΆαα’αααΎα
α·αααα α’αααααΉαααααΌαααααΎα§ααααααααα»αααΆααααα
αα½αα
ααα½αα Object Storage ααααΌαααΆαααααΎαααΎαααΆααα ααααα»αααααααααααα αα·αααΆαααααααααααΆαααα
αααα»α Yandex.Cloud (ααααααα ααααΆααΏα)α ααΆαααααΎαα₯ααα·ααααα α’αααα’αΆα
ααΆαααααα§ααΆα ααααα½ααα»ααααα₯ααα·ααααα
αααα αΆαα½ααααααΊααΆ ααΎααααΈα αΌααα ααΆαα Object Storage, MongoDB αα·α database α¬ data store ααΆαα½ααααααααα α’αααααααΌαααΆαααΆαα’αΆαααααααΆααααα αα½αα ααα½ααααα’αααααααΌα upload αα Yandex Functions αα½αααΆαα½αααΉα function code ααααα’αααα α αΎααααα»αα ααααααΎααΆααααααα½αα ααΆααΆααααα½αααΆαααααα»α (ααΌα ααΆαα ααΎ heroku) α’αΆα‘αΆ ααΆααΉααα·αααααΎαααΆααα ααα»ααααα’αααα’αΆα αααααΎαααΆααα½ααααααΆααΌαααααΆααα½αα ααα½ααααααΆααααααααααααΈαααΎααααΈαααααΎαααα·ααααΆα (αααααΎαα―αααΆα)α
ααααα αΆααααααΎαααααΆαα αααΆααΆααααα
- ααααααααα½αα α αΌααα ααΆαααααΆαααΈαααααααΆαα½αααΈαα»α α ααΆαααααΆααα α’ααααααα ααααΆα’αΆα ααααΎααΆαααΆαα½α Windows ααααα ααα»αααααααααΆααααα’αααααααΌα conjure ααΆαα½αααΉαααΆαα αΆααααααΎααα makefile αααα α αΎααααα»αααααΈααΆααααα α’αααααΉαααααΌαααΆααααΆαα αα ααΆαα 3.6 αααααΆαααα‘αΎα Python α
- ααααΌαααΈ github
α§ααΆα αααααααααΆα horoscope . - α
α»αααααααααα»α Ya.Cloudα
https://cloud.yandex.ru - αααααΎααααα½αα’αααααΈααα»α
ααααα»αααα»α α α αα½αααααΆααααααααΆαα½αα{BUCKET NAME}
ΠΈtgalice-test-cold-storage
(ααααααααααΆααααα₯α‘αΌαααααΌαααΆααααααααΆ hardcodemain.py
α§ααΆα ααααααααααα»α) α αα»αααΈαα½αααΉαααααΌαααΆααααααΆααααααΆαααΆααα±ααααααΎααααΆααααα»ααααα αα»αααΈααΈαααΊαααααΆαααααααΆαα»αααααΆαααΆααααα’ααα - αααααΎα
ααααΈααααΆαααα αααααα±ααααΆααααΌααα½ααΆααΈαα½ααeditor
αα·αααα½αααΆαααααααΆααααααΆαααα·αα·αααααααααΆααααΆα{KEY ID}
ΠΈ{KEY VALUE}
- ααΎαααΉαααααΎαα½αααΆααΎααααΈαααααααΆααααΆαααΆαααααΆαααααααΆα ααΆααα’αααααααΊααααΌαααΆαααΎααααΈα±αααα»αααΆαααΈ Ya.Cloud α’αΆα α αΌαααααΎααΆααααα»αααΈ Ya.Cloud α ααααααΆαα½α αααα»ααααααΉαααΆ ααΆαα’αα»ααααΆαααΉαααααΆααα ααΆααααααααααααα· ααα»αααααααααΆααααααααα - (ααααα
α
α·ααα) ααα‘αΎα
α ααα»α αααααΆαααααααΆααααΆααααααααΆ yc
. α’αααααα’αΆα αααααΎααα»αααΆαααΆααααα ααα»α αααααΆααααα αααααααΆαααα ααα»αααα CLI ααΊααα’αααααααΆαα αααααααα·ααααααααααααααα α‘αΎααα αααα»αααΆααΏαααΆααα»αα - α₯α‘αΌααααα’αααα’αΆα
αααα
αααΆααα½αααααα»αααααΆααααΆαα’αΆααααα: ααααΎαααΆαααΎαααααΆααααΆααααααααΆααΈααααΆαα½αα§ααΆα αααααααΆα
make all
. αααααΆααααα½αααΆα α (ααΆαα αααΎαααΌα ααααααΆ αα·αα αΆαααΆα α) ααΉαααααΌαααΆαααα‘αΎααα αααα»αααα―αααΆαdist
. - αααααααα·α
α
αΌααα
αααα»ααααααααααα»αααααα» (α
αΌααα
αααα»ααα»α
{BUCKET NAME}
) αααααααΆααααααα½αααΆααα ααα αΆααα»ααdist.zip
. ααααα·αααΎα ααααΆα α’αααααα’αΆα ααααΎααΆααΆαααΈαααααΆααααΆααααααααΆ α§ααΆα ααααααααααΎα’ααα’αααααΈα’αΆα . - αααααΎααα»αααΆα serverless ααΆααααα
ααα»α
αααααΆαααααααΆα α¬ααααΎα§αααααααααΎααααΆαα
yc
. αααααΆααα§αααααααααΎααααΆαα ααΆααααααααΆααΉαααΎααα ααΌα αααα
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
αα ααααααααΎααα»αααΆαααααα αααΆαααΆααααααααΆααα’ααααααΌαααΆααααααααΆαααααααΌα ααααΆα
α₯α‘αΌαααααα»αααΆααααα’αααααΆααααααΎαα’αΆα ααααΌαααΆαααΆαααααααΆαααααα»αααΌαα’αααα’αα·αααααα α αΎααααααΆααααααΆααααα αα αα·αααααα»αααααααΆαα
α’αααΈααααα ααααααααααΆαα
makefile αα·αβααΆβααΆαβααααααΈαβααΆααααβαα½αααβαααααΆααβααΆαβααα‘αΎαβααΆαα’αΆαααααβ αα·αβααΆααβαα½αααΆβαα
αααα»αβααααααΆαα dist.zip
, α’αααΈαα½αβααΌα
ααα:
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 ./*
αα
αααααΊααΆα§αααααααΆαααααα½αα
ααα½αααααα»ααααα»ααααααΆααα tgalice
. ααααΎαααΆαααααΆαααααααα·ααααααα’αααααααΎααααΆααααααΌαααΆααα·αααααΆααα 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: ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π΅ΡΡ ΡΠ°Π·. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ ΡΠΈΡΠ»ΠΎ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π²Π°Π΄ΡΠ°ΡΠΎΠ΅); ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ Π΄Π²Π΅ ΡΠΈΡΡΡ.
ααααΆαα 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 response
α
αααΆααααΆαααααα
ααα ααααΆααααΌαααααΆα FormFillingDialogManager
ααααΌαααΆαα
αΌααα½ααα
αααα»αααΆαααααα "αααααα" αα·ααα·ααΈααΆαααααααααααΆαααα»ααΆα handle_completed_form
ααααΆααααΈα’αααΈαααααααΌαααααΎαα
αααααΆααα½α
ααΆααα
ααααααααΈααΎααα αΌαααααΆααααααΆαααααααΆααααα’αααααααΎααα ααΆααα
αΆαααΆα
αααΎααααΈααααΆααααα’αααααααΎααααΆαα ααααΌα
ααΆααΆαα
αααααα½αααΎααΆααααααααΆ "αααα½α" αα·αααααααααΈααααΆααα
ααΎααΆααααααααΆ "α
αα" α αααααΆααααΆαααααα
αααα»α tgalice
ααΆααααΆαααααΌααααα ααΌα
αααααααααα·ααΈααααααααααααα’ααααΆααααΌαααααΌαααΆααααααΎαα‘αΎαααααααααα
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
ααααΎαααΆααααΆαααΆααααα ααΆααααΆααΆαα’αα»ααααα
ααααααααΆαααΆααα
αα
α»ααααααααααΆαααααααΆ ααΆααααΆαα»ααααααααααΆααΆααα α αΎαααααΎαααΎααααααααΆαααααααααααΌαα
ααΆααΆαααααΎααααα
ααΉαααΆαααΈαα½αα αααααα·ααΈααααααααααααα’αααααα‘ααααααα» python Response
αααα’αΆα
ααααααααα
ααΆα’αααααααααααΆ α¬ααΆααΆααα
αααα»α Alice α¬ Telegram - α’αΆαααααααΎααααααααα bot αααα»αααααΎαααΆαα ααΆααααΆαααααΆαααΆαααααΆααααααΌααααααα’αα αααααααΌαααΆααααααΆαα»αα ααααααΆαααΆααα’αααααααααΌαααΆαααααααααααααααααΆαααααααααα DialogConnector
ααΌα
ααααααααααΈαααααΆαααααααΆααααΆαα
αΆααααααΎαααααΆαααΎαα»αααΆα Yandex ααΎααα
ααΌα
αααα
...
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
ααΌα
αααα’αααα’αΆα
ααΎα ααΌααααααΆαα
αααΎααααααΎαααΆααααααΆαααα
α
ααα»α
αααααΆαα Object Storage S3 α αααααααααΆααααααΆαααααααααΌαααΆαααααΎαααααααΆααα’αααα’αΆα
α’αΆα
αααααΆααα
α»αααααααααααΎααα»αααΆααα½αα alice_handler
- αα½ααααααΎααααααΆα±ααααΆα Yandex.Cloud αα
αααααΎαααααααααΆαααΆαααααα --entrypoint=main.alice_handler
.
ααΆααα·ααα
ααΊααΆααα’ααα Makefiles for building, S3-like Object Storage for context storage, and a python library tgalice
. αα½αααΆαα½αααΉααααααααα·ααα αα·αααΆααααα
ααααα·αααα python ααααα·αααΆα server αααααΊαααααααααΆααααΎααααΈα’αα·ααααααααΆαααααααα»ααααααααΆααα»αααΆαααα’α
α’αααα’αΆα
αα½αααΆα ααα»α’αααΈααΆαααΆα’αααααααΌαααΆααααααΎα tgalice
? αααααΌααα½αα±αααα»αααΆααα’αααααααααα JSON ααΈααααΎαα
ααΆαααααΎααα αα·αααΈααΆααααα»ααα
α’αααα
αα
αΆα αα·αααΆαααααααααα·ααα
αααα»αααΆα ααΆααααΆααααααα·ααΈααααααΆααααα αα»αααΆααααααΆααααΆααααααΉαααΆ "αα»αααα" ααΊαααααααα
ααΉα "αα»αααα" αα·α NLU αααααααααααααΆααα’αααααααΈαααα αααααΆααααα·ααααααααα»α ααααα½ααααααααααααΆααα αΎα ααΎααααΈα’αΆα
ααΌαααααΌααααΆααααα»αα―αααΆα yaml ααααα·αααΆαααΆαααααΆααααααααααΆααααα’α·ααα
αα
αααααα
ααααα·αααΎα’αααα
ααααΆα NLU αααααααααααΆαααα α’αααα’αΆα
ααΈαααΆαα
ααΆαααααΆαααααα’αααα
α₯α‘αΌαααα ααΌαα
αΌααα½α
ααααα: www.habr.com