لنبدأ بالأخبار. بالأمس ، أعلنت Yandex.Cloud عن إطلاق خدمة الحوسبة السحابية Yandex Cloud Functions . هذا يعني: أنك تكتب فقط رمز الخدمة الخاصة بك (على سبيل المثال ، تطبيق ويب أو chatbot) ، وتقوم السحابة نفسها بإنشاء وصيانة الأجهزة الافتراضية حيث تبدأ ، بل وتكرارها إذا زاد الحمل. ليس من الضروري التفكير على الإطلاق ، إنه مناسب للغاية. وتذهب الرسوم فقط خلال الحساب.
ومع ذلك ، قد لا يدفع البعض على الإطلاق. هؤلاء هم مطورو مهارات Alice الخارجية ، أي مواقع الدردشة المدمجة فيها. يمكن لأي مطور أن يكتب مثل هذه المهارة ويستضيفها ويسجلها ، ومن اليوم لا تحتاج إلى استضافة المهارات - ما عليك سوى تحميل الكود الخاص بها إلى السحابة في شكل وظيفة بدون خادم .
ولكن هناك بضع الفروق الدقيقة. أولاً ، قد يتطلب قانون الحيوانات الأليفة الخاص بك بعض التبعيات ، وسحبها إلى السحابة ليس تافهاً. ثانياً ، يحتاج أي chatbot عادي إلى تخزين حالة الحوار في مكان ما (الدولة بالتالي) ؛ كيفية القيام بذلك في وظيفة serverless أسهل؟ ثالثًا ، كيف يمكنك بسرعة ومهارة كتابة مهارة لـ Alice أو نوع من الروبوت مع مؤامرة غير صفرية؟ حول هذه الفروق الدقيقة ، في الواقع ، مقال.

