【问题标题】:why does DialogFlow `createContext` API require a session?为什么 DialogFlow `createContext` API 需要会话?
【发布时间】:2019-10-10 22:53:20
【问题描述】:

我正在通过 API 而不是 GUI 管理对话流机器人的内容。

我可以创建基本的意图和实体,但在为意图分配上下文输入/输出时遇到问题。

基本上在意图中使用上下文的“名称”似乎没有任何效果。

我是否必须使用上下文的路径或 ID?

然后我尝试创建一些上下文,看看那里是否有更多数据,例如要使用的路径或名称。但是,这会带来不同的问题:

创建上下文似乎需要一个会话。 https://github.com/googleapis/nodejs-dialogflow/blob/master/samples/resource.js#L309

async function createContext( projectId, sessionId, contextId, lifespanCount)

我只想将 outputContext 分配给一个意图,所以这是我通常可以通过 GUI 进行的创作时间设置,而不是用户(会话)的运行时上下文。

所以,我不明白为什么需要会话 - 肯定是用于临时用户会话,例如,如果您为该用户设置上下文,则该会话。

任何帮助或 nodeJS 示例代码将不胜感激。

创建意图 https://cloud.google.com/dialogflow/docs/reference/rest/v2/projects.agent.intents/create#query-parameters

接受 inputContextNAMES

  "inputContextNames": [
    string
  ],

但 outputContexts 是 对象

  "outputContexts": [
    {
      object (Context)
    }
  ],

上下文对象似乎与动态会话相关,它们位于 API 文档树中并需要会话。

所以,有点困惑为什么输入/输出上下文会被区别对待。

用于创建上下文的 API 文档,但这仅在会话中 https://cloud.google.com/dialogflow/docs/reference/rest/v2/projects.agent.sessions.contexts/create

【问题讨论】:

    标签: api dialogflow-es


    【解决方案1】:

    长话短说:你可能想要这个:https://cloud.google.com/dialogflow/docs/reference/rest/v2/projects.agent.intents

    让我们清理甲板并解开这个结,因为有一些事情正在发生。

    首先,让我们忘记上下文——输入和输出上下文——而只考虑披萨。

    假设您构建了一个披萨店机器人,它只允许您订购一种披萨和一种饮料,并让您可以选择通过现金或信用卡付款。

    没有任何问题的对话流程如下所示:

    User: I want a pizza
    
    Agent: Ok 1 pizza $5. Do you want a drink?
    
    User: Yes
    
    Agent: Ok, 1 pizza + 1 drink is $10. Do you want to pay with credit card?
    
    Agent: If you say no you can pay with cash
    
    User: No
    
    Agent: Ok $10 cash (+ bot-tip of course)
    

    您可以想象其他对话分支和选项,但要注意的主要事项是用户可以在多个点上表示“是”或“否”。由于上下文+会话,DialogFlow“知道”用户指的是什么。

    例如。没有任何上下文

    User: No.
    
    Agent: What are you talking about?
    
    Agent: Do you mean no drink? Do you mean no credit card? Do you mean no pizza?
    

    3 个想法:

    1) 会话:一个随机字符串(不超过 36 个字符),附加到会话的每个“轮次”,例如:1234567

    2) 上下文:DialogFlow 中的一个想法,它做了两件事:(1) 在对话的“轮次”之间存储数据;(2) 如果多个意图有资格被调用,则影响哪个意图得到匹配。前任。 {name:'context name', parameters: {}, languageCode: 'en-US'}

    3) 上下文路径/会话路径?这些只是 DialogFlow API 标识符,可将您的请求限定在与您的代理关联的任何项目。如果您正在使用 DialogFlow API 进行交互,您可能会使用这些

    例如。会话路径

    session id is 12456789
    project id is gcp-abcbots-xxx-545
    
    sessionPath would be:
    projects/gcp-abcbots-xxx-545/agent/sessions/123456789
    
    

    例如。上下文路径:会话路径+上下文

    session id is 12456789
    project id is gcp-abcbots-xxx-545
    Context is : {name: 'context_1', parameters: {}, languageCode: 'en_US'}
    ContextName is : context_1
    
    
    contextPath is:
    projects/gcp-abcbots-xxx-545/agent/sessions/123456789/contexts/context_1
    
    ContextPath = sessionPath/contexts/context_1
    

    上下文更广泛地涉及在用户和会话系统之间的一系列乒乓交互期间保持“状态”的想法。 (就我们而言,“对话”最终对我们来说只是在对话的每个“转折点”进行一系列 API 调用。)

    示例如果你说“明尼阿波利斯的天气怎么样?”,你会得到答案,然后再问“下周那里的天气怎么样?”你应该合理地期望代理应该保持你所说的明尼阿波利斯的上下文。

    您的问题:为什么 DialogFlow createContext API 需要会话?

    使用 createContext,您真正要做的是使当前“对话”的上下文处于活动状态(这实际上意味着新上下文会附加到任何“会话”。)这就是您“需要”会话或 sessionPath 的原因,因为您正在做的是将上下文附加到会话。

    如果您正在谈论将输入/输出上下文附加到不需要会话的意图。您可以通过 API 或 Web 控制台执行此操作

    输出上下文/输入上下文

    DialogFlow 中的输入和输出上下文都是关于影响将匹配哪些意图。但也可以这样想:输入/输出上下文实际上是关于在正确的时间将上下文附加到会话。

    例如,如果 DialogFlow 中的意图具有输出上下文——只要它“完成”,该输出上下文就会变为“活动”或与当前用户的会话相关联。任何具有匹配 input 上下文且在会话中处于活动状态的意图更有可能被匹配。

    tl;dr:您可以创建输入/输出上下文并将它们附加到意图——这不需要会话,您只需要一个意图。如果你想“创建”一个在对话中处于活动状态的上下文,你需要一个会话,或者你需要匹配一个具有输出上下文的意图,然后该上下文在会话中变为“活动”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 2011-10-06
      • 2013-11-29
      • 2017-10-19
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多