将LUIS实体放在子对话框中

时间:2017-06-06 18:16:08

标签: c# botframework luis

我正在使用Bot Framework,LUIS和ActionBinding开发一个机器人。

在我的一个意图处理程序中,我调用了一个新的Dialog,其中包含方法StartAsync(IDialogContext context)ReceiveMessageAsync(IDialogContext context, IAwaitable<IMessageActivity> result)

据我了解,用户在等待时输入的消息(context.Wait(ReceiveMessageAsync))将不会发送给LUIS,对吗?

因此,如果我需要了解用户的意思而不必解析字符串,这是我的选择吗?可以使用message.Text为每条消息调用ILuisService.QueryAsync作为选项吗?

我希望能够检测用户输入的实体,以便将它们映射到缺失的字段。例如,在此对话中:

User: I want to book a flight.                   // LUIS detects intent
Bot: Ok. Can you tell me more about your flight? // child dialog is called to handle the rest of the conversation
User: I want to go to Madrid.
Bot: To fly to Madrid you can choose between company A, B or C.
User: I want to go with A tomorrow night
Bot: Ok, searching for available tickets for tomorrow night in A...

在这种情况下,当检测到意图时没有初始实体,但可能存在,并且在这种情况下,机器人不会要求已经给出的信息。

对于我的项目,一个简单的表格与一对一的问答是不够的。如果用户想要更改一个或多个参数,我还需要对先前设置的参数进行更多验证和确认(即,我需要返回所有参数并检查更改的参数是否影响它们)。例如:

User: Wait, I want to fly to Barcelona instead.
Bot: Company A does not fly to Barcelona. You can choose between C and D.
User: Ok I want to fly with C.
Bot: There are tickets available for tomorrow night in company C. Keep the flight for tomorrow night?
User: yes.

任何有关最佳做法的提示或指导都会有很大帮助。

提前致谢。

编辑:

使用Sub Action解决方案,验证器在哪里运行?在FulfillAsync方法?我需要验证然后向用户发送问题并理解他发送的回复(解析实体)。在LuisAction中可以实现吗?

我想使用QueryValueFromLuisAsync,但在查看之后,我需要传递paramName,这是一个动作属性(如果我没有记错的话)和这就是我想要避免的。我不想将一个答案(即message.Text)映射到一个字段,我想将一个答案映射到多个字段。

假设我需要填充具有6个属性的模型。如果机器人向用户询问一个问题,并且在他的回复中有3个实体我想将这些实体映射到3个字段,并且之后只对剩余的非映射字段提出问题。

1 个答案:

答案 0 :(得分:3)

我对此的第一反应是避免使用自定义子对话框并与 <?php include "connection.php"; if(!isset($_SESSION)) { session_start(); } $cand1 = $_POST['cand1']; $cand2 = $_POST['vice1']; $sess = $_SESSION['SESS_NAME']; if(!$cand1){ $error="<center><h4><font color='#FF0000'>Please fill empty fields</h4></center></font>"; include"student.php"; exit(); } $cand1 = addslashes($cand1); $cand1 = mysqli_real_escape_string($con,$cand1); $sql = 'SELECT * FROM student WHERE username="'.$_SESSION['SESS_NAME'].'" AND status="VOTED"'; $result = mysqli_query($con,$sql); if (mysqli_num_rows($result)==1){ $msg="<center><h4><font color='#FF0000'>You have already been voted, No need to vote again</h4></center></font>"; include 'student.php'; exit(); } else{ $sql = 'UPDATE candidate SET votecount = votecount + 1 WHERE cand_id = "'.$_POST['cand1'].'" OR cand_id = "'.$_POST['vice1'].'"'; $sql2 = 'UPDATE student SET status="VOTED" WHERE username="'.$_SESSION['SESS_NAME'].'"'; $result = mysqli_query($con,$sql); $result2 = mysqli_query($con,$sql2); if(!$result && !$result2){ die("Error on mysql query".mysqli_error()); } else{ $msg="<center><h4><font color='#FF0000'>Congratulation, you have made your vote.</h4></center></font>"; include 'student.php'; exit(); } } ?> 一起使用并创建自己的验证器,如果您想在那里使用复杂逻辑或甚至覆盖子SubActions方法动作。

但是,如果这不可能,那么我会考虑重用QueryValueFromLuisAsync方法,其中操作应该是您要与之交互的模型。该函数将最终调用IsValid并将尝试分配结果或返回另一个意图/操作,具体取决于方案。我试试看。