IBM沃森。如何将上下文从一个节点传递到另一个节点?

IBM Watson. How to pass context from node to node?

我正在尝试将多个 IBM Watson 请求串在一起:

请求 #1:播放音乐。

Watson 回应如下:

{
"intents": [
    {
        "intent": "turn_on",
        "confidence": 0.9498470783233643
    }
],
"entities": [
    {
        "entity": "appliance",
        "location": [
            5,
            10
        ],
        "value": "radio",
        "confidence": 1
    }
],
"input": {
    "text": "play music"
},
"output": {
    "text": [
        "What kind of music would you like to hear?"
    ],
    "nodes_visited": [
        "node_1_1510258504338",
        "node_2_1510258615227"
    ],
    "log_messages": []
},
"context": {
    "conversation_id": "79e93cac-12bb-40fa-ab69-88f56d0845e4",
    "system": {
        "dialog_stack": [
            {
                "dialog_node": "node_2_1510258615227"
            }
        ],
        "dialog_turn_counter": 1,
        "dialog_request_counter": 1,
        "_node_output_map": {
            "node_2_1510258615227": [
                0
            ]
        }
    }
 }
}

请求 #2:赞助人会输入 rock。

我的问题是我收到一条错误消息,内容如下

没有与根级别的输入匹配的对话节点。 (日志中还有 1 个警告)", "log_messages": [

我很确定我必须将上下文传递到第二个请求中,但我不确定我需要包含什么。现在我只传递 conversation_id。我需要传递上述响应中的特定内容吗?例如,我传递这个:

{
"input": {
  "text": "rock"
},
"context": {
  "conversation_id": "79e93cac-12bb-40fa-ab69-88f56d0845e4"
 }
}

您发回整个上下文对象。在这种情况下,它将是:

{
  "input": {
    "text": "rock"
  },
  "context": {
    "conversation_id": "79e93cac-12bb-40fa-ab69-88f56d0845e4",
    "system": {
      "dialog_stack": [
        {
          "dialog_node": "node_2_1510258615227"
        }
      ],
      "dialog_turn_counter": 1,
      "dialog_request_counter": 1,
      "_node_output_map": {
        "node_2_1510258615227": [
          0
        ]
      }
    }
  }
}

但是有一些 SDK 可以让您更轻松地完成这项工作。

https://github.com/watson-developer-cloud

你的节点是select类型的音乐人,它是你的'turn_on'节点[node_2_1510258615227]的子节点吗?
如果是这样,正如 Simon 在上面所演示的那样,您还需要作为 API 调用的一部分传回完整的上下文数据包。这会通知 Watson Conversation 您在对话流中的最后位置。由于对话系统是无状态的,即它不存储有关单个对话的任何状态信息,因此默认情况下它不会知道它在对话中的位置。这就是为什么您需要 return 先前响应的上下文元素,以允许 watson 知道您在对话流中的位置。
上面的错误表明 Watson 查看了您在根级别定义的对话节点列表,但找不到匹配条件。由于您的匹配条件在子节点内。