Dialogflow es API.AI逻辑流

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 (

本讨论适用于任何集成,但作为示例,我将讨论Messenger。另外,为了提供上下文,我的后端是用Java编写的

据我所知,对于自定义场景(例如帐户链接),我们不应该直接使用API.AI。相反,Messenger设置(
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获取逻辑。)实际上,您可以在元数据字段中看到,找到了匹配的意图!但行动是失踪的!