如何让会话实体作为 Dialogflow 检测意图的一部分

2024-01-30

我有一个实体,应该使用特定于用户的信息在每个会话的基础上进行更新。当我使用 Dialogflow v1 时,这有效,我认为它也适用于 v2,但我现在遇到了严重的问题。

我相信我正确设置了会话实体信息,但对于使用它的意图,它仅在使用开发人员实体中的值时才匹配。

我怎样才能让它使用会话实体?是我更新的时候做错了什么吗?我是否使用了错误的会话 ID?有没有办法可以更好地验证或测试我是否使用了正确的 ID 或者是否正确更新了实体?这只是一个错误吗?

所有内容的文档如下。

该项目配置为使用 v2 并允许使用 beta 功能,尽管我也尝试过在没有 beta 功能的情况下进行此操作。

There are only three Intents. A Fallback Intent to capture failures, a Welcome Intent that gets the welcome event, and the "entry" intent that is supposed to capture the entry code which should match the "code" Entity. All of them use a webhook for fulfillment. intent list

The Fallback Intent fallback intent

The Welcome Intent welcome intent

The "entry" Intent entry intent

如“entry”Intent所示,它使用“code”Entity,这是系统中唯一的Developer Entity

该代码将大部分 Dialogflow 特定工作放在一个单独的模块中,该模块使用来自 npm 的“dialogflow”模块 https://www.npmjs.com/package/dialogflow设置会话实体。 (请注意,这与用于处理实现的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)它采用环境(一个多义概念,仅存储相关信息,包括 Dialogflowparent和证书信息)并返回需要传递的配置dialogflow.SessionEntityTypesClient( config )。鉴于在进一步的调用中没有抛出任何错误,它似乎工作正常。

The makeEntityType( name, entityMap )函数需要一个值的映射来用于entities in a 会话实体类型 https://cloud.google.com/dialogflow-enterprise/docs/reference/rest/v2beta1/projects.agent.environments.users.sessions.entityTypes#resource-sessionentitytype并返回一个将用于构建完整 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 )以及多声部环境,其中包含我们在会话中使用的一些信息。它确保name and entityOverrideMode已正确设置在entityType然后尝试创建它。我也尝试过使用 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 ) );
}

当我通过模拟器运行它时,它不会获取设置的会话实体类型,但仍然响应开发人员实体类型。 (使用真实设备的工作方式相同。)

在模拟器中,这是它在欢迎意图的“请求”选项卡中报告的内容:

{
  "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 and session构建时的值

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

当欢迎意图被触发时,调用listSessionEntities()毫不奇怪,显示还没有:

info: listSessionEntities parent projects/session-test-XXXXX/agent/sessions/ABwppHFGTpcFtHOOo6ehQfKys9AnH14V5-RhzrNKsea6y6L5zgv4eN-j3IesfuqSsKMc7qRt1CAOhkUYA9XXXXXX
info: listSessionEntities [
 [],
 null,
 null
]

The 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
]

The parent似乎与session,以及name似乎遵循正确的格式,包括具有“/entityTypes/”后跟显示名称的附加部分。

当我尝试使用代码“alpha”调用它时,它应该触发“entry”意图,但它会触发后备意图。致电给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(),但这一次它与“entry”意图匹配,因为“zulu”是定义为开发者实体的“code”的实体类型之一。

这就是我被困住的地方。一切looks正确的。看起来会话实体应该设置正确本次会议。看起来应该使用这些值。但它似乎从来没有这样做过。

到底是怎么回事?所有的帮助都会是greatly赞赏。 (您是否阅读到问题的结尾?如果是的话 - 谢谢!我知道它很长,但希望尽可能完整。)


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

已在以下位置打开一个错误:https://issuetracker.google.com/issues/133166381 https://issuetracker.google.com/issues/133166381跟踪问题。给它加星标以表明您有类似的问题并跟踪进度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让会话实体作为 Dialogflow 检测意图的一部分 的相关文章

随机推荐