DialogFlow - 从webhook设置allRequiredParamsPresent?

ara*_*ao6 6 chatbot dialogflow-es

我正在使用云功能来响应webhooks,如文档中所述.在DialogFlow上,我将所有参数都设置为可选,而我想控制动态需要哪些参数.是否可以动态设置allRequiredParamsPresent?其次,我们如何偏置下一个输入/响应以填充某个参数?

用户可以输入日期或日期范围,两者都是不同的参数.需要一个或另一个,但不是两个.

不幸的是,在控制台中,如果我根据需要设置两者,对话框不会结束(这就是我想在结束时覆盖的原因),如果我不需要它们,对话结束时不会出现所有必需的参数.

此外,根据后续问题,代理人要求从Web钩子询问,我想偏向用户的下一个答案来填充特定@sys.any参数,因为它一直填充错误的参数.

sid*_*491 3

我建议您对所需的每个参数使用意图,而不是使用实体。这将解决两个问题:

  • 如果用户没有为所需参数提供正确的值,对话流将不会继续循环询问相同的问题
  • 您可以控制接下来填充哪个参数

假设您需要 3 个参数来购买手表:颜色、日期/日期时间、成本
您的代理商将有以下意图:

  • buy_watch -> input_context = None, output_context = buy_watch
    我想买一块手表
    我想买黑色的手表
    ...
  • get_color -> input_context = color,output_context = buy_watch
    Black
    我想要黑色
    ...
  • get_date -> input_context = date,output_context = buy_watch
    我明天想要它,
    我下周想要它
    (这将捕获日期和日期范围,而不是其他任何东西,如果您得到以下任何一个,您可以有逻辑将值分配给参数他们)
  • get_cost -> input_context = cost, output_context = buy_watch
    10000左右
    预算是15k
  • 得到的所有详细信息--> 事件 = e_got_all_details

对于每个意图,您都可以选择所有 3 个参数。
此外,您还需要将参数的默认值设置为$entity自身意图和#context.entity其他参数。
例如,在意图中get_color,您将具有以下参数和默认值:

color = $color  
date = #buy_watch.date  
cost = #buy_watch.cost  
Run Code Online (Sandbox Code Playgroud)

最后,您必须调用 webhook 来实现上述所有意图。
在 webhook 中,您必须检查传入意图的参数,并根据缺少的参数 设置output_context + response_message 。

params =  intent_request["query_result"]["parameters"]  
case 1 --> if not params["color"]:  set output_context = color and response = what color do you want  
case 2 --> if not params["date"]:  set output_context = date and response = when do you want to buy  
case 3 --> if not params["cost"]:  set output_context = cost and response = what is your budget    
case 4 --> if you get all params: call event e_got_all_details  
Run Code Online (Sandbox Code Playgroud)

got_all_details当您获取所有参数时,无论您以什么顺序获取它们,都会通过事件调用Intent 。

根据响应的output_context和您在意图中配置的input_context,将触发正确的意图,您将能够获得正确的值。

我遇到了类似的问题,在我看来,这是处理参数验证和处理意外值时最有效的方法(使用意图特定的后续后备意图)。

编辑 1:将有一个额外的逻辑来为日期分配值,具体取决于您从日期或日期范围实体获得的值。

if params["date"] or params["date-range"]:
    date = params["date"] if params["date"] else params["date-range"]  
Run Code Online (Sandbox Code Playgroud)

所有意图都将具有训练短语,这些短语将尝试在没有任何顺序的情况下捕获参数,但不将它们标记为必需。
因此,如果用户说我明天想买一块手表buy_watch意图将通过参数日期触发。该代码将检查颜色和成本是否丢失,并在设置适当后提示output_context

希望能帮助到你。