为什么DialogFlow`createContext`API需要会话?

为什么DialogFlow`createContext`API需要会话?,api,dialogflow-es,Api,Dialogflow Es,我正在通过API而不是GUI管理dialogflow机器人的内容 我可以创建基本的意图和实体,但在为意图分配输入/输出上下文时遇到了真正的困难 基本上,在意图中使用上下文的“名称”似乎没有效果 我必须使用上下文的路径或ID吗 然后我尝试创建一些上下文,看看是否有更多的数据可以使用,比如路径或名称。然而,这带来了不同的问题: 创建上下文似乎需要一个会话。 异步函数createContext( projectId、sessionId、contextId、lifespanCount) 我只想给一个意

我正在通过API而不是GUI管理dialogflow机器人的内容

我可以创建基本的意图和实体,但在为意图分配输入/输出上下文时遇到了真正的困难

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

我必须使用上下文的路径或ID吗

然后我尝试创建一些上下文,看看是否有更多的数据可以使用,比如路径或名称。然而,这带来了不同的问题:

创建上下文似乎需要一个会话。

异步函数createContext( projectId、sessionId、contextId、lifespanCount)

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

所以,我不明白为什么需要一个会话——当然这是一个临时用户会话,例如,如果你正在为那个用户设置一个上下文,那个会话

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

创造意图

获取inputContext名称

  "inputContextNames": [
    string
  ],
但是输出上下文是对象

  "outputContexts": [
    {
      object (Context)
    }
  ],
上下文对象似乎与动态会话相关,它们位于API文档树中,需要一个会话

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

API文档创建上下文,但这仅在会话中

长话短说:您可能想要:

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

首先,让我们忘掉上下文——输入和输出上下文——想想比萨饼吧

想象一下,你建立了一个比萨饼店机器人,它只允许你订购一种比萨饼和一种饮料,让你可以选择用现金或信用卡付款

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

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',参数:{},语言代码:'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,您真正做的是将上下文激活到当前“对话”(这实际上意味着新上下文将附加到任何“会话”)这就是为什么您“需要”会话或会话路径,因为您所做的是将上下文附加到会话

如果您正在谈论将输入/输出上下文附加到不需要会话的意图。您可以通过API或web控制台来实现这一点

输出上下文/输入上下文

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

例如,如果DialogFlow中的意图有一个输出上下文——只要“完成”,该输出上下文就会变为“活动”或与当前用户的会话关联。会话中活动的具有匹配输入上下文的任何意图都更有可能匹配

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