簡體   English   中英

Node.js - 結合IBM Watson Discovery和Conversation Services

[英]Node.js - Combine IBM Watson Discovery and Conversation Services

我知道這可能看起來很復雜,但我花了一個半星期的時間試圖做到這一點並且無法理解。 希望有人可以指出我正確的方向。 非常感謝!

我正在與IBM Watson和Node.js合作創建一個會話機器人。 我創建了bot並使用IBM的一個示例程序(Conversation-Simple)來創建一個與bot進行交互的網站。 隨身攜帶的一切都有效。 我現在正嘗試使用Watson的Discovery來搜索文檔並使用查詢響應回答問題。 我有Discovery工作,你可以在其中查詢它並有一個Node.js程序來查詢它。

我現在正試圖連接這兩個! 當Conversation准備好查詢Discovery時,它將移動到名為query的intent。

看起來這就是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

就像來自IBM Developers的這個例子: 與發現對話 您可以遵循相同的邏輯編程。 但我真的建議在這個答案的最后檢查項目和視頻。

摘要:

您可以在工作區中看到,發現調用是高級JSON(對話節點)中名為call_discovery一個操作變量

"action":{"call_discovery: ""}

基本上,有一個意圖名為out_of_scope ,因為如果用戶告訴一些不具備的意圖或在對話中的一些條件的任何答案,呼吁發現發生 ,並根據該消息的文檔返回一個對象來自用戶。

在Conversation服務中創建一個上下文變量:

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

在高級JSON中的Chatbot中的節點內創建一個上下文變量(例如: "callDiscovery": true以調用發現服務后,您需要使用代碼來識別是否到達了需要調用的部分發現。 就像在對話中使用函數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 (返回你的問題[ 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參數為用戶發送消息,然后,您需要在函數中設置調用Discovery的參數,並在您的上面添加以下代碼功能。

  • 請參閱IBM Watson關於此項目的官方視頻 ,並展示調用Discovery服務並向用戶發送結果的一個很好的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM