我们如何使用 java 设置 watson 助手的上下文变量的值?

How can we set value of context variable of watson assistant using java?

是否可以从 java 设置上下文变量的值。我修改了节点 json 并在结果中的该操作中添加了一个操作 属性 我想从我的本地数据库设置数据。所以我在 java 代码中获取操作并尝试设置操作对象的结果 属性 的值,下面是我正在尝试但它不起作用的代码。有人可以为此提出更好的方法吗?

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 到 return $Loan_Number,但在输出文本中它仍然是空白的,在操作中它仍然是空白的?

您问题的简单答案是否定的,您不能使用 setResultVariable 在 JSON 模型中设置任何内容。它应该像这样工作:

1) 在您的对话节点上定义一个动作

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

2) 处理Java客户端中的动作

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 Dialog(或其他应用程序)终于可以从客户端获取结果:

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

您使用 Java API 读取的对象正在使用 Gson 从 JSON 解析,需要重新解析回 JSON当构建一个新的 API Call.

问题更新后编辑

在你的例子中:

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

result_variable 告诉您应用中的其他模块在哪里可以找到您的操作结果。所以 $Loan_Number 不应该是 value 而是 key 到会话上下文中的值(一种方法契约)。
假设您将值设置为 context.my_result,那么您的 Watson Assistant 应该能够从 "context.my_result" 下的下一个对话节点中的数据库访问“123”。