በ Yandex.Cloud እና Python አገልጋይ አልባ ተግባራት ላይ ለአሊስ ጥሩ ችሎታ መፍጠር

በዜና እንጀምር። ትናንት Yandex.Cloud አገልጋይ አልባ የኮምፒውተር አገልግሎት መጀመሩን አስታውቋል የ Yandex ክላውድ ተግባራት. ይህ ማለት፡ የአገልግሎታችሁን ኮድ ብቻ ነው የምትጽፉት (ለምሳሌ፡ ዌብ አፕሊኬሽን ወይም ቻትቦት) እና ክላውድ ራሱ በሚሰራባቸው ቦታዎች ቨርቹዋል ማሽኖችን ይፈጥራል እና ይጠብቃል እና ጭነቱ ከጨመረ ይደግማል። በጭራሽ ማሰብ የለብዎትም, በጣም ምቹ ነው. እና ክፍያው የሚካሄደው ለስሌቶች ጊዜ ብቻ ነው.

ይሁን እንጂ አንዳንድ ሰዎች ጨርሶ ላይከፍሉ ይችላሉ። እነዚህ ገንቢዎች ናቸው የአሊስ ውጫዊ ችሎታዎችማለትም በውስጡ የተሰሩ ቻትቦቶች። ማንኛውም ገንቢ እንደዚህ አይነት ክህሎት መጻፍ፣ ማስተናገድ እና መመዝገብ ይችላል፣ እና ከዛሬ ጀምሮ ክህሎቶች እንኳን ማስተናገድ አያስፈልጋቸውም - ኮዳቸውን በቅጹ ላይ ወደ ደመናው ይስቀሉ ተመሳሳይ አገልጋይ-አልባ ተግባር.

ግን ሁለት ጥቃቅን ነገሮች አሉ. በመጀመሪያ፣ የእርስዎ የቤት እንስሳ ኮድ አንዳንድ ጥገኞችን ሊፈልግ ይችላል፣ እና እነሱን ወደ ክላውድ መጎተት ቀላል አይደለም። በሁለተኛ ደረጃ ፣ ማንኛውም መደበኛ ቻትቦት የንግግር ሁኔታን በሆነ ቦታ ማከማቸት አለበት (ስለዚህ ሁኔታዊ)። አገልጋይ በሌለው ተግባር ውስጥ ቀላሉ መንገድ እንዴት ማድረግ እንደሚቻል? በሶስተኛ ደረጃ ፈጣን እና የቆሸሸ ክህሎት ለአሊስ ወይም ዜሮ ያልሆነ ሴራ ያለው አንድ አይነት ቦት እንዴት መፃፍ ይቻላል? ስለእነዚህ ጥቃቅን ነገሮች, በእውነቱ, ጽሑፉ.

በ Yandex.Cloud እና Python አገልጋይ አልባ ተግባራት ላይ ለአሊስ ጥሩ ችሎታ መፍጠር

የሞራል ዝግጅት

ትዕግስት ለሌላቸው ሰዎች: ተግባሩን ወደ ደመናው ከመጫንዎ በፊት አስፈላጊውን ጥገኝነቶችን በፋይል እሰበስባለሁ, የንግግር ሁኔታን በ Yandex Object Storage ውስጥ አከማቸዋለሁ (የ S3 APIን ይደግፋል) እና ንግግሩን ለማስተዳደር የራሴን ቤተ-መጽሐፍት እጠቀማለሁ tgalice. በውጤቱም, ይወጣል እንዲህ ያለ ማሳያ ችሎታ. እና አሁን ይህንን ሁሉ በጥቂቱ በዝርዝር እንመርምር።

