Dialogflow es API.AI逻辑流
本讨论适用于任何集成,但作为示例,我将讨论Messenger。另外,为了提供上下文,我的后端是用Java编写的 据我所知,对于自定义场景(例如帐户链接),我们不应该直接使用API.AI。相反,Messenger设置(Dialogflow es API.AI逻辑流,dialogflow-es,Dialogflow Es,本讨论适用于任何集成,但作为示例,我将讨论Messenger。另外,为了提供上下文,我的后端是用Java编写的 据我所知,对于自定义场景(例如帐户链接),我们不应该直接使用API.AI。相反,Messenger设置(developer.facebook.com)中的“回调URL”应该指向我们自己的托管应用程序,该应用程序反过来调用api.api.ai/v1/query。对吗 其次,我在API.AI中的意图已经勾选了使用webhook。我假设逻辑流程如下: Messenger → my app (
developer.facebook.com
)中的“回调URL”应该指向我们自己的托管应用程序,该应用程序反过来调用api.api.ai/v1/query
。对吗
其次,我在API.AI中的意图已经勾选了使用webhook
。我假设逻辑流程如下:
Messenger → my app (webhook for Messenger) → api.ai → my app (webhook for api.ai)
显然这不是case-API。AI从不调用webhook
这是我发送给API.AI的JSON:
{"query":"hey","originalRequest":{"source":"facebook","data":{"object":"page","entry":[{"id":"xxx","time":yyy,"messaging":[{"sender":{"id":"zzz"},"recipient":{"id":"xxx"},"timestamp":yyy,"message":{"mid":"aaa","seq":bbb,"text":"hey"}}]}]}},"v":"20170704","sessionId":"1","lang":"en"}
{
"id": "xxx",
"timestamp": "yyy",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "hey",
"speech": "",
"action": "",
"parameters": {
"greeting": "hey"
},
"metadata": {
"inputContexts": [],
"outputContexts": [],
"intentName": "greeting",
"intentId": "zzz",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"contexts": []
},
"score": 1.0
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1"
}
这是API.AI的响应:
{"query":"hey","originalRequest":{"source":"facebook","data":{"object":"page","entry":[{"id":"xxx","time":yyy,"messaging":[{"sender":{"id":"zzz"},"recipient":{"id":"xxx"},"timestamp":yyy,"message":{"mid":"aaa","seq":bbb,"text":"hey"}}]}]}},"v":"20170704","sessionId":"1","lang":"en"}
{
"id": "xxx",
"timestamp": "yyy",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "hey",
"speech": "",
"action": "",
"parameters": {
"greeting": "hey"
},
"metadata": {
"inputContexts": [],
"outputContexts": [],
"intentName": "greeting",
"intentId": "zzz",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"contexts": []
},
"score": 1.0
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1"
}
这是否意味着我的应用程序应该调用webhook(这是同一个应用程序,但不同的端点)本身?你必须给你的意图一个动作!在您的响应中,操作字段为空 如果您使用的是集成,您的流程如下所示:
fb -> api.ai -> your service -> api.ai -> fb
您的自定义场景可以这样使用它(不使用集成,只需纯文本理解):
编辑: 因为我自己实现了帐户链接,所以我编写了以下中间件。 现在的流程是:
fb->service->api.ai->fb
,因为我只是过滤掉与身份验证相关的内容,并将消息直接转发到api.ai(使用api.ai facebook集成)或我的其他身份验证服务
(注:微服务是最好的)您的流程逻辑不正确 在你的情况下,Facebook永远不会直接与你的应用程序对话。它总是首先将用户输入发送到api.ai。然后,api.ai将尝试从您创建的所有意图中查找匹配项 这一点很重要,如果api.ai设法找到意图,它将调用您配置的webhook。但是,如果api.ai未能从您的任何意图中找到匹配项,它将调用回退意图,回退意图将把响应发布回Facebook。在这种情况下,将不会调用您的应用程序
我给你的建议是,在开始在Facebook上测试之前,使用api.ai中的测试工具(位于右上角),确保您的输入可以被正确的意图过滤,并且您的应用程序能够从api.ai隐藏您的输入。当api.ai用作NLU(即,您调用
/query
)时,它不会调用Webhook。所以,要么:
Messenger → my app (webhook for Messenger) → api.ai
或:
这取决于是否使用api.ai url进行无代码代理配置 在无代码代理中,api.ai将为您托管facebook交互端点。 [*][1]. 在无代码代理中,典型的流是
Messenger -> api.ai server->api.ai nlp -> your webhook
(如果为webhook实现启用了intent)
在您的场景中
Messenger -> your api server ->api.ai nlp -> your webhook /end point
为该目的而创建。这是一个明显的缺点,因为实现1个特定目的可能会被分割到多个端点(api)。在您的情况下,您可能没有启用webhook实现您的目的,“嘿”理想情况下,FB messenger不会与您的
messenger服务webhook进行对话。工作流应该是FB-messenger->api.ai->webhook(您的实际逻辑所在)
&即使您使用my-app(webhook for-messenger)
,您也不应该首先需要api.ai。这是因为在采取任何行动之前,您需要知道用户在说什么&这只能由NLP完成!使用我的应用程序(Messenger的webhook)
将直接取代NLP
第二件事,我们无法在api.ai json响应中看到实现。如果在任何时间点webhook调用失败,api.ai的默认响应将作为对用户查询的答复发布&当api.ai本身不理解用户想要说什么的上下文时,将调用回退。输入默认响应也将有助于调试
我勾选了“使用webhook”,并用更好的流程图更新了我的问题,请阅读更新。缺少您的操作。@wiradikusuma我添加了另一种使用api.ai的帐户链接的方法。ai的行为就像它直接从facebook获取信息一样。(调用webhook获取逻辑。)实际上,您可以在元数据字段中看到,找到了匹配的意图!但行动是失踪的!