Dialogflow接入Google Assistant按返回键后上下文丢失如何解决
from pydialogflow_fulfillment import DialogflowResponse from flask import Flask, request app = Flask(__name__) @app.route('/webhook', methods = ['POST']) def user(): request_ = request.get_json(force=True) print(request_) qr = request_['queryResult'] queryText = qr['queryText'] querys = str(queryText) print("querys") print(querys) if (querys == "GOOGLE_ASSISTANT_WELCOME"): return{ "payload": { "google": { "expectUserResponse": True, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Choose a item" } } ] }, "systemIntent": { "intent": "actions.intent.OPTION", "data": { "@type": "type.googleapis.com/google.actions.v2.OptionValueSpec", "listSelect": { "title": "Hello", "items": [ { "optionInfo": { "key": "first title key" }, "description": "first description", "image": { "url": "https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png", "accessibilityText": "first alt" }, "title": "first title" }, { "optionInfo": { "key": "second" }, "description": "second description", "image": { "url": "https://lh3.googleusercontent.com/Nu3a6F80WfixUqf_ec_vgXy_c0-0r4VLJRXjVFF_X_CIilEu8B9fT35qyTEj_PEsKw", "accessibilityText": "second alt" }, "title": "second title" } ] } } } } } } elif (querys == "actions_intent_OPTION"): request_ = request.get_json(force=True) # get json data in user request qr = request_['queryResult'] print(request_) queryText = qr['queryText'] querys = str(queryText) print("querys") print(querys) dialogflow_response = DialogflowResponse("you r selecting"+querys) print("Response:\n" +dialogflow_response.get_final_response()) people = dialogflow_response.get_final_response() print(people) return people if __name__ == '__main__': app.run() # 运行输出 """ querys actions_intent_OPTION Response: {"fulfillmentText": "actions_intent_OPTION", "fulfillmentMessages": [], "source": "webhook", "outputContexts": [], "payload": {"google": {}}} """
现有问题
- 问题1:按返回键后上下文丢失
Google Assistant触发欢迎意图后展示选项列表,选中第一项得到正确响应后按返回键回到列表,再次选择第二项时,Google Assistant提示“我没听清,请再说一遍”,未执行预期操作。需要实现按返回键后仍保持会话上下文,可正常响应后续选项选择操作,即选中第二项后输出对应选中提示。 - 问题2:多轮会话无法触发历史意图
已配置follow-up intents实现多轮交互,完成4-5轮问答后,触发会话前期的第2轮对应意图时,同样会收到“我没听清,请再说一遍”的响应,需要实现会话过程中可正常触发任意历史意图。
修复方案
问题1修复:保留会话上下文
核心原因是当前返回的响应没有主动保留Dialogflow的输出上下文,当用户按返回键时会话生命周期被默认结束,后续选项触发的请求没有匹配的上下文就会识别失败。调整如下:
- 从入参中获取当前所有活跃的上下文,返回响应时原样带回,或者给全局会话上下文设置更长的有效期(比如10轮交互、5分钟有效期)
- 处理
actions_intent_OPTION请求时,不要清空输出上下文,同时把选中的选项值存入上下文,避免返回后状态丢失
示例调整代码段:
# 处理欢迎意图时新增上下文保留 if (querys == "GOOGLE_ASSISTANT_WELCOME"): # 先获取当前已有的上下文 existing_contexts = qr.get('outputContexts', []) # 新增全局会话上下文,设置20轮有效期 session_id = request_['session'].split('/')[-1] existing_contexts.append({ # 替换为你的项目ID "name": f"projects/你的项目ID/agent/sessions/{session_id}/contexts/global_session_ctx", "lifespanCount": 20 }) return { "payload": { # 原有google payload内容保持不变 }, "outputContexts": existing_contexts }
另外当前处理OPTION意图时没有获取用户实际选中的key值,直接返回了queryText也会导致逻辑异常,可从qr['parameters']['OPTION']拿到用户选中的选项key,替换现有固定返回逻辑即可。
问题2修复:调整follow-up意图的上下文生命周期
follow-up意图默认的上下文生命周期只有1轮,完成多轮交互后,早期follow-up意图绑定的上下文已经过期,自然无法触发。调整如下:
- 把需要长期可触发的意图从follow-up结构中独立出来,不要绑定默认的短生命周期上下文,改为绑定自定义的
global_session_ctx全局上下文 - 所有webhook返回的响应都统一带上
global_session_ctx上下文,保证会话全程有效 - 在Dialogflow控制台调整对应意图的上下文有效期参数,关闭默认的自动过期逻辑即可。
内容的提问来源于stack exchange,提问作者aravinth C
相关产品推荐
相关产品推荐

