Что происходит с вашим ботом, так это то, что он в основном видит часть «да» первых двух ответов одновременно и игнорирует остальную часть высказывания второго ответа. Причина, по которой ваш третий ответ не выглядит таким же, в том, что он не начинается с «да». При этом у вас есть два варианта:
ОПЦИЯ 1 : Вместо использования «Подтверждение запроса» вы можете использовать «Выбор запроса». ChoicePrompt имеет свойство 'synonym', которое вы можете установить при создании подсказки выбора:
return await step.prompt(CHOICE_PROMPT, {
prompt: 'Please enter your mode of transport.',
choices: ChoiceFactory.toChoices([
{value:"my vehicle", synonyms:["car", "truck"]},
{value:"public transporation", synonyms:["bus", "shuttle"]},
{value: "slowly", synonyms:["walk", "bicycle"]}],
)
})
Как вы можете видеть здесь, это дает немного места для маневра в том, что пользователь может ввести.
![options](https://i.stack.imgur.com/SDDuy.png)
![synonym example](https://i.stack.imgur.com/EsV2o.png)
ВАРИАНТ 2 : маршрут синонима - это место, где вы захотите go, если вы думаете, что ваши пользователи будут только добавлять ОЧЕНЬ ОГРАНИЧЕННЫЕ ответы на приглашения чат-бота. Если вы хотите расширить свои возможности реагирования клиента на этот тип вопроса, вам фактически потребуется какая-то языковая модель. Как вы спросили в своем вопросе, LUIS будет выбором.
Вы можете создать это, сделав компонент распознавателя, который взаимодействует с LUIS, он может выглядеть примерно так:
export class LuisComponent {
private recognizer: LuisRecognizer;
constructor(config: LuisApplication) {
const luisConfig: LuisApplication = {applicationId: "LuisAppId", endpoint: "LuisAPIHostName" , endpointKey: "LuisAPIKey"}
this.recognizer = new LuisRecognizer(luisConfig, {}, true)
};
public async executeLuisQuery(context: TurnContext): Promise<RecognizerResult> {
const result = await this.recognizer.recognize(context);
return result;
};
}
Это отправит ваши запросы в LUIS и вернет результат запроса. Единственное, что вам нужно сделать, это создать настраиваемое приглашение, которое использует этот компонент и возвращает результат из приглашения.
export class ConfirmPrompt extends Prompt<boolean> {
private luis: LuisComponent ;
constructor(id: string, recognizer: LuisComponent )
super(id, validator);
this.luis = recognizer;
};
protected async onRecognize(context: TurnContext, state: object, options: PromptOptions): Promise<PromptRecognizerResult<boolean>> {
const luisResult = await this.luis.executeLuisQuery(context);
const topIntent = LuisRecognizer.topIntent(luisResult);
let result: PromptRecognizerResult<boolean> = { succeeded: false, value: undefined };
switch (topIntent) {
case "Confirm": {
result.succeeded = true;
result.value = true;
break;
};
case "No": {
result.succeeded = true;
result.value = false;
};
default: {
result.succeeded = false;
};
};
return result;
};
protected async onPrompt(context: TurnContext, state: object, options:
PromptOptions, isRetry: boolean): Promise<void> {
if (isRetry && options.retryPrompt) {
await context.sendActivity(options.retryPrompt, undefined, InputHints.ExpectingInput);
} else if (options.prompt) {
await context.sendActivity(options.prompt, undefined, InputHints.ExpectingInput);
};
};
};
Для чего-то такого простого, как подтверждение, вы просто добавляете возможные параметры для что люди могут сказать в качестве подтверждения. Вы можете видеть в моей модели ниже, что у меня есть 5 СТРАНИЦ возможных высказываний для того, что может быть отправлено в качестве подтверждения:
![testing confirm intent](https://i.stack.imgur.com/tAbUt.png)
Это конкретное намерение использует только то, что я считаю «фондовыми фразами», поэтому я в основном добавил каждую опцию того, как, я думаю, пользователь может что-то подтвердить
Кроме того (это выходит за рамки вашего вопроса, но хорошая информация) LUIS и другие службы понимания языка также позволяют использовать так называемые «сущности», так что вы можете поставить частичное высказывание и отметить остаток как сущность, которая допускает некоторые вариации ответов от пользователей. Ниже приведен снимок экрана с намерением «забронировать рейс» из Bot Framework Core Bot sample:
![Book Flight Intent from LUIS](https://i.stack.imgur.com/59KvF.png)
As Вы можете видеть, что это намерение имеет метки «сущности» «Аэропорт» и «DateTime», так что дальнейшие высказывания о том, как человек может сказать «Закажи мне рейс в XYZ», не беспокоясь о том, чтобы поместить в КАЖДЫЙ ОДИН ВОЗМОЖНЫЙ аэропорт мир в их модели.
По мере расширения вашего чат-бота использование службы понимания языка, такой как LUIS, позволит вам вести более естественный диалог с вашими клиентами / пользователями. Удачи на вашем боте!