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

why does DialogFlow `createContext` API require a session?

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

我可以创建基本的意图和实体,但在为意图分配上下文 in/out 时遇到了真正的麻烦。

基本上在意图中使用上下文的 "name" 似乎没有效果。

我必须使用上下文的路径或 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 是 Objects

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

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

所以,有点困惑为什么 input/output 上下文被区别对待。

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

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

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

首先,让我们忘掉上下文——输入和输出上下文——想想披萨。

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

对话流程w/o 任何问题都如下所示:

User: I want a pizza

Agent: Ok 1 pizza . Do you want a drink?

User: Yes

Agent: Ok, 1 pizza + 1 drink is . Do you want to pay with credit card?

Agent: If you say no you can pay with cash

User: No

Agent: Ok  cash (+ bot-tip of course)

您可以想象其他对话分支和选项,但要注意的主要事情是用户可以在多个点上指示 "yes" 或 "no." DialogFlow "knows" 什么用户指的是因为上下文 + 会话。

例如。没有任何上下文

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) Session: A random string (no longer than 36 characters) that gets attached to each "round" of the conversation, ex: 1234567

2) Context: An idea in DialogFlow that does two things: (1) stash data between "turns" of a conversation & (2) influence which intent gets matched if multiple intent are eligible to be invoked. ex. {name:'context name', parameters: {}, languageCode: 'en-US'}

3) contextPath/sessionPath? These are just DialogFlow API identifiers that scope your requests to whatever project your agent is associated. If you're interacting w/ the DialogFlow API you will probably be using these

例如。会话路径

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

上下文更广泛地涉及在用户和对话系统之间的一系列乒乓交互期间保持 "state" 的想法。 (就我们的目的而言,"conversation" 对我们来说只是在一天结束时在每个 "turn" 对话中进行一系列 API 调用。)

例子如果你说"what's the weather like in Minneapolis?",你得到一个答案,然后再问"what's the weather going to be like there next week?"你应该合理地期望代理应该维护你的上下文正在谈论明尼阿波利斯。

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

使用 createContext,你真正做的是使上下文对当前 "conversation" 有效(这实际上意味着新上下文附加到任何 "session.")这就是为什么你 "need" session 或 sessionPath 因为你正在做的是将上下文附加到 session。

如果您正在谈论将 input/output 上下文附加到不需要会话的意图。您可以通过 API 或网络控制台

输出Contexts/Input上下文

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

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

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