Yandex.Cloud සහ Python හි සේවාදායක රහිත කාර්යයන් මත ඇලිස් සඳහා රාජ්‍ය නිපුණතාවයක් නිර්මාණය කිරීම

අපි ප්‍රවෘත්ති වලින් පටන් ගනිමු. ඊයේ Yandex.Cloud සේවාදායක රහිත පරිගණක සේවාවක් දියත් කරන බව නිවේදනය කළේය Yandex Cloud කාර්යයන්. මෙයින් අදහස් වන්නේ: ඔබ ලියන්නේ ඔබේ සේවාවේ කේතය (උදාහරණයක් ලෙස, වෙබ් යෙදුමක් හෝ චැට්බෝට් එකක්) පමණක් වන අතර, ක්ලවුඩ් විසින්ම එය ක්‍රියාත්මක වන අතථ්‍ය යන්ත්‍ර නිර්මාණය කර පවත්වා ගෙන යන අතර බර වැඩි වුවහොත් ඒවා ප්‍රතිවර්තනය කරයි. ඔබ කිසිසේත් සිතිය යුතු නැත, එය ඉතා පහසු ය. සහ ගෙවීම් යන්නේ ගණනය කිරීම් කාලය සඳහා පමණි.

කෙසේ වෙතත්, සමහර අය කිසිසේත් ගෙවිය නොහැක. මේ තමයි සංවර්ධකයින් ඇලිස්ගේ බාහිර කුසලතා, එනම්, එය තුළ ගොඩනගා ඇති chatbots. ඕනෑම සංවර්ධකයෙකුට එවැනි නිපුණතාවයක් ලිවීමට, සත්කාරකත්වය දැක්වීමට සහ ලියාපදිංචි කිරීමට හැකි අතර, අද සිට නිපුණතා සත්කාරකත්වය දැක්වීමට අවශ්‍ය නොවේ - පෝරමයේ වලාකුළට ඔවුන්ගේ කේතය උඩුගත කරන්න එකම serverless function එක.

නමුත් සූක්ෂ්ම කරුණු කිහිපයක් තිබේ. පළමුව, ඔබේ සුරතල් කේතයට යම් පරායත්තතා අවශ්‍ය විය හැකි අතර, ඒවා වලාකුළට ඇද දැමීම සුළුපටු නොවේ. දෙවනුව, ඕනෑම සාමාන්‍ය චැට්බොට් එකකට සංවාදයේ තත්වය කොතැනක හෝ ගබඩා කිරීමට අවශ්‍ය වේ (එබැවින් රාජ්‍යමය); පහසුම ක්‍රමය ලෙස serverless function එකකින් එය කරන්නේ කෙසේද? තෙවනුව, ඔබට ඇලිස් සඳහා ඉක්මන් අපිරිසිදු කුසලතාවක් හෝ ශුන්‍ය නොවන කුමන්ත්‍රණයක් සහිත යම් ආකාරයක බොට් එකක් ලිවිය හැක්කේ කෙසේද? මෙම සූක්ෂ්මතා ගැන, ඇත්ත වශයෙන්ම, ලිපිය.

Yandex.Cloud සහ Python හි සේවාදායක රහිත කාර්යයන් මත ඇලිස් සඳහා රාජ්‍ය නිපුණතාවයක් නිර්මාණය කිරීම

සදාචාරාත්මක සූදානම

නොඉවසිලිමත් අය සඳහා: මම ශ්‍රිතය වලාකුළට උඩුගත කිරීමට පෙර අවශ්‍ය පරායත්තයන් සාදන ගොනුවක් සමඟ එකතු කරමි, මම Yandex Object Storage හි සංවාදයේ තත්වය ගබඩා කරමි (එය S3 API සඳහා සහය දක්වයි), සහ සංවාදය කළමනාකරණය කිරීමට මම මගේම පුස්තකාලය භාවිතා කරමි. tgalice. ප්රතිඵලයක් වශයෙන්, එය හැරෙනවා එවැනි demo කුසලතාව. දැන් අපි මේ සියල්ල ටිකක් විස්තරාත්මකව විශ්ලේෂණය කරමු.

තරමක් නොඉවසිලිමත් අය සඳහා, මගේ සංකීර්ණත්වය පිළිබඳ කතාවට කිමිදීමට පෙර, සරලව ආරම්භ කිරීමට මම තරයේ නිර්දේශ කරමි. එනම්, තනි ගොනු echobot ශ්‍රිතයක් සාදන්න, එය Dialog සංවර්ධක කොන්සෝලය තුළ ලියාපදිංචි කර පරීක්ෂා කරන්න; විස්තර - තුළ බ්ලොග් සංවාද и වලාකුළු ලේඛන. සහ පසුව පමණක් ආරම්භ කරන්න.

