You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的输出上下文,当用户按返回键时会话生命周期被默认结束,后续选项触发的请求没有匹配的上下文就会识别失败。调整如下:

  1. 从入参中获取当前所有活跃的上下文,返回响应时原样带回,或者给全局会话上下文设置更长的有效期(比如10轮交互、5分钟有效期)
  2. 处理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意图绑定的上下文已经过期,自然无法触发。调整如下:

  1. 把需要长期可触发的意图从follow-up结构中独立出来,不要绑定默认的短生命周期上下文,改为绑定自定义的global_session_ctx全局上下文
  2. 所有webhook返回的响应都统一带上global_session_ctx上下文,保证会话全程有效
  3. 在Dialogflow控制台调整对应意图的上下文有效期参数,关闭默认的自动过期逻辑即可。

内容的提问来源于stack exchange,提问作者aravinth C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:45:01