DialogFlow-从webhook设置allRequiredParamsPresent吗?

时间:2019-02-15 15:05:26

标签: dialogflow chatbot

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

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

不幸的是,在控制台中,如果我都按要求设置,则对话不会结束(这就是为什么我想在结束时进行覆盖),并且如果我不要求它们,则对话会在没有所有必需参数的情况下结束在场。

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

1 个答案:

答案 0 :(得分:3)

我建议您对每个参数使用意图,而不要使用实体。这样可以解决两个问题:

  • 如果用户没有为所需参数提供正确的值,则dialogflow 不会继续不断地在循环中问同样的问题
  • 您可以控制下一个要填充的参数

假设您需要3个参数来购买手表:颜色,日期/日期时间,费用
您的代理将具有以下意图:

  • 购买手表-> input_context =无,output_context = buy_watch
    我要买手表
    我想买黑色的手表
    ...
  • 获取颜色-> input_context =颜色,output_context = buy_watch
    黑色
    我要用黑色
    ...
  • 获取日期-> input_context =日期,output_context = buy_watch
    我明天要
    我下周要
    (它将同时捕获日期和日期范围,而不捕获其他任何内容,如果您有任何逻辑,则可以使用逻辑将值分配给param)
  • 获取成本-> input_context =成本,output_context = buy_watch
    大约10000
    预算为1万
  • got_all_details -> event = e_got_all_details

对于每种意图,您将拥有全部3个可选参数。
另外,您将需要将参数的默认值设置为$entity以实现自己的意图,将#context.entity设置为其他参数。
例如,在意图get_color中,您将具有以下参数和默认值:

color = $color  
date = #buy_watch.date  
cost = #buy_watch.cost  

最后,您必须为上述所有意图调用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  

获取所有参数时,无论通过什么顺序获取它们,都将通过事件调用意图got_all_details

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

我遇到了类似的问题,在我看来,这是处理参数的最有效方法,用于验证参数并在您获得意外值时进行处理(使用特定于意图的后续回退意图)。

编辑1:还有一种额外的逻辑,可以根据您从日期或日期范围实体中获取的值来为日期分配值。

if params["date"] or params["date-range"]:
    date = params["date"] if params["date"] else params["date-range"]  

所有意图都有训练短语,这些短语将尝试捕获参数而没有任何顺序,但不会将其标记为必需。
因此,如果用户说我明天要购买手表,则buy_watch的意图将随着参数日期被触发。该代码将检查颜色和成本是否丢失,并在设置适当的output_context后提示输入。

希望有帮助。