අප සටන් කරන්නේ කුමක් දැයි ඔබට වහාම දැනෙන්නට අවශ්‍ය නම්, ඇලිස්ගෙන් විමසන්න."IT කේන්දර" කුසලතාව සක්රිය කරන්න'. පහත සංවාදය සිදුවිය යුතුය:

ඇලිස්: හෙලෝ! ඔබ "IT කේන්දර" කුසලතාවයේ සිටී. තරු ඔබට පොරොන්දු වන දේ සොයා ගැනීමට "ආරම්භ කරන්න" කියන්න.
පරිශීලක: ආරම්භ කරන්න
පිළිතුර: කරුණාකර ඔබේ නම සඳහන් කරන්න.
යූ: වසුවලි
පිළිතුර: දැන් මට කියන්න ඔබ උපන් වර්ෂය. ඉලක්කම් හතරක් පමණි, තවත් කිසිවක් නැත.
යූ: දෙවනුව
A: කරුණාකර නැවත උත්සාහ කරන්න. ඔබගේ උපන් වර්ෂය සඳහන් කරන්න - ඉලක්කම් හතරක්.
යූ: 2002
A: නියමයි! දැන් ඔබ උපන් මාසය නම් කරන්න.
යූ: පෙබරවාරි
A: නියමයි! අවසාන වශයෙන්, ඔබේ උපන් දිනය මට කියන්න - අංකයක්, ඉලක්කම් එකක් හෝ දෙකක් පමණි.
යූ: 18
A: ස්තූතියි, Vasisual! දැන් අපි දන්නවා: ඔබට වයස අවුරුදු 17 ක් වන අතර ඔබ කුම්භ රාශියකි. මෙන්න ඔබ, ඇත්ත වශයෙන්ම, වාසනාවන්තයි! තරු ඔබට කියයි а что говорят звёзды, вы узнаете, запустив навык.

ගැටළුව වන්නේ එවැනි සරල සංවාදයක් පවා පවත්වා ගැනීම සඳහා, ඔබ පරිශීලකයාගේ නම සහ උපන් දිනය මතක තබා ගත යුතු අතර, සේවාදායකයක් නොමැති පරිසරයක මෙය සුළුපටු නොවේ. සන්දර්භය RAM හෝ තැටියේ ගොනුවක් ලෙස ගබඩා කිරීමට එය ක්රියා නොකරනු ඇත, මන්ද Yandex.Cloud හට එකවර අථත්‍ය යන්ත්‍ර කිහිපයක ක්‍රියාකාරිත්වය ක්‍රියාත්මක කළ හැකි අතර ඒවා අතර අත්තනෝමතික ලෙස මාරු විය හැකිය. ඔබට යම් ආකාරයක බාහිර ගබඩාවක් භාවිතා කිරීමට සිදු වනු ඇත. වස්තු ගබඩාව Yandex.Cloud (එනම්, බොහෝ විට වේගවත්) සෘජුවම තරමක් මිල අඩු සහ සරල ගබඩාවක් ලෙස තෝරාගෙන ඇත. නිදහස් විකල්පයක් ලෙස, ඔබට උත්සාහ කළ හැකිය, උදාහරණයක් ලෙස, නොමිලේ කෑල්ලක් වළාකුළු පිරි මොංගි කොහේ හරි දුරින්. Object Storage (එය S3 අතුරුමුහුණත සඳහා සහය දක්වයි) සහ Mongo යන දෙකම පහසු Python wrappers ඇත.

තවත් ගැටළුවක් නම්, Object Storage, MongoDB සහ වෙනත් ඕනෑම දත්ත ගබඩාවක් හෝ දත්ත ගබඩාවක් වෙත යාමට, ඔබට ඔබගේ ක්‍රියාකාරී කේතය සමඟ Yandex Functions වෙත උඩුගත කිරීමට අවශ්‍ය වන බාහිර පරායත්තතා කිහිපයක් අවශ්‍ය වේ. ඒ වගේම මම එය සුවපහසු ලෙස කිරීමට කැමතියි. එය සම්පූර්ණයෙන්ම පහසුයි (heroku මත මෙන්), අහෝ, එය ක්රියා නොකරනු ඇත, නමුත් පරිසරය ගොඩනැගීමට (ගොනුව සාදන්න) පිටපතක් ලිවීමෙන් ඔබට මූලික සැනසීමක් නිර්මාණය කළ හැකිය.

