Как мы можем установить значение переменной контекста помощника Ватсона, используя Java? - PullRequest
0 голосов
/ 20 декабря 2018

Можно ли установить значение переменной контекста из 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, которую я использую в выходном тексте для возврата $ Loan_Number,но в выходном тексте он все еще становится пустым, а в действиях он также становится пустым?

1 Ответ

0 голосов
/ 21 декабря 2018

Простой ответ на ваш вопрос - нет, вы не можете ничего установить в модели JSON, используя setResultVariable.Он должен работать следующим образом:

1) Определить действие на вашем Dialognode enter image description here

result_variable определяет <result_variable_name>Например, где результат этого действия должен быть сохранен в контексте разговора.Если вы выполняете какое-либо действие на стороне сервера, вы читаете результат из указанного местоположения контекста.В этом примере расположение context.result_of_action, context может быть опущено.Более подробная информация здесь .

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 (или другое приложение) может получить результат от клиента:

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

Объекты, которые вы читаете с использованием Java API, анализируются из JSON с использованием Gson и должны быть повторно проанализированы обратно в JSON при создании нового вызова API.

Редактировать после обновления вопроса

В вашем примере:

 "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 должен иметь доступ к «123» из БД в следующем диалоговом узле под «context.my_result».

...