代码之家  ›  专栏  ›  技术社区  ›  James

节点。js-结合IBM Watson发现和对话服务

  •  3
  • James  · 技术社区  · 7 年前

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

    我现在正试图将两者联系起来!当对话准备好查询发现时,它将移动到调用的意图 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;
      }
    

    查询 如果是查询Watson 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] } }
    

    这是IBM的全部程序 https://github.com/watson-developer-cloud/conversation-simple

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sayuri Mizuguchi    7 年前

    conversation-with-discovery

    总结:

    你可以在 workspace ,对发现的呼吁是 动作变量 call_discovery

    "action":{"call_discovery: ""}

    基本上,对名称有一个意图 out_of_scope if 发生

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

    上下文变量(示例: "callDiscovery": true ) updateMessage 内部 conversation-simple 例子:

    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 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);  
      });   
    
    }
    

    response 参数为用户发送消息,然后,您需要在函数中设置调用发现的参数,并在函数中添加以下代码。

    • 见官方 video project 并展示了一个调用发现服务并将结果发送给用户的好示例。