gpt4 book ai didi

node.js - 如何让 session 实体作为Dialogflow的一部分检测意图

转载 作者:搜寻专家 更新时间:2023-10-31 23:36:23 24 4
gpt4 key购买 nike

我有一个实体,应该使用用户特定的信息在每个 session 的基础上进行更新。当我使用Dialogflow v1时,这已经奏效了,我以为它可以与v2一起工作,但是现在我遇到了很多问题。

我相信我正确设置了 session 实体信息,但是对于使用它的Intent,它仅在使用开发者实体中的值时才匹配。

如何获得使用 session 实体的权限?更新时我做错什么了吗?我使用了错误的 session ID吗?有什么方法可以更好地验证或测试我使用的是正确的ID还是正确更新的Entity?这只是一个错误吗?

一切的文档如下。

该项目配置为使用v2并允许使用beta功能,尽管我也尝试过不使用beta功能的情况。

configuration

只有三个Intent。捕获失败的后备意图,获取欢迎事件的欢迎意图以及应该捕获应该与“代码”实体匹配的入口代码的“进入”意图。他们所有人都使用webhook来实现。
intent list

后备意图
fallback intent

欢迎意向
welcome intent

“进入”意图
entry intent

如“入口”意图中所示,它使用“代码”实体,这是系统中唯一的开发者实体

code entity

该代码在单独的模块中具有大多数Dialogflow特定的工作,该模块使用"dialogflow" module from npm设置 session 实体。 (请注意,这与用于处理实现的d​​ialogflow-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 )函数获取用于 SessionEntityTypeentities的值的映射,并返回将用于构建完整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 ),其中包含我们在 session 中使用的一些信息。确保在 name中正确设置了 entityOverrideModeentityType,然后尝试创建它。我也尝试过使用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;

为了进行调试,我还有一个列出 session 实体的函数:
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 );
}

触发“欢迎意图”时,它将“代码” session 实体设置为具有两种新类型,这些新类型应覆盖在“代码”开发者实体中定义的类型:
function handleWelcome( env ){
const entityType = Dialogflow.makeEntityType('code',{
'alpha': [],
'bravo': []
});
return Dialogflow.setSessionEntity( env, entityType )
.then( env => Multivocal.handleDefault( env ) );
}

当我通过模拟器运行此命令时,它不会选择设置的 session 实体类型,但仍会响应开发者实体类型。 (使用真实设备的工作方式相同。)

simulator conversation

在模拟器中,这是在“欢迎意图”的“请求”选项卡中报告的内容:
{
"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属性。在构建广告代码时,代码将其用作 parentsession

其他两个Intent的请求对象相似,并且 session的值都相同。没有任何响应对象是值得注意的。

触发“欢迎意图”后,毫不奇怪,对 listSessionEntities()的调用表明还没有任何内容:
info: listSessionEntities parent projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX
info: listSessionEntities [
[],
null,
null
]

但是, parent似乎具有正确的值。

当用于“欢迎意图”的处理程序去创建 session 实体时,事情似乎可以正常进行:
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
]
session看起来与 parent相同,并且 session看起来遵循正确的格式,包括带有“/entityTypes/”和显示名称的附加部分。

当我尝试使用代码“alpha”来调用它时,该代码应触发“entry”意图,但它会触发“后备意图”。调用 name似乎显示了具有我们期望的实体类型的“代码”实体,即使没有与“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”尝试时,它显示了对 listSessionEntities()的调用相同的内容,但是这次它与“entry” Intent匹配,因为“zulu”是定义为“code”的实体类型之一开发者实体。

这就是我被困住的地方。一切看起来都正确。看起来应该为此 session 正确设置 session 实体 。看起来应该使用这些值。但这似乎从未如此。

到底是怎么回事?所有帮助将不胜感激。 (您甚至没有读到问题的末尾?如果是的话,谢谢!我知道这很长,但是希望尽可能完整。)

最佳答案

这似乎是一个错误-我从其他开发人员那里得到了反馈,他们也遇到了同样的问题,有时是在以前工作的代码上。

已在https://issuetracker.google.com/issues/133166381中打开了一个错误以跟踪该问题。给它加注星号,表明您有类似的问题并跟踪进度。

关于node.js - 如何让 session 实体作为Dialogflow的一部分检测意图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56204273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com