【发布时间】:2018-09-12 13:55:12
【问题描述】:
我创建了一个聊天机器人,它可以告知用户我(大)家庭的成员以及他们的住所。我已经使用 MySQL 创建了一个小型数据库,其中存储了这些数据,并在适当时使用 PHP 脚本获取它们,具体取决于用户与聊天机器人的交互。
除了Default Fallback Intent 和Default Welcome Intent,我的聊天机器人还包含两个意图:
NamesLocation_context
第一个意图 (Names) 由诸如“谁是约翰·史密斯?”之类的短语训练。并有一个输出上下文(称为context,持续时间为 10 个问题)。这个问题的一个可能答案是“约翰是我的叔叔”。第二个意图 (Location_context) 由诸如“他住在哪里?”之类的短语训练。并且有一个输入上下文(来自Names)。这个问题的一个可能答案是“约翰住在纽约。”
Names 意图包含两个参数:
- 参数名称:给定名称、姓氏。
- 实体:@sys.given-name、@sys.last-name。
- 值:$given-name,$last-name。
这两个参数代表用户给出的全名。 Location_context 意图不包含任何参数。
PHP 脚本如下:
<?php
$dbServername = '******************';
$dbUsername = '******************';
$dbPassword = '******************';
$dbName = '******************';
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
// error_reporting(E_ALL);
// ini_set('display_errors', 'on');
header('Content-Type: application/json');
$method = $_SERVER['REQUEST_METHOD'];
if($method == 'POST'){
$requestBody = file_get_contents('php://input');
$json = json_decode($requestBody);
$action = $json->result->action;
$first_name = $json->result->contexts[0]->parameters->{'given-name'};
$last_name = $json->result->contexts[0]->parameters->{'last-name'};
$lifespan = $json->result->contexts[0]->lifespan;
$sql = "SELECT * FROM family WHERE name LIKE '%$first_name%$last_name%';";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$person = $row;
}
switch ($action) {
case 'Name':
$speech= "$first_name is my" . $person["name"] . ".";
break;
case 'Location':
$speech = "$first_name is living in {$person["location"]}.";
break;
default:
$speech = "Please ask me something more relevant to my family";
break;
}
}
else {
$speech = "Sorry, $first_name $last_name is not a member of my family.";
}
$response = new \stdClass();
$response->speech = $speech;
$response->displayText = $speech;
$response->source = "agent";
echo json_encode($response);
}
else
{
echo "Method not allowed";
}
?>
在 Dialogflow 中,在询问后,例如“谁是约翰史密斯?”并得到正确答案“约翰是我的叔叔”。然后我问“他住在哪里?”我得到了正确的答案“约翰住在纽约。”。 Dialogflow 对第二个问题的 json 响应是:
{
"id": "*****************************",
"timestamp": "2018-04-04T08:26:39.993Z",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "Where is he living"
"action": "Location",
"actionIncomplete": false,
"parameters": {},
"contexts": [
{
"name": "context",
"parameters": {
"given-name.original": "John",
"last-name.original": "Smith",
"given-name": "John",
"last-name": "Smith"
},
"lifespan": 9
}
],
"metadata": {
"intentId": "*****************************",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"webhookResponseTime": 93,
"intentName": "Location_context"
},
"fulfillment": {
"speech": "John is living in New York.”,
"displayText": "John is living in New York.",
"messages": [
{
"type": 0,
"speech": "John is living in New York."
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success",
"webhookTimedOut": false
},
"sessionId": "*****************************"
}
但是,当我在 Google 助手中输入完全相同的问题(在输入 Talk to my test app 之后)时,我在第一个问题上得到了相同的答案,但我得到的是“住在洛杉矶”。对于第二个问题。请注意此答案中的两件事。首先,变量$first_name 没有任何值(因为它没有设置)并且位置“洛杉矶”是数据库中最后一个家庭成员的位置。因此返回这个位置是因为 $first_name 和 $last_name 在 mysql 查询中没有分配值(因为它们没有设置),并且由于某种原因返回了数据库最后一个人的位置。
令人沮丧的是,我无法检查 Google 助理的 json 响应,因为我可以在 Dialogflow 中轻松完成。但是,经过一番试验后,我发现在 Google Assistant 中 $lifespan 始终为 0(在第一个和第二个问题中),并且在第二个问题的 json 响应中根本没有设置 $first_name 和 $last_name问题即使在 Dialoglow 中它们已设置并且它们包含全名,如上面我发布的 json 响应中所示。此外,Google 智能助理在两个问题中都为 $json->result->contexts[0]->name 返回 actions_capability_screen_output,而在 Dialogflow 中 $json->result->contexts[0]->name 显然是 context(上下文的名称)。
因此,谷歌助手第二个问题中json响应的contexts分支似乎是这样的:
"contexts": [
{
"name": "actions_capability_screen_output",
"parameters": {},
"lifespan": 0
}
]
另一方面,如上所示,DIalogflow 中第二个问题中 json 响应的 contexts 分支是:
"contexts": [
{
"name": "context",
"parameters": {
"given-name.original": "John",
"last-name.original": "Smith",
"given-name": "John",
"last-name": "Smith"
},
"lifespan": 9
}
]
为什么 Google 助理无法识别 context 并且它不处理 Dialoglow 显示的相同 json 响应?
如何在 Dialogflow 中检查来自 Google 助理的整个 json 响应?
【问题讨论】:
-
这看起来很奇怪,我目前无法在仅使用该 JSON 的测试中复制它。您能否更新您的问题以包含来自 Assistant 模拟器的“调试”选项卡的结果?您能否澄清一下您使用的是 Dialogflow V1 还是 V2 协议(如果您不确定,请附上设置屏幕的屏幕截图,屏蔽敏感信息)。
-
如果可能的话,您能否也包括生成该回复的 PHP 源代码?
-
感谢您的回复。我愿意提供所有这些细节,但我认为我的帖子会变得非常长。我认为最好发布一个与我基于此问题创建的更复杂的聊天机器人相关的新问题。
-
最好的事情是拥有简单且可重现的东西。如果我无法使用 JSON 重现它,则表明存在其他稍有不同的错误。在最简单的事情中发现错误应该可以帮助您在更复杂的事情中解决它。
-
所以编辑了我的帖子,我提供了您要求的所有信息。 (我试图隐藏任何敏感信息,但如果我遗漏了什么,那么您可以编辑我的帖子以更正此问题)
标签: php json actions-on-google dialogflow-es api-ai