[英]How to get Session Entities to work as part of Dialogflow detect intent
我有一个实体,应该在每个会话的基础上更新用户特定的信息。 这在我使用Dialogflow v1时起作用,我认为它与v2一起使用,但我现在遇到了很多问题。
我相信我正在设置会话实体信息,但对于使用它的Intent,它仅在使用Developer Entity的值时才匹配。
如何让它使用会话实体? 我在更新时做错了什么? 我使用错误的会话ID吗? 有没有办法可以更好地验证或测试我使用的是正确的ID还是我正在更新实体? 这只是一个错误吗?
一切的文档如下。
该项目配置为使用v2并允许测试版功能,虽然我已经尝试过没有测试版功能。
只有三个意图。 A Fallback用于捕获失败的意图,获取欢迎事件的Welcome Intent,以及应该捕获应与“code”实体匹配的条目代码的“entry”意图。 所有这些都使用webhook来实现。
如“条目”Intent所示,它使用“代码”实体,它是系统中唯一的开发者实体
代码将大部分Dialogflow特定工作放在一个单独的模块中,该模块使用npm中的“dialogflow”模块来设置会话实体。 (注意这与用于处理履行的dialogflow-fulfillment模块不同。我使用多重库来实现,但这无关紧要。)(它还使用firebase函数来运行,但我不知道我认为其中任何一个都是相关的。)
从package.json:
"dependencies": {
"dialogflow": "^0.9.0",
"firebase-admin": "~7.0.0",
"firebase-functions": "^2.2.0",
"multivocal": "^0.11.1"
},
这是作为dialogflow
导入的,指定要使用的API版本:
const dialogflow = require('dialogflow').v2beta1;
我在下面显示的函数调用envToConfig(env)
,它接受环境(只存储相关信息的多重概念,包括Dialogflow parent
和证书信息),并返回需要传递给dialogflow.SessionEntityTypesClient( config )
。 鉴于在进一步调用中没有抛出任何错误,它似乎正常工作。
makeEntityType( name, entityMap )
函数获取要用于SessionEntityType中的entities
的值的映射,并返回将用于构建完整SessionEntityType的对象。 此处提供的name
是显示名称。
function makeEntityType( name, entityMap ){
let ret = {
displayName: name,
entities: []
};
Object.keys( entityMap ).map( key => {
let val = entityMap[key];
let entity = {
value: key,
synonyms: [key, ...val]
};
ret.entities.push( entity );
});
return ret;
}
exports.makeEntityType = makeEntityType;
将此结果与多重环境一起传递给setSessionEntity( env, entityType )
,其中包含我们在会话中使用的一些信息。 它确保在entityType
正确设置name
和entityOverrideMode
,然后尝试创建它。 我也尝试过使用PATCH,它的行为方式相同。 它还会进行大量的日志记录,稍后我会在它运行时证明它确实有效。
function setSessionEntity( env, entityType ){
const config = envToConfig( env );
const client = new dialogflow.SessionEntityTypesClient( config );
let parent = env.dialogflow.parent;
if( entityType.displayName && !entityType.name ){
entityType.name = `${parent}/entityTypes/${entityType.displayName}`;
}
if( !entityType.entityOverrideMode ){
entityType.entityOverrideMode = 'ENTITY_OVERRIDE_MODE_OVERRIDE';
}
console.log('setSessionEntity parent',parent);
const request = {
parent: parent,
sessionEntityType: entityType
};
console.log('setSessionEntity request',JSON.stringify(request,null,1));
return client.createSessionEntityType( request )
.then( create => {
console.log('setSessionEntity created',JSON.stringify(create,null,1));
return Promise.resolve( env );
})
.catch( err => {
console.error('setSessionEntity problem creating',err);
return Promise.resolve( env );
})
}
exports.setSessionEntity = setSessionEntity;
对于调试,我还有一个列出会话实体的函数:
function listSessionEntities( env ){
let parent = env.dialogflow && env.dialogflow.parent;
console.log('listSessionEntities parent', parent);
if( !parent ){
return Promise.resolve( env );
}
const config = envToConfig( env );
const client = new dialogflow.SessionEntityTypesClient( config );
const request = {
parent: parent
};
return client.listSessionEntityTypes(request)
.then( result => {
console.log('listSessionEntities', JSON.stringify(result,null,1));
})
.catch( err => {
console.log('listSessionEntities err', err);
})
.then( () => Promise.resolve( env ) );
}
exports.listSessionEntities = listSessionEntities;
调用它的代码将其作为Dialogflow
:
const Dialogflow = require('./dialogflow');
作为所有webhook调用的一部分, listSessionEntities()
函数在任何特定处理程序之前被调用:
function debugSessionEntities( env ){
return Dialogflow.listSessionEntities( env );
}
触发欢迎意图时,它会将“代码”会话实体设置为具有两个新类型,这些新类型应覆盖“代码”开发人员实体中定义的类型:
function handleWelcome( env ){
const entityType = Dialogflow.makeEntityType('code',{
'alpha': [],
'bravo': []
});
return Dialogflow.setSessionEntity( env, entityType )
.then( env => Multivocal.handleDefault( env ) );
}
当我通过模拟器运行它时,它没有选择已设置的会话实体类型,但仍然响应开发人员实体类型。 (使用真实设备的工作方式相同。)
在模拟器中,这是它在Welcome Intent的Request选项卡中报告的内容:
{
"responseId": "55a9eb06-ce05-48f9-8a56-b993fa512aee",
"queryResult": {
"queryText": "GOOGLE_ASSISTANT_WELCOME",
"action": "multivocal.welcome",
"parameters": {},
"allRequiredParamsPresent": true,
"fulfillmentText": "Hello! How can I help you?",
"fulfillmentMessages": [
{
"text": {
"text": [
"Greetings! How can I assist?"
]
}
}
],
"outputContexts": [
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/google_assistant_welcome"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_screen_output"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_audio_output"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_account_linking"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/google_assistant_input_type_keyboard"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_media_response_audio"
},
{
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/contexts/actions_capability_web_browser"
}
],
"intent": {
"name": "projects/session-test-XXXXX/agent/intents/ca79c951-4d75-4b2b-acd4-7dac2f81856e",
"displayName": "welcome"
},
"intentDetectionConfidence": 1,
"languageCode": "en-us"
},
"originalDetectIntentRequest": {
"source": "google",
"version": "2",
"payload": {
"isInSandbox": true,
"surface": {
"capabilities": [
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.ACCOUNT_LINKING"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.WEB_BROWSER"
}
]
},
"requestType": "SIMULATOR",
"inputs": [
{
"rawInputs": [
{
"query": "Talk to my test app",
"inputType": "KEYBOARD"
}
],
"intent": "actions.intent.MAIN"
}
],
"user": {
"userStorage": "{\"UserId\":\"ABwppHHd40lIZ1o0bRERAKlHNtNcS2qFtz7NbRQnb31AQDFuV41VPFQivXwwpQGtv_5SlsZNp0N3kxalIIXXXXXX\",\"NumVisits\":1}",
"lastSeen": "2019-05-18T19:12:38Z",
"locale": "en-US",
"userId": "ABwppHHd40lIZ1o0bRERAKlHNtNcS2qFtz7NbRQnb31AQDFuV41VPFQivXwwpQGtv_5SlsZNp0N3kxalIIXXXXXX"
},
"conversation": {
"conversationId": "ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX",
"type": "NEW"
},
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
}
]
}
]
}
},
"session": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX"
}
最值得注意的是session
属性设置在底部。 代码在构建时使用它作为parent
值和session
值
其他两个Intent的请求对象类似,并且所有session
值都相同。 没有任何响应对象以任何方式显着。
当触发Welcome Intent时,对listSessionEntities()
的调用listSessionEntities()
,表明还没有:
info: listSessionEntities parent projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX
info: listSessionEntities [
[],
null,
null
]
但是, parent
似乎具有session
的正确值。
当Welcome Intent的处理程序进入并创建会话实体时,事情似乎正常:
info: setSessionEntity request {
"parent": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX",
"sessionEntityType": {
"displayName": "code",
"entities": [
{
"value": "alpha",
"synonyms": [
"alpha"
]
},
{
"value": "bravo",
"synonyms": [
"bravo"
]
}
],
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/entityTypes/code",
"entityOverrideMode": "ENTITY_OVERRIDE_MODE_OVERRIDE"
}
}
info: setSessionEntity created [
{
"entities": [
{
"synonyms": [
"alpha"
],
"value": "alpha"
},
{
"synonyms": [
"bravo"
],
"value": "bravo"
}
],
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/entityTypes/code",
"entityOverrideMode": "ENTITY_OVERRIDE_MODE_OVERRIDE"
},
null,
null
]
parent
看起来与session
相同, name
似乎遵循正确的格式,包括具有“/ entityTypes /”后跟显示名称的附加部分。
当我尝试用代码“alpha”调用它时,它应该触发“入口”Intent,而是触发Fallback Intent。 对listSessionEntities()
的调用似乎显示了具有我们期望的实体类型的“代码”实体,即使是“alpha”也没有匹配。
info: listSessionEntities parent projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX
info: listSessionEntities [
[
{
"entities": [
{
"synonyms": [
"alpha"
],
"value": "alpha"
},
{
"synonyms": [
"bravo"
],
"value": "bravo"
}
],
"name": "projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX/entityTypes/code",
"entityOverrideMode": "ENTITY_OVERRIDE_MODE_OVERRIDE"
}
],
null,
null
]
一切看起来都是正确的。 当我再次尝试使用“zulu”时,它对listSessionEntites()
的调用显示相同的内容,但这次它与“条目”Intent匹配,因为“zulu”是“代码”的实体类型之一,即定义为开发人员实体。
这是我被困的地方。 一切看起来都很正确。 看起来应该为此会话正确设置会话实体。 它看起来应该使用这些值。 但它似乎永远不会这样做。
到底是怎么回事? 非常感谢所有的帮助。 (你有没有读到问题的结尾?如果是的话 - 谢谢!我知道它很长,但希望尽可能完整。)
这似乎是一个错误 - 我得到了其他开发人员的反馈,他们看到了同样的问题,有时是在以前工作的代码上。
已在https://issuetracker.google.com/issues/133166381上打开错误以跟踪问题。 明星表示您有类似的问题并跟踪进度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.