Dialogflow 训练短语中未识别的会话实体

Session entities not recognized in Dialogflow training phrases

我已经设置了一个 Google Actions 会话项目,我的服务器在 PHP.

中提供了对话流和 webhook 意图

在新的 dialogflow 对话启动时,例如在回复欢迎意图之前,php 代码正在将一些会话实体推送到对话流引擎。

直到两周前,dialogflow 引擎才正确识别会话实体词,当时它突然停止工作(我没有更改代码中的任何内容),现在它仍然无法工作。

会话实体的创建没有错误(我添加了代码来查询 dialogflow api 并在创建后列出会话实体,google 正在回复我发送的所有单词)。

但是Intent不识别也不填写实体参数

这是我用来推送实体的代码(使用 google dialogflow v2 库):

$names = [....array of strings....];
$parent = 'projects/inim-prova/agent/sessions/' . $sessionId;
$client = new SessionEntityTypesClient(['credentials' => $keyfile]]);
$entities = array_map(function($item) { return new Entity(['value' => $item, 'synonyms' => [$item]]); }, array_unique($names));
$entityType = new SessionEntityType([
    'name' => $parent . "/entityTypes/$displayName",
    'entity_override_mode' => EntityOverrideMode::ENTITY_OVERRIDE_MODE_SUPPLEMENT,
    'entities' => $entities
]);
$client->createSessionEntityType($parent, $entityType);

此代码运行时未抛出任何异常。

几行之后,我正在查询服务器以查看是否一切正常:

$req = $client->listSessionEntityTypes($this->webhookRequest->getSession());
foreach ($req as $element) {
    Logger::log(Logger::DEV, __METHOD__, "SessionEntityType: " . $element->getName());
    $entities = $element->getEntities();
    foreach ($entities as $entity) {
        $synonyms = [];
        foreach ($entity->getSynonyms() as $synonym) $synonyms[] = $synonym;
        Logger::log(Logger::DEV, __METHOD__, ">> " . $entity->getValue() . ": " . implode(', ', $synonyms));
    }
}

这是调试日志的摘录:

SessionEntityType: projects/inim-prova/agent/sessions/ABwppHHhgwxi5OGznpUtUq2D7BQrOKWB5Y5UYr20HRKI14iASKugPw2dL2VKMwfvZ193Mq_DUb2emQ/entityTypes/NomiLuoghiUscite
>> sala: sala
>> cucina: cucina
>> giardino: giardino
SessionEntityType: projects/inim-prova/agent/sessions/ABwppHHhgwxi5OGznpUtUq2D7BQrOKWB5Y5UYr20HRKI14iASKugPw2dL2VKMwfvZ193Mq_DUb2emQ/entityTypes/NomiUscite
>> luci: luci
>> irrigazione: irrigazione
>> cappa: cappa

因此所有实体似乎都在正确的位置。

这是意图训练短语:

(请注意 ArticoliDeterminativiPreposizioni 是我忽略的静态实体)。

这些是当我说 Accendi le luci in cucina:

时我在 webhook 请求中得到的参数
'parameters' => array (
    'NomiUscite.original' => '',
    'Preposizioni.original' => '',
    'NomiLuoghiUscite' => '',
    'NomiUscite' => '',
    'Preposizioni' => '',
    'ArticoliDeterminativi.original' => 'le',
    'NomiLuoghiUscite.original' => '',
    'ArticoliDeterminativi' => 'il',
)

如您所见,NomiUsciteNomiLuoghiUscite 是空的。我希望它们是 lucicucina.

我真是一头雾水

您应该在会话实体中添加单词 'uscita' 和 'luogo'。如果您注释不属于实体的单词,我可以知道参数如何为空。

您也可以尝试添加 'Accendi le luci in cucina' 作为训练短语。

看起来确实是一个 dialogflow 错误,而不是我的代码中的缺陷。 几周后,Google 的支持人员回复我说问题已经解决。

我已经 运行 再次测试,完全没有修改代码,现在它可以工作了。