由于我是dialogFlow编码的新手,我几乎没有与在控制台DialogFlow中创建的意图相关的问题。
1)如果我在dialogFlow控制台中创建一个intent“intent1”,是否可以在firebase函数中调用此intent?如果是,该怎么做?
2)如何让用户选择选项而不是输入?我必须使用什么?
3)如何配置在用户输入号码时调用的意图?
4)实体,事件和行动的目的是什么?参数Δ
答案 0 :(得分:2)
我对Google编程的动作有点新,但这是我的理解。
Dialogflow允许您定义意图。然后,您可以定义代码以实现这些意图。控制台为Google Cloud Functions提供内联JavaScript编辑器。您可以访问Google云计算功能控制台并查看其中的代码。或者,如果要部署更复杂的代码(例如,将JavaScript拆分为多个文件 - 内置编辑器仅适用于单个index.js文件),您可以将其翻转为“Web实现”。
因此,对话流采用人类输入(他们说的一个短语),查看不同意图的短语训练集,并选择它认为正确的一个。然后它调用该意图的履行代码(代码存储在firebase中)。所以当你问“是否有可能在firebase函数中调用这个意图”时,感觉有点倒退。意图是用户说某事和调用firebase函数(通过HTTP)之间的粘合剂。意图本身不是可以调用的代码。
如果您希望用户选择选项,您可以创建具有选项名称的实体(如“one”,“two”,“three”等),或为每个选项名称创建意图。当用户说“一个”时会触发“一个”意图。由应用程序代码决定用户在菜单浏览结构中的位置,以了解“一个”的含义。 (您还可以在带屏幕的设备上使用建议,向他们展示他们必须点击的选项。)理想情况下,您可以允许用户说出短语或数字,以提供更大的灵活性。
所以你的第三个问题(如何配置在用户输入数字时调用的意图),你的应用程序可能会做一些事情,比如默认的“欢迎”意图(起点)。你会口头上说菜单选择“说一个用于家居用品,两个用于服装,三个用于鞋子,......”。然后记住用户在菜单中的位置。然后你将“一个”作为一个意图,然后在云函数中它将检查用户所在的菜单,因此会知道“就在欢迎意图之后,'一个'意味着家庭用品”。然后,应用程序可能会问第二个问题,例如“说一个用于家具,两个用于花瓶,三个用于迪斯科球,......”。如果他们再次说“一个”,它会达到相同的意图,但你的应用程序会保存一个变量,记录用户在菜单树中的位置。
实体允许您定义术语词汇表。例如。 “我想买一个$ {color} $ {thing}”。您可以定义一个颜色实体,其值为“红色”,“绿色”,“蓝色”等。您可以定义“礼服”,“帽子”,“鞋子”等的第二个实体。意图训练短语可能是“我想要买一件红色连衣裙“。对话流可以被告知“红色”,因为训练句子是“颜色”实体,而“礼服”是“事物”实体。然后将这些值作为参数传递给支持实现的Web服务 - 也就是说,您的“购买”意图将获得“颜色”和“事物”参数。
事件是系统生成的触发器而不是用户输入触发器。例如,启动应用程序的“欢迎”意图是系统生成事件。当应用从一个设备移动到另一个设备时,会使用另一个事件。如果您要求获得开始使用推送通知的权限,则还有其他系统事件。如果发生某些事情,这是一种让代码运行的方法(不仅仅是当用户说出某些内容时)。
我希望有所帮助!
答案 1 :(得分:0)
您可以直接通过“事件”调用一个意图,也可以通过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');
}
此外,在定义有效负载时,请注意一个烦人的bug(花了我几天时间)并将JSON转换为API希望接收的结构:
const payload = structjson.jsonToStructProto({
"user": userId,
"location": r_location,
"timestamp": r_timestamp,
"sender": r_sender
})
您可以在Google的存储库中找到structjson library。