කේන්දර කුසලතාව ආරම්භ කරන්නේ කෙසේද?

  1. සූදානම් වන්න: Linux සමඟ යම් යන්ත්‍රයකට යන්න. ප්‍රතිපත්තිමය වශයෙන්, ඔබට බොහෝ විට වින්ඩෝස් සමඟද වැඩ කළ හැකිය, නමුත් පසුව ඔබට Makefile දියත් කිරීම සමඟ කල්පනා කළ යුතුය. ඕනෑම අවස්ථාවක, ඔබට අවම වශයෙන් 3.6 ස්ථාපිත Python අවශ්ය වනු ඇත.
  2. github වලින් Clone කරන්න කේන්දර කුසලතාවයේ උදාහරණයක්.
  3. Ya.Cloud හි ලියාපදිංචි වන්න: https://cloud.yandex.ru
  4. ඔබම බාල්දි දෙකක් සාදන්න වස්තු ගබඩා කිරීම, ඕනෑම නමකින් ඔවුන් අමතන්න {BUCKET NAME} и tgalice-test-cold-storage (මෙම මැද නම දැන් දෘඪ සංකේතනය කර ඇත main.py මගේ උදාහරණය). පළමු බාල්දිය අවශ්‍ය වන්නේ යෙදවීම සඳහා පමණි, දෙවැන්න - සංවාද තත්වයන් ගබඩා කිරීම සඳහා.
  5. නිර්මාණය සේවා ගිණුම, ඔහුට භූමිකාවක් දෙන්න editor, සහ ඒ සඳහා ස්ථිතික අක්තපත්‍ර ලබා ගන්න {KEY ID} и {KEY VALUE} - සංවාදයේ තත්වය වාර්තා කිරීමට අපි ඒවා භාවිතා කරමු. Ya.Cloud වෙතින් වන කාර්යයට Ya.Cloud වෙතින් ගබඩාවට ප්‍රවේශ විය හැකි වන පරිදි මේ සියල්ල අවශ්‍ය වේ. කවදාහරි, මම බලාපොරොත්තු වෙනවා, අවසරය ස්වයංක්‍රීය වේවි, නමුත් දැනට - එසේ.
  6. (විකල්ප) ස්ථාපනය කරන්න විධාන රේඛා අතුරුමුහුණත yc. ඔබට වෙබ් අතුරුමුහුණත හරහා ශ්‍රිතයක් නිර්මාණය කළ හැකිය, නමුත් සියලු ආකාරයේ නවෝත්පාදනයන් එහි වේගයෙන් දිස්වන බැවින් CLI හොඳයි.
  7. දැන් ඔබට, ඇත්ත වශයෙන්ම, පරායත්ත එකලස් කිරීම සකස් කළ හැකිය: කුසලතා උදාහරණය සමඟ ෆෝල්ඩරයෙන් විධාන රේඛාව මත ධාවනය කරන්න make all. පුස්තකාල පොකුරක් (බොහෝ විට, සුපුරුදු පරිදි, අනවශ්ය) ෆෝල්ඩරය තුළ ස්ථාපනය කරනු ලැබේ dist.
  8. වස්තු ගබඩාවට (බාල්දියකට) පෑන් පුරවන්න {BUCKET NAME}) පෙර පියවරේදී ලබාගත් ලේඛනාගාරය dist.zip. අවශ්ය නම්, ඔබට මෙය විධාන රේඛාවෙන්ද කළ හැකිය, උදාහරණයක් ලෙස, භාවිතා කිරීම AWS CLI.
  9. වෙබ් අතුරු මුහුණත හරහා හෝ උපයෝගිතා භාවිතයෙන් සේවාදායක රහිත ශ්‍රිතයක් සාදන්න 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

ශ්‍රිතයක් අතින් සාදන විට, සියලු පරාමිති එකම ආකාරයකින් පුරවනු ලැබේ.

දැන් ඔබ විසින් නිර්මාණය කරන ලද කාර්යය සංවර්ධක කොන්සෝලය හරහා පරීක්ෂා කළ හැකි අතර, පසුව නිපුණතාවය අවසන් කර ප්‍රකාශයට පත් කළ හැකිය.

Yandex.Cloud සහ Python හි සේවාදායක රහිත කාර්යයන් මත ඇලිස් සඳහා රාජ්‍ය නිපුණතාවයක් නිර්මාණය කිරීම

