2

构建一个简单的客户服务 BOT,设计了 LUIS 模型,并且在订单号时效果很好。是在第一步本身中提供的。例如。我的订单 ABC0898787 的状态如何?其中意图被正确检测并且 ABC0898787 被识别为实体。

但是,需要调整机器人以进行如下对话:

用户:我的订单状态如何

Bot:请提供订单号

用户:(ABC0986767)或(ABC0986767)

机器人应该能够将数字映射到实体并处理请求。

意图方法的代码,在不设置 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);
        }
4

1 回答 1

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.Waits,只要代码在用户发送新消息之前没有到达 context.Wait() 两次。

于 2016-09-22T09:04:33.457 回答