Dialogflow CX中是否有方法实现恢复历史对话的功能?
Dialogflow CX 对话恢复功能实现方案
Dialogflow CX 与 ES 的状态管理逻辑存在核心差异:ES 依赖全局 context 管理会话状态,CX 采用 页面(Page)、会话参数(Session Parameters)、会话历史(Session History) 分层管理逻辑,可通过以下步骤复刻 ES 的对话恢复能力:
实现步骤
- 持久化会话核心状态
每次完成与 Dialogflow CX 的交互后,将三类数据关联用户唯一标识存储到业务服务端:- 本次会话使用的
session ID - 当前会话所处的流(Flow)ID、页面(Page)ID完整路径
- 所有已填充的会话参数、待触发的意图/事件标识
- 本次会话使用的
- 会话恢复时注入状态
用户返回发起新请求时,先拉取对应用户存储的历史状态,调用 CXdetectIntent接口时完成两个配置:- 复用历史存储的同个
session ID(CX 默认保留30分钟内的 session 数据,超过30分钟的会话需要手动注入全量状态) - 在请求的
queryParameters字段中传入currentPage参数(值为历史存储的页面完整路径),同时通过parameters字段传入所有历史会话参数
- 复用历史存储的同个
- 长周期会话补充配置
对间隔超过30分钟的会话,除注入上述参数外,可额外在请求中添加对应自定义事件,触发页面跳转的同时自动复用已有参数,无需用户重复输入。
实现代码参考(Node.js)
const { SessionsClient } = require('@google-cloud/dialogflow-cx'); const cxClient = new SessionsClient(); // 会话恢复&请求逻辑 async function resumeUserSession(userId, userInput) { // 从业务数据库拉取用户历史会话状态 const historyState = await fetchUserSessionState(userId); const sessionPath = cxClient.projectLocationAgentSessionPath( process.env.CX_PROJECT_ID, process.env.CX_LOCATION, process.env.CX_AGENT_ID, historyState.sessionId ); const request = { session: sessionPath, queryParams: { currentPage: historyState.currentPagePath, parameters: historyState.savedParams }, queryInput: { text: { text: userInput }, languageCode: 'zh-CN' } }; const [response] = await cxClient.detectIntent(request); // 更新存储用户最新会话状态 await updateUserSessionState(userId, { sessionId: historyState.sessionId, currentPagePath: response.queryResult.currentPage.name, savedParams: response.queryResult.parameters }); return response; }
若你的机器人涉及多流转跳逻辑,持久化状态时需要额外存储当前激活的流列表,避免会话恢复时出现流上下文丢失问题。
内容的提问来源于stack exchange,提问作者Vasuki Vardhan
相关产品推荐
相关产品推荐

