Node.js - 结合 IBM Watson Discovery 和 Conversation Services
Node.js - Combine IBM Watson Discovery and Conversation Services
我知道这可能看起来很复杂,但我已经花了一个半星期的时间来尝试做到这一点,但无法弄清楚。希望有人能指出我正确的方向。非常感谢!
我正在与 IBM Watson 和 Node.js 合作创建一个对话机器人。我已经创建了机器人并使用 IBM 的示例程序之一 (Conversation-Simple) 制作了一个网站来与机器人进行交互。它的一切都有效。我现在正在尝试使用 Watson's 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] } }
回复用户我要的值为text和URL的值。
这是来自 IBM 的整个程序 https://github.com/watson-developer-cloud/conversation-simple
喜欢来自 IBM Developers 的这个例子:conversation-with-discovery。您可以按照相同的逻辑编程。但我真的建议查看此答案末尾的项目和视频。
总结:
您可以在 workspace 中看到,对发现的调用是 Advanced JSON(对话节点)中的一个 action 变量,名为 call_discovery
.
"action":{"call_discovery: ""}
,
基本上,有一个名称为 out_of_scope
的意图,因为 if 用户说的内容在意图中没有任何答案或Conversation 中的某些条件,根据用户的消息,对 discovery 的调用将 happen 和 return 与文档的一个对象。
在对话服务中创建一个上下文变量:
{
"context": {
"callDiscovery": true
},
"output": {
"text": {
"values": [
"Wait for the response, I'll check out."
],
"selection_policy": "sequential"
}
}
}
在 Advanced JSON 的 Chatbot 的节点内创建一个 上下文变量(示例:"callDiscovery": true
) 以调用发现服务后,您需要使用代码来识别您是否到达了需要调用 Discovery 的部分。类似于在 conversation-simple 示例中使用函数 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
(return 打印您的问题 [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 和 Node.js 合作创建一个对话机器人。我已经创建了机器人并使用 IBM 的示例程序之一 (Conversation-Simple) 制作了一个网站来与机器人进行交互。它的一切都有效。我现在正在尝试使用 Watson's 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] } }
回复用户我要的值为text和URL的值。
这是来自 IBM 的整个程序 https://github.com/watson-developer-cloud/conversation-simple
喜欢来自 IBM Developers 的这个例子:conversation-with-discovery。您可以按照相同的逻辑编程。但我真的建议查看此答案末尾的项目和视频。
总结:
您可以在 workspace 中看到,对发现的调用是 Advanced JSON(对话节点)中的一个 action 变量,名为 call_discovery
.
"action":{"call_discovery: ""}
,
基本上,有一个名称为 out_of_scope
的意图,因为 if 用户说的内容在意图中没有任何答案或Conversation 中的某些条件,根据用户的消息,对 discovery 的调用将 happen 和 return 与文档的一个对象。
在对话服务中创建一个上下文变量:
{
"context": {
"callDiscovery": true
},
"output": {
"text": {
"values": [
"Wait for the response, I'll check out."
],
"selection_policy": "sequential"
}
}
}
在 Advanced JSON 的 Chatbot 的节点内创建一个 上下文变量(示例:"callDiscovery": true
) 以调用发现服务后,您需要使用代码来识别您是否到达了需要调用 Discovery 的部分。类似于在 conversation-simple 示例中使用函数 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
(return 打印您的问题 [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的函数中设置参数,并在您的函数中添加上面的以下代码。