يستخدم الروبوت تحويل الكلمات من الشكل الأول للتعرف بشكل أكثر دقة على استعلام المستخدم. لكي تعمل بشكل صحيح، يجب أن يكون لديك قاموس للكلمات باللغة المطلوبة. هذه المجموعة مناسبة للغة الروسية. من الضروري تحديد المسار إلى القاموس.
$ bot = new alisa ( ' NAME ' );
//Такой используется по умолчанию
$ bot -> setDictionaryPath ( $ _SERVER [ ' DOCUMENT_ROOT ' ] . ' /dicts/ ' );
الجلسات – ملف *.json يتم فيه تخزين كافة معلومات الخدمة ضمن جوهر حوار واحد. يجب عليك تحديد المسار إلى الدليل الذي سيتم تخزين البيانات فيه.
$ bot = new alisa ( ' NAME ' );
//Такой используется по умолчанию
$ bot -> setDictionaryPath ( $ _SERVER [ ' DOCUMENT_ROOT ' ] . ' /sessions/ ' );
//Создаем бота. Аргумент – название навыка
$ bot = new alisa ( ' myawesomebot ' );
//Создаем триггер, в качестве аргумента строка с уникальным именем
$ helloTrigger = new Trigger ( ' HELLO ' );
//Привязываем к триггеру токены – в данном случае в одну группу.
//Токены – ключевые слова, объединенные в группы
$ helloTrigger -> linkTokens ([ ' привет ' , ' здравствуйте ' , ' приветсвую ' ]);
$ bayTrigger = new Trigger ( ' bay ' );
$ bayTrigger -> linkTokens ([ ' пока ' , ' до свидания ' , ' прощай ' ]);
//Привязываем триггеры боту
$ bot -> addTrigger ( $ helloTrigger , $ bayTrigger );
//Отправляем ответ, если распознан $helloTrigger
$ bot ->sendResponse( $ helloTrigger , static function (){
//$answer - экземпляр отправляемого ответа
$ answer = new Response ();
$ answer -> addText ( ' Привет! ' );
$ answer -> addText ( ' Доброго времени суток! ' );
//обязательно возвращаем объект Response
return $ answer ;
);
//Отправляем ответ, если распознан $bayTrigger
$ bot ->sendResponse( $ bayTrigger , static function (){
$ answer = new Response ();
$ answer -> addText ( ' Прошай! ' );
$ answer -> addText ( ' Всего доброго ' );
//обязательно возвращаем объект Response
return $ answer ;
);
وفقًا للبروتوكول، يجب أن يكون لدى الروبوت على الأقل مشغل للتحية ومعالجة الأخطاء (طلب المساعدة).
//Будет вызван автоматически, при первом обращении пользователя к навыку
$ helloTrigger = new Trigger ( ' HELLO ' );
$ helloTrigger -> setAsInit ( true );
//Будет вызыван автоматически, если ну удалось распознать запрос
$ mistakeTrigger = new Trigger ( ' MISTAKE ' );
$ mistakeTrigger -> setAsMistake ( true );
//Отправляем ответ, если распознан $mistakeTrigger
$ bot -> sendResponse ( $ mistakeTrigger , static function (){
$ answer = new Answer ();
$ answer -> addText ( ' Не удалось понять вашу команду :( ' );
return $ answer ;
);
إذا لم يتم تحديد هذه المشغلات، فسيرسل الروبوت استجابة افتراضية مع رابط لهذا العنصر. وإذا كان هذا هو سبب قراءتك لهذا النص، فالمقلب كان ناجحًا.
Trigger هو أمر يجب أن يستجيب له الروبوت.
الرموز المميزة - الكلمات الرئيسية، أو خيارات الاستعلام (اعتمادًا على نوع التعرف المحدد)
يستخدم هذا الوضع المقارنة التسلسلية لمجموعات الرموز المميزة، مع تحديد الخيارات المناسبة فقط. يستمر التحليل من اليسار إلى اليمين - إذا لم تنجح المجموعة الأولى في اجتياز البحث، فلن يتم فرز المجموعات المتبقية وسيبدأ الروبوت في عرض المشغل التالي. عند إدخال جميع المجموعات لأول مرة، سيتم وضع علامة على المشغل على أنه تم التعرف عليه؛ وإلا فلن يشاركوا في التحليل
$ greenTea -> linkTokens ([ ' дай ' , ' хочу ' , ' налей ' ],[ ' чай ' ],[ ' зеленый ' ]);
$ blackTea -> linkTokens ([ ' дай ' , ' хочу ' , ' налей ' ],[ ' чай ' ],[ ' черный ' , ' индийский ' ]);
$ coffeTrigger -> linkTokens ([ ' дай ' , ' хочу ' , ' налей ' ],[ ' кофе ' ]);
عند طلب "اسكب بعض الشاي الأسود من فضلك"، سيعمل $blackTea؛ عند السؤال "ليس لدي القوة لأشتهي هذه القهوة المنعشة" - $coffeTrigger;
الايجابيات:
السلبيات:
على عكس MORPHY_STRICT، سيتم تحديد الكلمات الرئيسية تلقائيًا، ولكن يجب تحديد العديد من خيارات الاستعلام. يتم تضمين جميع المشغلات في التحليل؛ وسيتم اختيار المشغل الذي يتمتع بأفضل تطابق مع الطلب للمشغل الذي تم التعرف عليه.
$ greenTea -> linkTokens ([ ' Налей зеленого чая ' ],[ ' Хочу зеленого чая ' ],[ ' Дай зеленый чай ' ]);
$ blackTeas -> linkTokens ([ ' Налей чергого чая ' ],[ ' Хочу черного чая ' ],[ ' Дай черный чай ' ]);
$ coffeTrigger -> linkTokens ([ ' Налей кофе ' ],[ ' Хочу кофе ' ],[ ' Дай кофе ' ]);
الايجابيات:
السلبيات:
في الحالات التي يتم فيها استخدام الروبوت لتنفيذ الأوامر بشكل تسلسلي، يمكنك ربط المشغل التالي بمشغل. على سبيل المثال، إذا كنت بحاجة إلى جمع أي معلومات من المستخدم، على سبيل المثال، الاسم الأول واسم العائلة وما إلى ذلك.
// Декларируем триггеры
$ nameTrigger = new Trigger ( ' NAME ' );
$ sNameTrigger = new Trigger ( ' SECOND_NAME ' );
$ yoTrigger = new Trigger ( ' YEARS ' );
$ personTrigger = new Trigger ( ' PERSON ' );
// Назначаем токены для триггера
$ nameTrigger -> setTokens ([ ' давай ' , ' хочу ' , ' может ' ],[ ' знакомиться ' , ' познакомиться ' , ' представлюсь ' ]);
// Привязываем следующие триггеры
$ nameTrigger -> nextDelegate ( $ sNameTrigger );
$ sNameTrigger -> nextDelegate ( $ yoTrigger );
$ yoTrigger -> nextDelegate ( $ personTrigger );
// Обрабочтик запроса. Сработает если пользователь произнес "Давай познакомимся"
$ bot -> sendResponse ( $ nameTrigger , static function () use ( $ bot ){
$ answer = new Response ();
$ answer -> addText ( ' Какое твое имя? ' );
return $ answer ;
});
// После шага $nameTrigger сработает обработчик $sNameTrigger
$ bot -> sendResponse ( $ sNameTrigger , static function () use ( $ bot ){
$ answer = new Response ();
$ answer -> addText ( ' А фамилия? ' );
return $ answer ;
});
// После шага $sNameTrigger сработает обработчик $yoTrigger
$ bot -> sendResponse ( $ yoTrigger , static function () use ( $ bot ){
$ answer = new Response ();
$ answer -> addText ( ' Сколько тебе лет? ' );
return $ answer ;
});
لكل من المشغلات تحتاج إلى إنشاء معالج بسؤال. عندما يطلب المستخدم "حسنًا، دعنا نتعرف"، سيتم تشغيل مشغل $nameTrigger. بالنسبة للمشغلات $sNameTrigger و$yoTrigger، ليست هناك حاجة إلى الرموز المميزة (بشكل عام، في هذه الحالة لن تكون قادرة على العمل، لأن المستخدم سيرسل المعلومات ولا يمكن التعرف على الأمر فيها)، سيتم استدعاؤها تلقائيًا بعد آخر.
يمكن استخدام المشغلات ليس فقط كوسيلة لتحديد أمر المستخدم، ولكن أيضًا لجمع المعلومات.
//$personTrigger – назначен как следующий триггер после $yoTrigger
$ bot -> sendResponse ( $ personTrigger , static function () use ( $ bot ){
//В качестве аргумента строка, уникальное название триггера
$ name = $ bot -> getTriggerData ( ' NAME ' );
$ sName = $ bot -> getTriggerData ( ' SECOND_NAME ' );
$ yo = $ bot -> getTriggerData ( ' YEARS ' );
$ answer = new Answer ();
$ answer -> addText ( " Хорошо { $ name } { $ sName } , я тебя запомнила, и что тебе { $ yo } лет – тоже " );
return $ answer ;
);
يقوم الروبوت بتخزين مثيل واحد فقط من البيانات للمشغل، لذلك يمكن استرداد آخر البيانات المستلمة فقط
الاستجابات هي المعلومات التي يرسلها الروبوت إلى المستخدم بمجرد تشغيل المشغل.
//$personTrigger – назначен как следующий триггер после $yoTrigger
$ bot -> sendResponse ( $ personTrigger , static function () use ( $ bot ){
$ answer = new Answer ();
$ answer -> addText ( ' Один вариант ответа ' , ' Од!ин вари!ант отв!ета ' );
return $ answer ;
);
يحتوي الأسلوب addText على وسيطتين من السلسلة. الأول يستخدم لإخراج النص الذي سيتم عرضه للمستخدم، والثاني هو نفس النص بتنسيق TTS.
لمزيد من التفاعل، ينبغي استخدام خيارات الإجابة المتعددة الممكنة. سيتم تحديد خيار الشحن بشكل عشوائي.
$ bot -> sendResponse ( $ bullshitTrigger , static function () {
$ answer = new Answer ();
$ answer -> addText ( ' Да не может быть! ' );
$ answer -> addText ( ' Чушь собачья! ' );
$ answer -> addText ( ' Не верю! ' );
return $ answer ;
);
يمكنك إرفاق زر للرد. يمكن أن يكون هذا رابطًا لصفحة ويب أو زرًا يؤدي عند النقر عليه إلى تشغيل مشغل. يمكن أن يكون هناك عدة أزرار وأنواع مختلفة.
$ bot -> sendResponse ( $ helloPerson , static function () {
$ answer = new Answer ();
$ answer -> addText ( ' Может познакомимся? ' );
$ buttonY = new Button ( ' Давай ' );
$ answer -> addButton ( $ button );
$ buttonN = new Button ();
$ buttonN -> setTitle ( ' Неа ' );
return $ answer ;
);
في هذا المثال، عند النقر على الزر، سيتم استدعاء $nameTrigger من المثال الموجود في قسم "التفويض". وبالتالي، يمكن استدعاء $nameTrigger إما بصوت المستخدم أو بالضغط على زر إذا كان المستخدم لا يتحدث.
يمكن لروبوت Alice عرض الأزرار للمستخدمين في شكلين مختلفين - كزر يتم وضعه أسفل مربع الحوار، وكرابط داخل الاستجابة المرسلة.
$ bButton = new Button ( ' Это кнопка ' );
//Будет отображена как кнопка, под диалогом. Со следующем ответом отображена не будет, если ее не привязатели к ответу Response
$ bButton -> setHide ( true );
$ bLink = new Button ( ' Это кнопка, но как ссылка ' )
//Будет отображена в ответе. Даже если пользователь выбирал что-то другие, эта ссылка так и останется в сообщении.
$ bButton-> setHide ( false );
$ bButton = new Button ( ' Это кнопка ' );
* * *
// Можно установить заголовок не в конструкторе, а в методе. Можно использовать как способ изменеия заголовка имеющейся кнопки, тем самым создавая вариативность
$ bButton -> setTitle ( ' Это все еще кнопка ' )
// К кнопке можно добавить ссылку. При клике на нее произойдет переход по адресу в браузере.
$ bButton -> addLink ( ' www.SITENAME.DOMAIN ' );
// Кнопке можно добавить обработчик какого-нибудь тригера. При клике на кнопку бот в первую очередь проверяет есть ли связанный Триггер для кнопки, и если есть – вызывает именно его.
$ bButton -> linkTrigger (Trigger $ trigger );
//Кнопке можно передать какие-нибудь данные, которые можно будет забрать и использовать, если пользователь нажимал на эту кнопку.
$ bButton -> addPayload ([ ' DATA ' => ' SOME_DATA ' ]);
بالإضافة إلى البيانات التي يرسلها المستخدم، والتي يتم ربطها وحفظها بواسطة المشغل، يمكنك أيضًا حفظ بياناتك الخاصة.
$ bot ->sendResponse( $ firstRequest , static function () use ( $ bot ) {
* * *
$ bot -> storeCommonData ( ' Черный чай ' , ' TEA ' );
$ bot -> getCommonData ( ' TEA ' ); // Вернет "Черный чай", в т.ч. если пользователь уже перешел к другому запросу
* * *
);
$ bot ->sendResponse( $ secondRequest , static function () use ( $ bot ) {
* * *
$ bot -> getCommonData ( ' TEA ' ); // Вернет "Черный чай", в т.ч. если пользователь уже перешел к другому запросу
* * *
);
في الحالات التي لا يتضمن فيها المشغل قبول البيانات فحسب، بل يتضمن أيضًا التحقق من صحتها، يجب استخدام الحلقات
//Допустим что код триггера $chooseMeds – "MEDS"
$ bot -> sendResponse ( $ chooseMeds , static function () use ( $ bot ) {
$ answer = new Response ();
//Проверяем, это первичный запрос или цикл?
if ( ! $ bot -> isRepeatedRequest ()) {
//Нет, значит это первичный запрос со стороны пользователя, предлагаем выбор
$ answer -> addText ( ' Какую таблетку ты выберешь, Нео? ' );
//Задаем циклирование, результат будем проверять в этом же триггере
$ bot -> setRepeat ( true );
} else {
//Неправильный выбор?
if ( $ bot -> getTriggerData ( ' MEDS ' ) !== ' Синяя ' ) {
$ answer -> addText ( ' Неверный выбор, Нео ' );
//Задать цикл
$ bot -> setRepeat ( true );
} else {
//Все ок, выход из триггера
$ answer -> addText ( ' Ты сделал правильный выбор о-о ' );
}
}
return $ answer ;
});