Я пытаюсь построить чат-бот с помощью Microsoft Bot Framework
Я определил словарь здесь
var dict = {'English 101?': 'Room 205', 'English 102?': 'Room 309',
'Math 301': 'Room 705', 'Math 302': 'Room 704'};
Я хочу, чтобы бот отвечал "в комнате 205", когда пользователь спрашивает "где английский 101".
Я жестко запрограммировал это следующим образом:
var builder = require('botbuilder');
var helloBot = new builder.TextBot();
var dialog = new builder.CommandDialog();
dialog.matches('^Where is English 101?', builder.DialogAction.send('In Room 205'));
dialog.matches('^Where is English 102?', builder.DialogAction.send('In Room 309'));
dialog.matches('^Where is Math 301?', builder.DialogAction.send('In Room 705'));
dialog.matches('^Where is Math 302?', builder.DialogAction.send('In Room 704'));
dialog.onDefault(builder.DialogAction.send("I'm sorry. I didn't understand."));
helloBot.listenStdin();
Вместо того, чтобы жестко задавать каждый вопрос, я хочу передать регулярное выражение первому параметру функций dialog.matches() и, используя его в качестве ключа, бот должен иметь возможность получить значение из словаря и отправить его обратно пользователю.
Я попробовал следующее, но это не сработало:
var str = ""
dialog.matches(str = ? , builder.DialogAction.send(dict[str.slice(9)]))
Как я могу быть в состоянии передать стандартный ввод в "str" и получить значение из словаря?
2 ответа
Вы хотите использовать намерения или инициировать сопоставление действий.
Для целей, во-первых, инициализируйте ваши намерения:
var intents = new builder.IntentDialog();
Затем передайте диалог намерения вашему боту:
bot.dialog('/', intents);
Затем вы можете построить свои совпадения, используя регулярные выражения:
intents.matches(/English 101/i, (session) => {
//
});
Вы должны убедиться, что есть что-то для обработки сообщений без совпадений:
intents.onDefault([
(session, args, next) => {
//Do something by default
}]);
Другим способом было бы использовать triggerAction
в диалоге (который также использует регулярные выражения):
bot.dialog("/English", (sess, args, next) => {
//Handle English 101
}).triggerAction({
matches: /English 101/i
});
С помощью любого из них вы сможете использовать стандартные регулярные выражения JavaScript для сбора пользовательских данных и предоставления соответствующего диалога.
Вы также можете искать только /where is/i
, а затем получить сообщение от сеанса с session.message.text
, а затем проанализировать это, чтобы получить цель.
В идеале, ваш бот хорошо подходит для использования LUIS. Вы можете создать единственное намерение для расположения класса и единую сущность для класса. Затем вы можете обучать свое приложение LUIS различным фразам, заменяя точные имена классов токеном сущности. Затем, когда LUIS достигнет вашего намерения, будет доступна сущность, которую вы можете использовать для доступа к своему словарю и определения местоположения. Я написал пост об этом недавно, если вам интересно.
(Примечание: это написано на TypeScript, но вы понимаете суть.)
Согласно документации здесь вы должны просто использовать формат регулярного выражения Javascript в вашем matches
метод.