建立一个简单的客户服务BOT,设计了LUIS模型,当订单号没有时它工作得很好。在第一步中提供。例如。我的订单ABC0898787的状态是什么? 正确检测到意图并且ABC0898787被识别为实体。
但是,需要调整机器人以进行如下对话:
用户:我的订单状态是什么
Bot:请提供订单号
用户:( ABC0986767)或(ABC0986767)
Bot应该能够将号码映射到实体并处理请求。
意图方法的代码,在没有设置LUIS模型以将单个单词作为实体的情况下,最好的方法是集成第二步吗?
[LuisIntent("OrderStatus")]
public async Task OrderStatus(IDialogContext context, LuisResult result)
{
var returnMsg = "You wanted to check the order status";
var orderStatus = "Dispatched";
var deliveryDate = DateTime.Now.AddDays(3);
var entities = new List<EntityRecommendation>(result.Entities);
if(entities.Any((entity)=> entity.Type == "Order"))
{
var orderEntity = entities.Where((entity) => entity.Type == "Order").FirstOrDefault();
var resolutionStr = orderEntity.Entity;
if(!string.IsNullOrEmpty(resolutionStr))
{
returnMsg = "Your order " + resolutionStr + " is " + orderStatus + " and expected to arrive " + deliveryDate.Humanize();
}
}
await context.PostAsync(returnMsg);
context.Wait(MessageReceived);
}
答案 0 :(得分:1)
将MessageReceived替换为将接受用户输入的方法名称。在此之前,检查实体是否存在。如果存在,则使用MessageReceived,否则使用此方法。
伪代码:
if (entity.exists)
OutputResult()
Context.Wait(MessageReceived)
else //entitiy doesn't exist
SendMessage("Please enter order number")
Context.Wait(MyMethod)
名为MyMethod的方法如下所示:
public async Task MyMethod(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var response = await argument;
string text = response.Text;
我认为微软并没有明确表示MessageReceived只是一个方法的名称(你没看到),它可以用任何其他方法的名称替换。根据条件,方法中也可以有多个context.Wait
,只要代码在用户发送新消息之前没有到达context.Wait()两次。