如何在bot框架4中使用文本提示



我正在将在Framework 3中实现的代码更改为Framework v4。

用例如下所示:用户输入类似于";我正在搜索XY";。我们确定意图,如果它是MyIntent,我们在数据库中搜索输入,如果我们找到它,我们向用户显示文本,如";我在数据库中找到了你的搜索项目";。然后,我们展示另一个文本(一个后续问题(,说一些类似";这个部门叫什么名字&";。

用户可以输入一些内容,它将被处理。但关键是,在这一点上,用户可以再次说";我正在搜索ABC";。也就是说,用户可以忽略聊天机器人提出的后续问题,并输入正常输入。聊天机器人预计也会像正常的一样处理它。

同时,如果一开始在数据库中没有找到输入的项目,我们希望返回类似于";对不起,我在数据库中找不到它。还有什么我能帮你的吗">

我的意思是,我在这个意图中有一个条件。

以前,这部分文本提示只通过以下方式实现:

PromptDialog.Text(context, answerMe, "What is the name of the department?", $"Sorry I don't understand.", 3); 

其中context是类型IDialogContextanswerMe是如下方法:

private async Task answerMe(IDialogContext context, IAwaitable<string> res1)
{
string text = await res1;
if (Functions.IsCancelList(text, CancelOptionsEqual, CancelOptionsContain))
{
await CancelDialog(context, "Empty");
}
else
{

string s = text;
bool str=Functions.isText(s);
...
await CallMethod(context, text);
}
}

现在,我的课程如下:

using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using RestSharp;
using System;
using System.Threading;
using System.Threading.Tasks;
using XYT.Models;
using XYT.Services;
namespace XYZ.Dialogs
{
public class MyMainDialog: MainDialogBase
{
private readonly ICommonBotServices _commonBotServices;
public MyMainDialog(IConfiguration configuration, ILogger<MainDialogBase> logger, ICommonBotServices commonBotServices, IServiceProvider serviceProvider, UserState userState)
: base(configuration, logger, serviceProvider, userState)
{
_commonBotServices = commonBotServices;
}
protected override async Task<DialogTurnResult> ProcessInput(WaterfallStepContext wtrflCntxt, CancellationToken cancellationToken)
{

var result = await _commonBotServices.Luis.RecognizeAsync<MyRecognizer>(wtrflCntxt.Context, cancellationToken);
var intent = result.TopIntent();
switch (intent.intent)
{

case MyRecognizer.Intent.MyIntent:

await wtrflCntxt.Context.SendActivityAsync($"Let me search");
String answer = $"I found it in the database,...";

await wtrflCntxt.Context.SendActivityAsync(answer);
//??? to be implemented

return await wtrflCntxt.EndDialogAsync();
}
}
}

我不知道该如何实现这个用例。我不认为瀑布对话框对我来说是正确的。如有任何帮助,我们将不胜感激。

首先,如果您没有,我会看看关于从V3迁移到V4的文档。

有很多不同的方法可以实现你想要的,所以我很难给出确切的答案。一般来说,我会说瀑布对话是最好的选择。

如果你使用瀑布对话框,听起来你需要处理中断,所以如果:

  1. 用户询问"我正在搜索XY">
  2. 机器人启动瀑布对话框并提示:;这个部门叫什么名字">
  3. 用户忽略提示并询问;我正在搜索ABC">

。。。它需要能够中断对话。为此,我会查看Core Bot示例。它通过"取消"one_answers"帮助"对话框处理中断。基本上,所有用户输入都首先进入该对话框。如果用户说";取消";或";"帮助";,它迭代当前对话框并处理这些意图。你可能会用MyIntent做一些类似的事情,而不是取消和帮助请注意,此示例没有使用LUIS。您需要让LUIS查找意图,然后根据这些进行中断

如果您正在寻找更灵活的东西,您可能需要考虑自适应对话框。瀑布式对话框非常有程序性;if user says "X" in this circumstance, do "Y"。自适应对话框要灵活得多,因为用户当前正在做什么并不重要——如果他们说的话有匹配的意图,它就会启动适当的对话框。我认为这更符合您的需求,但我们没有迁移文档

Composer是一个基于GUI的机器人构建器,它基于Adaptive Dialogs,你甚至可能更喜欢它。

最新更新