BOT在第二步询问实体

时间:2016-09-22 06:44:17

标签: c# botframework luis

建立一个简单的客户服务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);
        }

1 个答案:

答案 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()两次。