如何使用Java设置Watson Assistant的上下文变量的值?

时间:2018-12-20 11:41:52

标签: java ibm-watson watson-conversation

是否可以通过Java设置上下文变量的值。我已经修改了节点json并在要从本地数据库设置数据的result属性中的该操作中添加了一个操作。所以我正在用Java代码获取操作,并尝试设置操作对象的result属性的值,以下是我正在尝试但无法正常工作的代码。有人可以为此建议一种更好的方法。

if(response.getActions()!=null) {
            System.out.println("actions : "+response.getActions());
            for (int i = 0; i < response.getActions().size(); i++) {
                System.out.println(" i : "+response.getActions().get(i).getName());
                if(response.getActions().get(i).getName()=="Apply_For_Loan") {
                    response.getActions().get(i).setResultVariable("123");
                }
            }
        }

在下面的上下文中设置result_variable的值是我的代码。

if(response.getActions().get(i).getName().equals("Apply_For_Loan")) {
                        System.out.println("in action");
                        Assistant service = new Assistant("2018-12-12");
                        service.setUsernameAndPassword(userId, password);
                        service.setEndPoint(endPoint);
                        String result=response.getActions().get(i).getResultVariable();
                        Context context = response.getContext();
                        context.put(result, "123");
                        MessageOptions msg=new MessageOptions.Builder(watsonId)
                              .input(new InputData.Builder("Apply For Loan").build())
                              .context(context)
                              .build();
                        response=service.message(msg).execute();
                        System.out.println("msg : "+response);
                    }

下面是我重新执行助理呼叫后得到的响应。

{
  "output": {
    "generic": [
      {
        "response_type": "text",
        "text": "Hello RSR, you loan application of 5420 is created. Please note the Loan Number for future use "
      }
    ],
    "text": [
      "Hello RSR, you loan application of 5420 is created. Please note the Loan Number for future use "
    ],
    "nodes_visited": [
      "node_1_1544613102320",
      "node_1_1544613102320"
    ],
    "log_messages": []
  },
  "input": {
    "text": "Apply For Loan"
  },
  "intents": [
    {
      "intent": "ApplyForLoan",
      "confidence": 1.0
    }
  ],
  "entities": [],
  "context": {
    "number": 9.971070056E9,
    "$Loan_Number": "123",
    "system": {
      "initialized": true,
      "dialog_stack": [
        {
          "dialog_node": "node_1_1544613102320"
        }
      ],
      "dialog_turn_counter": 3.0,
      "dialog_request_counter": 3.0,
      "_node_output_map": {
        "node_1_1544613102320": {
          "0": [
            0.0
          ]
        }
      },
      "branch_exited": true,
      "branch_exited_reason": "completed"
    },
    "Mail_Id": "Email_Id",
    "conversation_id": "b59c7a02-2cc6-4149-ae29-602796ab22e1",
    "person": "RSR",
    "rupees": 5420.0
  },
  "actions": [
    {
      "name": "Apply_For_Loan",
      "type": "client",
      "parameters": {
        "pername": "RSR",
        "loanamount": 5420.0
      },
      "result_variable": "$Loan_Number"
    }
  ]
}

在以上响应中,$ Loan_Number是我已从java代码更新的结果变量,并且我在输出文本中使用的相同result_variable返回$ Loan_Number,但在输出文本中它仍为空白,并且在操作中也是如此还是空白?

1 个答案:

答案 0 :(得分:0)

您的问题的简单答案是“否”,您无法使用setResultVariable在JSON模型中进行任何设置。它应该像这样工作:

1)在您的Dialognode上定义一个操作 enter image description here

result_variable定义了<result_variable_name>,例如该操作的结果应存储在对话上下文中。如果执行某些服务器端操作,则会从指定的上下文位置读取结果。在此示例中,位置为context.result_of_actioncontext可以省略。更多详细信息,请参见here

2)在Java Client中处理操作

DialogNodeAction action = response.getActions().get(0);
final String result_variable = action.getResultVariable();

result_variable就像一个。您可以从数据库中获取值并将其添加到上下文中:

Context context = response.getContext();
context.put(result_variable, "value from DB");
new MessageOptions.Builder("Your ID")
      .input(new InputData.Builder("Your response").build())
      .context(context) // setting context
      .build();

最后,Watson Assistant对话框(或其他一些应用程序)可以从客户端获取结果:

"context": {
   "result_of_action": "value from DB",

使用Gson从JSON解析使用Java API读取的对象,并且在构建新的API调用时需要将其重新解析回JSON。

问题更新后编辑

在您的示例中:

 "actions": [
{
  "name": "Apply_For_Loan",
  "type": "client",
  "parameters": {
    "pername": "RSR",
    "loanamount": 5420.0
  },
  "result_variable": "$Loan_Number"
}

result_variable告诉您应用中的其他模块在哪里可以找到操作结果。因此,$Loan_Number不应是会话上下文中的值的,而应是(一种方法合同)。
假设您将值设置为 context.my_result ,那么Watson Assistant应当能够在下一个对话框节点“ context.my_result”下从DB访问“ 123”。