Dialogflow 的实现编辑器中的可变生命周期?

Variable lifetime in Dialogflow's fulfillment editor?

我正在帮助创建一个聊天机器人,它可以从 google sheet 中提取房地产数据,并将该信息显示给用户。用户输入一个地址,然后将提取的信息分配给一个 houseData 变量,该变量已通过 http 请求在函数外部声明。 houseData 对象具有卧室、浴室、monthlyPayment、地址等键,然后在 agent.add 有效负载中引用这些键,以在聊天小部件中向用户显示键的值。这都映射到一个意图。

稍后,我尝试在映射到不同意图的函数中访问 houseData 对象的 monthlyPayment,以查看用户报告的收入与房屋付款的比较情况。 houseData 变量未定义,即使在 firebase 中我可以看到信息是在第一个意图期间从 console.log 中的 google sheet 接收到的。

特定函数映射到的意图完成后,是否会在实现编辑器中重置变量值?如何在编辑器中存储可在整个对话流中访问的持久性信息?这是我应该设置新上下文的情况吗?

谢谢。

编辑:我添加了一个快速的代码模型来帮助可视化问题:

let houseData;

function sendHouseData(agent) {
  let address = userInput
  return getHouseData(address).then(agent.add(new Payload(
    `Your house has ${houseData.bedrooms} bedrooms and ${houseData.bathrooms} bathrooms.`
  ))).catch(err);
}

function getHouseData(address) {
  https.get(apiURL, (res) => {
    res.on('end', () => {
      houseData = parsedJSONData
    })
  })
}

// ------- LATER ------ //

let userData = {
  income: '',
  qualified: true
}

function qualify(agent) {
  // user self reports their monthly income thru some quick reply options
  if (houseData.monthlyPayment / userData.income < 0.39) { // houseData is undefined at this point
    userData.qualified = false
  }
}

intentMap.set(enterAddress, sendHouseData);
intentMap.set(qualify, qualify)

全局变量可能会在您的 Dialogflow 请求中得到维护,但不能保证。来自云函数提示与技巧:

There is no guarantee that the state of a Cloud Function will be preserved for future invocations. However, Cloud Functions often recycles the execution environment of a previous invocation. If you declare a variable in global scope, its value can be reused in subsequent invocations without having to be recomputed.

参考:https://cloud.google.com/functions/docs/bestpractices/tips#use_global_variables_to_reuse_objects_in_future_invocations

通常(出于性能原因缓存数据)您会将所有数据存储在 Firestore/RTDB 中,如果 houseData 未定义,则将其从数据库中拉出,否则您可以使用 houseData 直接获取缓存副本。在这种情况下,尽管您可能想记录它的年龄并相应地刷新它。

但是,如果每个 user/session 的 houseData 都不同,那么您可能被迫在每次请求时从数据库中提取它。 (请注意,如果您是 运行 Firebase 上的函数和数据库,无论如何它都会很快。)