ትንሽ ትዕግስት ለሌላቸው፣ ወደ ውስብስብነት ታሪኬ ከመግባቴ በፊት፣ ቀላል እንዲጀምሩ እመክራለሁ። ይኸውም ባለአንድ ፋይል echobot ተግባር ይፍጠሩ፣ ይመዝገቡ እና በዲያሎግ ገንቢ ኮንሶል ውስጥ ይሞክሩት። ዝርዝሮች - ውስጥ የብሎግ ውይይቶች и የደመና ሰነድ. እና ከዚያ ብቻ ይጀምሩ።

የምንታገለው ምን እንደሆነ ወዲያውኑ እንዲሰማዎት ከፈለጉ አሊስን ይጠይቁ"የአይቲ ሆሮስኮፕ" ችሎታን ያብሩ' . የሚከተለው ውይይት መደረግ አለበት፡-

አሊስ: ሰላም! በ"IT ሆሮስኮፕ" ክህሎት ውስጥ ነዎት። ኮከቦቹ ለአንተ ቃል የገቡትን ለማወቅ "ጀምር" ይበሉ።
ተጠቃሚ፡ ጀምር
መልስ፡ እባክህ ስምህን ግለጽ።
ዩ፡ ቫሲሱሊ
መልስ፡ አሁን የተወለድክበትን አመት ንገረኝ። አራት አሃዞች ብቻ፣ ምንም ተጨማሪ የለም።
ዩ: ሁለተኛ
መ: እባክዎ እንደገና ይሞክሩ። የተወለዱበትን ዓመት ይግለጹ - አራት አሃዞች.
ዩ: 2002
ታላቅ! አሁን የተወለድክበትን ወር ጥቀስ።
ዩ፡ የካቲት
ታላቅ! በመጨረሻም የትውልድ ቀንዎን ይንገሩኝ - ቁጥር ብቻ አንድ ወይም ሁለት አሃዞች ብቻ።
ዩ: 18
መ: አመሰግናለሁ Vasisual! አሁን እናውቃለን፡ 17 አመትህ ነህ እና አኳሪየስ ነህ። እዚህ ፣ በእርግጥ ፣ እድለኛ ነዎት! ኮከቦቹ ይነግሩሃል а что говорят звёзды, вы узнаете, запустив навык.

ችግሩ እንደዚህ ቀላል ንግግር እንኳን ለማቆየት የተጠቃሚውን ስም እና የትውልድ ቀን ማስታወስ ያስፈልግዎታል ፣ እና አገልጋይ በሌለው አካባቢ ይህ ቀላል አይደለም። አውድ በ RAM ውስጥ ወይም በዲስክ ላይ እንደ ፋይል ማከማቸት አይሰራም, ምክንያቱም Yandex.Cloud ተግባሩን በበርካታ ቨርቹዋል ማሽኖች ላይ በተመሳሳይ ጊዜ ማሄድ እና በዘፈቀደ በመካከላቸው መቀያየር ይችላል። አንድ ዓይነት ውጫዊ ማከማቻ መጠቀም አለብህ። የነገሮች ማከማቻ በቀጥታ በYandex.Cloud (ይህም ፈጣን ሳይሆን አይቀርም) ልክ እንደ ርካሽ እና ቀላል ማከማቻ ተመርጧል። እንደ ነፃ አማራጭ, መሞከር ይችላሉ, ለምሳሌ, ነፃ ቁራጭ ደመናማ ሞንጊ ሩቅ የሆነ ቦታ ። ሁለቱም የነገሮች ማከማቻ (የ S3 በይነገጽን ይደግፋል) እና ሞንጎ ምቹ የፓይዘን መጠቅለያዎች አሏቸው።

ሌላው ችግር ደግሞ ወደ Object Storage፣ MongoDB እና ወደ ሌላ ማንኛውም የውሂብ ጎታ ወይም የውሂብ ማከማቻ ለመሄድ፣ ወደ Yandex Functions ከተግባር ኮድዎ ጋር መስቀል የሚፈልጓቸው አንዳንድ ውጫዊ ጥገኛዎች ያስፈልጉዎታል። እና በምቾት ላደርገው እፈልጋለሁ። ሙሉ በሙሉ ምቹ ነው (እንደ ሄሮኩ ላይ) ፣ ወዮ ፣ አይሰራም ፣ ግን አከባቢን ለመገንባት ስክሪፕት በመፃፍ አንዳንድ መሰረታዊ ምቾት መፍጠር ይችላሉ (ፋይል ይስሩ)።