التدريب الأخلاقي
بالنسبة لفارغ الصبر: أقوم بجمع التبعيات الضرورية باستخدام ملف تكوين قبل تحميل الوظيفة إلى مجموعة النظراء ، وقمت بتخزين حالة الحوار في Yandex Object Storage (يدعم S3 API) ، ولإدارة الحوار ، استخدم مكتبة tgalice الخاصة بي . والنتيجة هي هذه المهارة التجريبية. الآن دعونا نلقي نظرة على كل هذا بمزيد من التفصيل.
للحصول على القليل من الصبر: قبل الانغماس في قصتي حول الصعوبات ، أوصي بشدة بالبدء بقصة بسيطة. وهي إنشاء وظيفة أسلم صدى ملف واحد وتسجيلها واختبارها في وحدة تحكم مطور Dialogs ؛ التفاصيل موجودة على سحابة Dialogs والوثائق بلوق . وعندها فقط للمضي قدما.
إذا كنت تريد أن تشعر على الفور بما نحارب من أجله ، فاطلب من أليس تشغيل مهارة "ابراج تكنولوجيا المعلومات " . يجب أن يحدث مربع الحوار التالي:
أليس: مرحبًا! أنت في مهارة Aishish Horoscope. قل "ابدأ" لمعرفة ما تعدك به النجوم.
المستخدم: ابدأ
a: يرجى إعطاء اسمك.
يو: فاساليوال
ج: أخبرني الآن عام ميلادك. أربعة أرقام فقط ، لا شيء أكثر من ذلك.
يو: الثانية
ج: يرجى المحاولة مرة أخرى. ما هي سنة ولادتك - أربعة أرقام.
U: 2002
ج: عظيم! اسم الآن شهر ولادتك.
U: فبراير
ج: عظيم! أخيرًا ، أخبرني بتاريخ ميلادك - فقط رقم واحد فقط أو رقمين.
U: 18
ج: شكرا لك يا فاساليالي! الآن نحن نعرف: أنت تبلغ من العمر 17 عامًا ، وأنت برج الدلو. أنت هنا ، بالطبع ، محظوظ! تخبرك النجوم: , , .
المشكلة هي أنه من أجل الحفاظ على مثل هذا الحوار البسيط ، تحتاج إلى تذكر اسم وتاريخ ميلاد المستخدم ، وفي بيئة خالية من الخوادم ، هذا ليس بالأمر الهين. تخزين السياق في ذاكرة الوصول العشوائي أو ملف على القرص لن يعمل ، لأنه يمكن لـ Yandex.Cloud تشغيل الوظيفة على العديد من الأجهزة الافتراضية في نفس الوقت والتبديل بينها بشكل تعسفي. سيتعين علينا استخدام نوع من التخزين الخارجي. تم اختيار تخزين الكائنات على أنه تخزين غير مكلف وغير معقد تمامًا في Yandex.Cloud (على سبيل المثال ، ربما سريع). كبديل مجاني ، يمكنك تجربة ، على سبيل المثال ، قطعة مجانية من Monga غائم في مكان ما بعيد. يحتوي كل من تخزين الكائنات (يدعم الواجهة S3) ومونغو على غلاف باثون مناسب.
هناك مشكلة أخرى تتمثل في أنك تحتاج إلى بعض التبعيات الخارجية التي تحتاج إلى تحميلها إلى وظائف Yandex جنبًا إلى جنب مع رمز الوظيفة الخاص بك ، من أجل المشي في Object Storage و MongoDB وفي أي قاعدة بيانات أخرى أو مستودع بيانات. وأود أن تفعل ذلك بسهولة. إنه مناسب تمامًا (مثل heroku) ، للأسف ، لن ينجح ، لكن يمكنك إنشاء بعض الراحة الأساسية عن طريق كتابة برنامج نصي لبناء البيئة (ملف تكوين).
كيفية تشغيل مهارة الفلكي
- جهز نفسك: اذهب إلى بعض أجهزة Linux. من حيث المبدأ ، ربما يمكنك العمل مع Windows أيضًا ، ولكن بعد ذلك يجب عليك استحضار بدء تشغيل ملف التعريف. وعلى أي حال ، سوف تحتاج تثبيت Python لا تقل عن 3.6.
- استنساخ نفسك مع جيثب مثال لمهارة الفلك .
- سجل في Y. Cloud: https://cloud.yandex.ru
- قم بإنشاء مجموعتين لنفسك في " تخزين الكائنات" ، واسمه بأي اسم
{BUCKET NAME}
و tgalice-test-cold-storage
(هذا الاسم الثاني أصبح الآن main.py
في main.py
). ستكون المجموعة الأولى مطلوبة فقط للنشر ، والثانية - لتخزين حالات الحوار. - قم بإنشاء حساب خدمة ،
editor
دور editor
، واحصل على بطاقات الائتمان الثابتة {KEY ID}
و {KEY VALUE}
- سنستخدمها لتسجيل حالة الحوار. كل هذا ضروري حتى تتمكن وظيفة من Y. Cloud من الوصول إلى المستودع من Y. Cloud. يوما ما ، آمل أن يكون التفويض تلقائيًا ، لكن الآن - هكذا. - (اختياري) قم بتثبيت واجهة سطر الأوامر
yc
. يمكنك إنشاء وظيفة من خلال واجهة الويب ، ولكن CLI جيدة من حيث أن كل أنواع الابتكارات تظهر فيه بشكل أسرع. - يمكنك الآن ، في الواقع ، تحضير مجموعة التبعية: تشغيل في موجه الأوامر من مجلد مع المثال الخاص
make all
المهارات. سيتم تثبيت مجموعة من المكتبات (معظمها ، كالعادة ، غير ضرورية) في مجلد dist
. - صب في تخزين الكائنات (في
{BUCKET NAME}
) أرشيف dist.zip
تم الحصول عليه في الخطوة السابقة. إذا رغبت في ذلك ، يمكنك القيام بذلك من سطر الأوامر ، على سبيل المثال ، باستخدام AWS CLI . - قم بإنشاء وظيفة بدون خادم عبر واجهة الويب أو باستخدام الأداة المساعدة
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
. يتم وصف عملية ملء بيانات المستخدم بواسطة form.yaml 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: , . (, ); .
يتم تنفيذ العمل على تحليل هذا التكوين وحساب النتيجة النهائية من قبل فئة بيثون
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
، والذي يمكن تحويله إلى نص مكشوف ، أو إلى رسالة في Alice أو Telegram ، اعتمادًا على مكان بدء الروبوت ؛ يحتوي أيضًا على حالة الحوار التي تم تغييرها ، والتي يجب حفظها. هناك فئة أخرى ، 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. كيف يتم استخدام هذا الاتصال مباشرة يمكن قراءتها في رمز tgalice .
ينشئ السطر الأخير وظيفة alice_handler
- تلك التي طلبنا Yandex.Cloud لسحبها عند تعيين --entrypoint=main.alice_handler
.
هذا ، في الواقع ، هو كل شيء. Makefiles للتجميع ، S-like Object Storage لتخزين السياق ، ومكتبة python tgalice. جنبا إلى جنب مع وظائف دون خادم والتعبير عن الثعبان ، وهذا يكفي لتطوير مهارة الشخص السليم.
قد تسأل ، لماذا كنت بحاجة إلى خلق tgalice
؟ جميع الأكواد المملة التي تنقل JSONs من طلب إلى استجابة ومن التخزين إلى الذاكرة والعكس صحيح. يوجد أيضًا تطبيق تحكم منتظم ، وظيفة لفهم ما يشبه "February" مثل "February" ، و NLU أخرى للفقراء. وفقًا لفكرتي ، يجب أن يكون هذا بالفعل كافيًا بحيث يمكنك رسم نماذج أولية من المهارات في ملفات yaml دون أن تشغلها التفاصيل الفنية.
إذا كنت ترغب في الحصول على NLU أكثر خطورة ، يمكنك تثبيت Rasa أو DeepPavlov وفقًا لمهاراتك ، ولكن لتكوينها ، ستحتاج إلى رقصات إضافية مع الدف ، خاصة على الخادم. إذا كنت لا ترغب في الترميز على الإطلاق ، فيجب عليك استخدام مُنشئ بصري مثل Aimylogic . عندما خلق الظلال ، كنت أفكر في نوع من المسار المتوسط. دعونا نرى ما يحدث.
حسنًا ، انضم الآن إلى دردشة مطوري المهارات الخاصة بهم ، وقراءة الوثائق ، وخلق مهارات رائعة!