봇은 사용자의 쿼리를 보다 정확하게 인식하기 위해 첫 번째 형태의 단어 변환을 사용합니다. 올바르게 작동하려면 원하는 언어로 된 단어 사전이 있어야 합니다. 이 세트는 러시아어에 적합합니다. 사전에 대한 경로를 지정하는 것은 필수입니다.
$ 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 ;
);
이러한 트리거가 정의되지 않은 경우 봇은 이 항목에 대한 링크가 포함된 기본 응답을 보냅니다. 그리고 이것이 당신이 이 글을 읽고 있는 이유라면, 그 장난은 성공한 것입니다.
트리거는 봇이 응답해야 하는 명령입니다.
토큰 – 키워드 또는 쿼리 옵션(선택한 인식 유형에 따라 다름)
이 모드는 토큰 그룹의 순차적 비교를 사용하여 적합한 옵션만 선택합니다. 구문 분석은 왼쪽에서 오른쪽으로 진행됩니다. 첫 번째 그룹이 검색을 통과하지 못한 경우 나머지 그룹은 정렬되지 않고 봇은 다음 트리거를 보기 시작합니다. 모든 그룹이 처음 입력되면 트리거가 인식된 것으로 표시됩니다. 그렇지 않으면 분석에 참여하지 않습니다.
$ 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 ;
});