3

我知道这可能看起来很复杂,但我花了一个半星期的时间试图做到这一点,但无法弄清楚。希望有人能指出我正确的方向。太感谢了!

我正在使用 IBM Watson 和 Node.js 创建一个对话机器人。我创建了机器人并使用 IBM 的一个示例程序(Conversation-Simple)创建了一个与机器人交互的网站。一切正常。我现在正在尝试使用 Watson 的 Discovery 来搜索文档并使用查询响应来回答问题。我有 Discovery 工作,您可以在其中查询它并有一个 Node.js 程序来查询它。

我现在正在尝试将两者联系起来!当 Conversation 准备好查询 Discovery 时,它将移动到名为query.

看起来这是 Watson 给出响应的地方,响应的变量是currentText。我可能是错的,但看起来是这样。

  function buildMessageDomElements(newPayload, isUser) {
    var textArray = isUser ? newPayload.input.text : newPayload.output.text;
    if (Object.prototype.toString.call( textArray ) !== '[object Array]') {
      textArray = [textArray];
    }
    var messageArray = [];

    textArray.forEach(function(currentText) {
      if (currentText) {
        var messageJson = {
          // <div class='segments'>
          'tagName': 'div',
          'classNames': ['segments'],
          'children': [{
            // <div class='from-user/from-watson latest'>
            'tagName': 'div',
            'classNames': [(isUser ? 'from-user' : 'from-watson'), 'latest', ((messageArray.length === 0) ? 'top' : 'sub')],
            'children': [{
              // <div class='message-inner'>
              'tagName': 'div',
              'classNames': ['message-inner'],
              'children': [{
                // <p>{messageText}</p>
                'tagName': 'p',
                'text': currentText
              }]
            }]
          }]
        };
        messageArray.push(Common.buildDomElement(messageJson));
      }
    });

    return messageArray;
  }

当它在这里(或者如果它在其他地方)响应时,我如何检查意图是否是query以及它是否是查询 Watson Discovery?

这就是我目前查询 Discovery 的方式:

url2 = 'fakeURL'

var request = require("request");
var myJSON = require("JSON");
global var body1;
function getMyBody(url, callback) {
  request(
  {
    url: url,
    auth: {'user': 'fakeUsername','pass': 'fakePassword'},
    json: true
  },
  function (error, response, body) {
    if (error || response.statusCode !== 200) {
      return callback(error || {statusCode: response.statusCode});
    }
    else{
      callback(null, JSON.parse(JSON.stringify(body.results)));
    }
  });
}

getMyBody(url2, function test8(err, body) {
    body1 = body[0];
    console.log(body1)
  }
);

此代码当前打印:

{ id: 'a3990d05fee380f8d0e9b99fa87188a7',
    score: 1.0697575,
    os: { OperatingSystem: 'Windows 10 Professional' },
    price: '174.99',
    text: 'Lenovo ThinkCentre M58 Business Desktop Computer, Intel Core 2 Duo 30 GHz Processor, 8GB RAM, 2TB Hard Drive, DVD, VGA, Display Port, RJ45, Windows 10 Professional (Certified Refurbished)',
    url: 'https://www.amazon.com/Lenovo-ThinkCentre-M58-Professional-Refurbished/dp/B01M4MD9C1?SubscriptionId=AKIAJXXNMXU323WLP4SQ&tag=creek0a-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B01M4MD9C1',
    highlight: { text: [Array] } }

我想对用户的响应是文本的值和 URL 的值。

这是来自 IBM https://github.com/watson-developer-cloud/conversation-simple的整个程序

4

1 回答 1

1

就像 IBM Developers 的这个例子:conversation-with-discovery。您可以遵循相同的逻辑编程。但我真的建议在这个答案的末尾查看项目和视频。

概括:

您可以在工作区中看到,发现调用是高级 JSON(对话节点)中的一个操作变量call_discovery,称为.

"action":{"call_discovery: ""},

基本上out_of_scope一个意图,名称为用户。

在对话服务中创建一个上下文变量:

{
  "context": {
    "callDiscovery": true
  },
  "output": {
    "text": {
      "values": [
        "Wait for the response, I'll check out."
      ],
      "selection_policy": "sequential"
    }
  }
}

在高级 JSON 中的 Chatbot 中的节点内创建一个上下文变量(示例"callDiscovery": true:)以调用发现服务后,您需要使用代码来识别您是否到达了需要调用 Discovery 的部分。就像使用对话简单示例中的函数updateMessage一样:

function updateMessage(input, response) {
  var callDiscovery ;
  if (!response.output) {
    response.output = {};

    //THE CONTEXT VARIABLE callDiscovery
  } else if (response.context.callDiscovery === true){
      //CREATE ONE NEW FUNCTION WITH YOUR CODE
      getMyBody(url, callback, response); //response parameter for send the message
    }
}

并且,在您的函数getMyBody中(返回 Question[ id, text, url, etc] 中的打印结果的函数),您需要将消息发送给用户,例如:

url2 = 'fakeURL'

var request = require("request");
var myJSON = require("JSON");
var body1;
function getMyBody(url, callback, response) {
  request(
  {
    url: url,
    auth: {'user': 'fakeUsername','pass': 'fakePassword'},
    json: true
  },
  function (error, response, body) {
    if (error || response.statusCode !== 200) {
      return callback(error || {statusCode: response.statusCode});
    }
    else{
      callback(null, JSON.parse(JSON.stringify(body.results)));
    }
  });
}

getMyBody(url2, function test8(err, body) {
    body1 = body[0];
    console.log(body1);
    var sendMessage = ("I've find this results: "+ body1.text + "And you can see the url: "+ body1.url)// you said body1.text and body1.url
    response.output.text[0] = sendMessage;
    return res.json(response);  
  });   

}

注意:根据项目conversation-simple,需要使用response参数为用户发送消息,然后,需要在调用Discovery的函数中设置参数,并在函数中添加如下代码.

  • 请参阅 IBM Watson 的官方视频,讨论这个项目并展示一个调用 Discovery 服务并将结果发送给用户的好例子。
于 2017-09-10T21:36:55.497 回答