API.AI 逻辑流程
API.AI flow of logic
此讨论适用于任何集成,但我将以 Messenger 为例。另外,为了提供上下文,我的后端是用 Java.
编写的
根据我的阅读,对于自定义场景(例如帐户链接),我们不应该直接使用 API.AI。相反,Messenger 设置 (developer.facebook.com
) 中的 "Callback URL" 应该指向 我们自己的托管应用程序 ,后者又会调用 api.api.ai/v1/query
。对吗?
其次,我在 API.AI 中的 Intent 已经勾选了 Use webhook
。我假设逻辑流程如下:
Messenger → my app (webhook for Messenger) → api.ai → my app (webhook for api.ai)
显然不是这样的——API.AI从不调用 webhook。
这是我发给到的JSON 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"}
这是来自 API.AI:
的回复
{
"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 -> your service -> api.ai -> your service -> fb
编辑:
由于我已经为自己实现了帐户链接,所以我编写了以下中间件。
https://github.com/hhucn/dbas-fb-hook/blob/master/src/dbas_fb_hook/handler.clj
现在的流程是:fb -> service -> api.ai -> fb
因为我只是过滤掉与身份验证相关的内容并将消息直接转发到 api.ai(使用 api.ai facebook 集成)或我的其他身份验证服务。
(PS。微服务是最好的)
你的流程逻辑不对
在您的情况下,Facebook 永远不会直接与您的应用对话。它总是首先将用户输入发送到 api.ai。 api.ai 然后将尝试从您创建的所有意图中找到匹配项。
这很重要,如果 api.ai 设法找到一个意图,它将调用您配置的 webhook。但是,如果 api.ai 无法从您的任何意图中找到匹配项,它会调用后备意图,这将 post 将响应返回给 Facebook。在这种情况下,您的应用程序将不会被调用。
我对您的建议是,在开始在 Facebook 上进行测试之前,使用 api.ai 中的测试工具(位于右上角)以确保您的输入可以通过正确的意图进行过滤,并且您的应用能够从 api.ai.
隐性输入
当API.AI用作NLU(即您调用/query
)时,它不会调用webhooks。所以,它是:
Messenger → my app (webhook for Messenger) → api.ai
或:
Messenger → api.ai → my app (webhook for api.ai)
这取决于您是否使用 api.ai url 进行无代码代理配置。
在无代码代理中,api.ai 将为您托管 facebook 交互端点。
[https://bots.api.ai/facebook/*][1]。
在 code-less agent 中,典型的流程是
Messenger -> api.ai server->api.ai nlp -> your webhook
(如果为 webhook 实现启用了意图)
在你的场景中
Messenger -> your api server ->api.ai nlp -> your webhook /end point
为此而创建 intent.This 是一个重大缺点,因为 1 个特定意图的实现可能会跨越多个端点,api's.In 你的情况,你可能没有启用webhook 实现您的意图,'Hey'
理想情况下,FB Messenger 不会与您的 webhook for messenger service
交谈。工作流程应该是 FB messenger->api.ai->webhook (where your actual logic resides)
& 即使如果你使用 my app (webhook for Messenger)
那么你不应该首先需要 api.ai 。这是因为在采取任何行动之前,您需要知道用户在说什么,而这只能通过 NLP 来完成!使用 my app (webhook for Messenger)
将直接替换 NLP。
其次,我们无法在 api.ai json 响应中看到实现。如果在任何时间点 webhook 调用失败,来自 api.ai 的默认响应将作为对用户查询的回复发布,当 api.ai 本身不理解用户想要的上下文时将调用回退说。输入默认响应也将帮助您进行调试。
此讨论适用于任何集成,但我将以 Messenger 为例。另外,为了提供上下文,我的后端是用 Java.
编写的根据我的阅读,对于自定义场景(例如帐户链接),我们不应该直接使用 API.AI。相反,Messenger 设置 (developer.facebook.com
) 中的 "Callback URL" 应该指向 我们自己的托管应用程序 ,后者又会调用 api.api.ai/v1/query
。对吗?
其次,我在 API.AI 中的 Intent 已经勾选了 Use webhook
。我假设逻辑流程如下:
Messenger → my app (webhook for Messenger) → api.ai → my app (webhook for api.ai)
显然不是这样的——API.AI从不调用 webhook。
这是我发给到的JSON 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"}
这是来自 API.AI:
的回复{
"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 -> your service -> api.ai -> your service -> fb
编辑: 由于我已经为自己实现了帐户链接,所以我编写了以下中间件。 https://github.com/hhucn/dbas-fb-hook/blob/master/src/dbas_fb_hook/handler.clj
现在的流程是:fb -> service -> api.ai -> fb
因为我只是过滤掉与身份验证相关的内容并将消息直接转发到 api.ai(使用 api.ai facebook 集成)或我的其他身份验证服务。
(PS。微服务是最好的)
你的流程逻辑不对
在您的情况下,Facebook 永远不会直接与您的应用对话。它总是首先将用户输入发送到 api.ai。 api.ai 然后将尝试从您创建的所有意图中找到匹配项。
这很重要,如果 api.ai 设法找到一个意图,它将调用您配置的 webhook。但是,如果 api.ai 无法从您的任何意图中找到匹配项,它会调用后备意图,这将 post 将响应返回给 Facebook。在这种情况下,您的应用程序将不会被调用。
我对您的建议是,在开始在 Facebook 上进行测试之前,使用 api.ai 中的测试工具(位于右上角)以确保您的输入可以通过正确的意图进行过滤,并且您的应用能够从 api.ai.
隐性输入当API.AI用作NLU(即您调用/query
)时,它不会调用webhooks。所以,它是:
Messenger → my app (webhook for Messenger) → api.ai
或:
Messenger → api.ai → my app (webhook for api.ai)
这取决于您是否使用 api.ai url 进行无代码代理配置。
在无代码代理中,api.ai 将为您托管 facebook 交互端点。 [https://bots.api.ai/facebook/*][1]。 在 code-less agent 中,典型的流程是
Messenger -> api.ai server->api.ai nlp -> your webhook
(如果为 webhook 实现启用了意图) 在你的场景中
Messenger -> your api server ->api.ai nlp -> your webhook /end point
为此而创建 intent.This 是一个重大缺点,因为 1 个特定意图的实现可能会跨越多个端点,api's.In 你的情况,你可能没有启用webhook 实现您的意图,'Hey'
理想情况下,FB Messenger 不会与您的 webhook for messenger service
交谈。工作流程应该是 FB messenger->api.ai->webhook (where your actual logic resides)
& 即使如果你使用 my app (webhook for Messenger)
那么你不应该首先需要 api.ai 。这是因为在采取任何行动之前,您需要知道用户在说什么,而这只能通过 NLP 来完成!使用 my app (webhook for Messenger)
将直接替换 NLP。
其次,我们无法在 api.ai json 响应中看到实现。如果在任何时间点 webhook 调用失败,来自 api.ai 的默认响应将作为对用户查询的回复发布,当 api.ai 本身不理解用户想要的上下文时将调用回退说。输入默认响应也将帮助您进行调试。