首页 文章

调用在dialogFlow控制台中创建的意图

提问于
浏览
0

由于我是dialogFlow编码的新手,因此我很少有与在控制台DialogFlow中创建的意图相关的问题 .

1)如果我在dialogFlow控制台中创建一个意图“intent1”,是否可以在firebase函数中调用此意图?如果是,该怎么做?

2)如何让用户选择选项而不是键入?我必须使用什么?

3)每当用户输入数字时,如何配置要调用的意图?

4)实体,事件和行动及参数的目的是什么?

2 回答

  • 0

    我对Google编程的动作仍然有点新,但这是我的理解 .

    Dialogflow允许您定义意图 . 然后,您可以定义代码以实现这些意图 . 控制台为Google Cloud Functions提供内联JavaScript编辑器 . 您可以转到Google Cloud 功能控制台并查看其中的代码 . 或者,如果要部署更复杂的代码(例如,将JavaScript拆分为多个文件 - 内置编辑器仅适用于单个index.js文件),您可以将其翻转为“Web实现” .

    因此,对话流采用人类输入(他们说的一个短语),查看不同意图的短语训练集,并选择它认为正确的一个 . 然后它调用该意图的履行代码(代码存储在firebase中) . 因此,当你问“是否有可能在firebase函数中调用此意图”时,感觉有点倒退 . 意图是用户说话和调用firebase功能(通过HTTP)之间的 Binders . 意图本身不是可以调用的代码 .

    如果您希望用户选择选项,您可以创建具有选项名称的实体(如“one”,“two”,“three”等),或为每个选项名称创建意图 . 当用户说“一个”时会触发“一个”意图 . 由应用程序代码决定用户在菜单浏览结构中的位置,以了解“一个”的含义 . (您也可以在带屏幕的设备上使用建议,向他们展示他们必须点击的选项 . )理想情况下,您可以让用户说出短语或数字,以提供更大的灵活性 .

    所以你的第三个问题(如何配置在用户输入数字时调用的意图),你的应用程序可能会做一些事情,比如默认的“欢迎”意图(起点) . 你会口头上说菜单选择“说一个用于家居用品,两个用于服装,三个用于鞋子,......” . 然后记住用户在菜单中的位置 . 然后你将“一个”作为一个意图,并在 Cloud 功能中它将检查用户所在的菜单,因此会知道“就在欢迎意图之后,'一个'意味着家庭用品” . 该应用程序然后可能会问第二个问题,例如“说一个用于家具,两个用于花瓶,三个用于迪斯科球,......” . 如果他们再次说“一个”,它会达到相同的意图,但是你的应用程序会保存一个变量,记录用户在菜单树中的位置 .

    实体允许您定义术语词汇表 . 例如 . “我想买一个$ $ ” . 您可以定义一个颜色实体,其值为“红色”,“绿色”,“蓝色”等 . 您可以定义第二个实体“衣服”,“帽子”,“鞋子”等 . 意图训练短语可能是“我想买一件红色连衣裙“ . 对话流可以被告知“红色”,因为训练句子是“颜色”实体,而“礼服”是“事物”实体 . 然后将这些值作为参数传递给支持实现的Web服务 - 也就是说,您的“购买”意图将获得“颜色”和“事物”参数 .

    事件是系统生成的触发器而不是用户输入触发器 . 例如,启动应用程序的“欢迎”意图是系统生成事件 . 当应用从一个设备移动到另一个设备时,会使用另一个事件 . 如果您要求获得开始使用推送通知的权限,则还有其他系统事件 . 如果发生某些事情,这是一种让代码运行的方法(不仅仅是当用户说出某些内容时) .

    我希望有所帮助!

  • 2

    您可以直接通过事件调用一个意图,也可以通过API发送请求,并允许引擎自动匹配意图 . 按照the SDK documentation here上的说明进行操作 . 但基本上你做的是:

    const dialogflow = require('dialogflow');
    const sessionClient = new dialogflow.SessionsClient();
    // Define session path
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);
    
    const r_text = "What's the weather like in Rio de Janeiro?"
    
    // The text query request.
    const request = {
      "session": sessionPath,
      "queryParams": {
        "payload": payload
      },
      "queryInput": {
        "text": {
          "text": r_text,
          "languageCode": languageCode,
        },
      },
    };
    
    return sessionClient
    .detectIntent(request)
    .then(responses => {
      console.log('Detected intent');
      const result = responses[0].queryResult;
      ...do stuff with responses...
      return Promise.resolve('Resolved intent');
    })
    if (result.intent) {
      console.log(`  Intent: ${result.intent.displayName}`);
      return Promise.resolve('Resolved intent');
    } else {
      console.log(`  No intent matched.`);
      return Promise.resolve('Not resolved intent');
    }
    

    此外,在定义有效负载时,请注意一些令人讨厌的错误(这花费了我几天)并将您的JSON转换为API期望接收的结构:

    const payload = structjson.jsonToStructProto({
      "user": userId,
      "location": r_location,
      "timestamp": r_timestamp,
      "sender": r_sender
    })
    

    你可以在谷歌的回购中找到structjson library .

相关问题