የኮከብ ቆጠራ ችሎታ እንዴት እንደሚጀመር

  1. ተዘጋጁ፡ ከሊኑክስ ጋር ወደ አንድ ማሽን ይሂዱ። በመርህ ደረጃ ፣ ከዊንዶውስ ጋርም መስራት ይችላሉ ፣ ግን ከዚያ ከ makefile ጅምር ጋር መገናኘት አለብዎት። እና በማንኛውም ሁኔታ ቢያንስ 3.6 የተጫነ Python ያስፈልግዎታል።
  2. ክሎን ከgithub የኮከብ ቆጠራ ችሎታ ምሳሌ.
  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 አገልጋይ አልባ ተግባራት ላይ ለአሊስ ጥሩ ችሎታ መፍጠር

ከመከለያው ስር ያለው

ሜክፋይሉ ጥገኞችን ለመጫን እና ወደ ማህደር ለማስቀመጥ በጣም ቀላል የሆነ ስክሪፕት ይዟል። 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 በቀላሉ ይሰራል፡ በንግግሩ ወቅታዊ ሁኔታ ላይ ሁሉንም ክፍሎቹን በምላሹ ለማመልከት ይሞክራል እና የመጀመሪያውን የሚመለከተውን ይመርጣል።

ለእያንዳንዱ መልእክት እንደ ምላሽ፣ የንግግር አስተዳዳሪው የpython ነገር ይመልሳል 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. ከአገልጋይ አልባ ባህሪያት እና የፓይቶን ገላጭነት ጋር ይህ የጤነኛ ሰው ችሎታን ለማዳበር በቂ ነው።

ለምን መፍጠር እንዳለብህ ልትጠይቅ ትችላለህ tgalice? JSONsን ከጥያቄ ወደ ምላሽ እና ከማከማቻ ወደ ማህደረ ትውስታ እና ጀርባ የሚያስተላልፍ ሁሉም አሰልቺ ኮድ በውስጡ አለ። እንዲሁም መደበኛ አገላለጽ አፕሊኬሽን አለ፣ "የካቲት" ከ"የካቲት" ጋር እንደሚመሳሰል የመረዳት ተግባር እና ሌላ NLU ለድሆች ነው። እንደ እኔ ሀሳብ፣ በቴክኒካዊ ዝርዝሮች ሳይበታተኑ የችሎታ ፕሮቶታይፕዎችን በ yaml ፋይሎች ለመሳል ይህ ቀድሞውኑ በቂ መሆን አለበት።

ይበልጥ ከባድ የሆነ NLU ከፈለክ፣ ከችሎታህ ጋር ማዛመድ ትችላለህ Rasa ወይም DeepPavlovነገር ግን እነሱን ማዋቀር በከበሮ በተለይም አገልጋይ በሌለው ላይ ተጨማሪ ጭፈራ ያስፈልገዋል። ጨርሶ ኮድ ማድረግ የማይፈልጉ ከሆነ የእይታ አይነት ገንቢን መጠቀም አለብዎት አሚሎሎጂክ. tgaliceን ስፈጥር፣ ስለ አንድ ዓይነት መካከለኛ መንገድ አስብ ነበር። የሚሆነውን እንይ።

ደህና፣ አሁን ተቀላቀል Aliy ችሎታ ገንቢ ውይይት፣ አንብብ ሰነዶችእና አስደናቂ ይፍጠሩ ክህሎቶች!

ምንጭ: hab.com

አስተያየት ያክሉ