තොප්පිය යට ඇති දේ

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. පරිශීලක දත්ත පිරවීමේ ක්‍රියාවලිය වින්‍යාසය මගින් විස්තර කෙරේ 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 සරලව ක්‍රියා කරයි: එය එහි සියලුම සංරචක අනෙක් අතට සංවාදයේ වත්මන් තත්වයට අදාළ කිරීමට උත්සාහ කරන අතර පළමු අදාළ එක තෝරා ගනී.

සෑම පණිවිඩයකටම ප්‍රතිචාරයක් ලෙස, සංවාද කළමනාකරු පයිතන් වස්තුවක් ආපසු ලබා දෙයි Response, එය පසුව සරල පෙළ බවට පරිවර්තනය කළ හැකිය, නැතහොත් ඇලිස් හෝ ටෙලිග්‍රාම් හි පණිවිඩයක් බවට පරිවර්තනය කළ හැකිය - බොට් ක්‍රියාත්මක වන ස්ථානය අනුව; සුරැකිය යුතු සංවාදයේ වෙනස් වූ තත්වයද එහි අඩංගු වේ. මේ මුළු කුස්සිය වෙනත් පන්තියක් විසින් හසුරුවනු ලැබේ, DialogConnector, එබැවින් Yandex Functions පිළිබඳ කුසලතාවයක් ආරම්භ කිරීම සඳහා සෘජු පිටපත මේ ආකාරයෙන් පෙනේ:

...
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 අතුරුමුහුණත වෙත සම්බන්ධතාවයක් නිර්මාණය කරයි. මෙම සම්බන්ධතාවය කෙලින්ම භාවිතා කරන්නේ කෙසේද, ඔබට කියවිය හැකිය tgalice කේතයෙන්.
අවසාන පේළිය කාර්යයක් නිර්මාණය කරයි alice_handler - අපි පරාමිතිය සකසන විට Yandex.Cloud අදින්නට නියෝග කළ එක --entrypoint=main.alice_handler.

ඇත්ත වශයෙන්ම, එය සියල්ලම වේ. ගොඩනැගීම සඳහා සාදන ගොනු, සන්දර්භය ආචයනය සඳහා S3 වැනි වස්තු ගබඩාව සහ පයිතන් පුස්තකාලයක් tgalice. python හි සේවාදායක රහිත විශේෂාංග සහ ප්‍රකාශන බව සමඟ එක්ව, නිරෝගී පුද්ගලයෙකුගේ කුසලතා වර්ධනය කිරීමට මෙය ප්‍රමාණවත් වේ.

ඔබ නිර්මාණය කිරීමට අවශ්ය වන්නේ මන්දැයි ඔබ අසනු ඇත tgalice? JSON ඉල්ලීමේ සිට ප්‍රතිචාර දක්වා සහ ගබඩාවේ සිට මතකය වෙත මාරු කරන සියලුම නීරස කේතයන් එහි ඇත. සාමාන්‍ය යෙදුමක් ද ඇත, "පෙබරවාරි" "පෙබරවාරි" හා සමාන බව අවබෝධ කර ගැනීම සඳහා කාර්යයක් සහ දුප්පතුන් සඳහා වෙනත් NLU. මගේ අදහසට අනුව, තාක්ෂණික විස්තර වලින් අවධානය වෙනතකට යොමු නොවී yaml ගොනු වල කුසලතා මූලාකෘති සටහන් කිරීමට මෙය දැනටමත් ප්‍රමාණවත් විය යුතුය.

ඔබට වඩාත් බැරෑරුම් NLU අවශ්‍ය නම්, ඔබට එය ඔබේ දක්ෂතාවයට හරවා ගත හැක රාසා හෝ DeepPavlov, නමුත් ඒවා සැකසීම සඳහා රබන් සමඟ අමතර නැටුම් අවශ්ය වනු ඇත, විශේෂයෙන් සර්වර් රහිත මත. ඔබට කිසිසේත්ම කේතනය කිරීමට අවශ්‍ය නැතිනම්, ඔබ දෘශ්‍ය ආකාරයේ ඉදිකිරීම්කරු භාවිතා කළ යුතුය Aimylogic. Tgalice නිර්මාණය කරන විට, මම යම් ආකාරයක අතරමැදි මාර්ගයක් ගැන සිතුවෙමි. බලමු මොකද වෙන්නේ කියලා.

හොඳයි, දැන් එකතු වෙන්න Aliy කුසලතා සංවර්ධක කතාබස්, කියවන්න ලේඛනගත කිරීමසහ විශ්මයජනක නිර්මාණය කරන්න නිපුණතා!

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න