首先提供一些信息:我的Google Assistant聊天机器人当前具有2个功能(意图),即注册一个用户(输入:用户的姓名和姓氏,出生日期和ID)并向另一位用户付款(输入:收件人的姓名和ID以及要支付的金额)。我已经完成了所有设置,并通过index.js webhook链接到了Firebase。
以下是我目前用于这两种意图的代码:
<textarea class="input" name="adresse" cols=50 rows=10 readonly="readonly" id="street" value=""></textarea>
<input style="width:130px;text-align: left" class="input" type="text" name="kundennr" id="kundennr" value="">
<!-- <?php
$sql = "SELECT * FROM `kunde` ORDER BY `kundennummer` ASC";
foreach ($dbh->query($sql) as $nav) {
$address = $nav['adresse'];
$name = $nav['kundennummer'];
echo "
<input type='text' name='textfield' id='textfield$name' value='$address'>
<a> | Kundennr: </a><a href='#' id='text' onclick='updateTxt(this);' >$name</a><br>
";
}
?> -->
<input type="text" name="textfield" id="textfieldstreet1" value="Add1..">
<a> | Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street1</a><br>
<input type="text" name="textfield" id="textfieldstreet2" value="Add2...">
<a> | Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street2</a><br>
<input type="text" name="textfield" id="textfieldstreet3" value="Add3...">
<a> | Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street3</a><br>
<input type="text" name="textfield" id="textfieldstreet4" value="Add4...">
<a> | Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street4</a><br>
我要实现一些非常简单的要求,即验证指定的ID大于6位,并且最好使出生日期在合理范围内(可能在1910年至2010年之间)。
问题是我无法找到有关如何执行此操作的清晰指南。我最初遵循的是有关Google Assistant和Dialogflow的Google教程以及其他一些在线指南。但是我感觉那并没有使我对助手的基本开发知识有所了解。
我查看了后续意图,但是如果我的要求没有得到满足,我特别想打电话给他们。简单来说:
app.intent('onboard user', (conv, {name, surname, birthdate, ID}) => {
var user = db.collection("Users").doc(ID);
var setUser = user.set({
"FirstName": name,
"Surname": surname,
"DateofBirth": new Date(birthdate),
"ID": ID,
"AccountCreated": new Date(),
});
conv.close('Is this correct? Your full name is ' + name + ' ' + surname + '. You were born on ' + birthdate + ' and your ID is ' + ID);
});
app.intent('payment', (conv, {recipient, amount, ID}) => {
var transactionRef = db.collection("Transactions").doc(ID);
var setTransaction = transactionRef.set({
"Recipient": recipient,
"Amount": amount,
"ID": ID,
"Date": new Date(),
});
conv.close('Is this correct? You wish to pay ' + recipient + ' with ID ' + ID + ' ' + amount.amount + ' ' + amount.currency);
});
因此,如果我能在此方面寻求帮助,以及寻求任何有用的指南/教程作为扩展对助手开发的理解的良好资源,那将不胜感激。
答案 0 :(得分:0)
我建议您看一下最近发布的Dialogflow教程https://dialogflow.com/docs/tutorial-build-an-agent/create-fulfillment-using-webhook#whats_next
答案 1 :(得分:0)
首先:您不应该使用conv.close(your answer)
,因为这样会结束对话。如果您使用该助手,助理将简单地回答,然后您会听到耳塞的声音,以进行关闭操作。
代替使用conv.ask("your question")
来回答用户的问题,然后要求更多输入。您可以为每个意图使用多个conv.ask()
语句。因此,第一个可用于实际向用户提供信息。
对于您使用的第一个示例,我将其转换为:
conv.ask('Thanks. I understood, that your full name is ' + name + ' ' + surname + '. You were born on ' + birthdate + ' and your ID is ' + ID);
conv.ask('Is this correct?')
首先重要的是,向用户提供有关用户输入内容的信息(使用语音,这非常重要,因为他们没有其他反馈)。然后问一个问题,使用户知道她可以(实际上应该)再次说话。
第二:关于验证输入:这是正常的Javascript。因此,如上所示,您可以再次执行以下操作:
if (ID.length < 6){
conv.ask(`I understood your ID to be ${ID}. But it should be at least six digits long. Can you repeat the ID please?`);
} else {
// the code from above
}
此示例使用JS模板字符串。我更喜欢它们而不是字符串连接。但是您必须使用反引号才能使它们工作!但这取决于您选择哪种样式。
最后:考虑使用SSML。尤其是在ID使用字符的情况下,使用元素会很有帮助,因为您可以使它单独拼写每个字符,而不是尝试从中拼出一个单词(对于ID来说,这听起来很奇怪)。但是,当然,前两件事是重要的部分。您可以随后完善响应:-)