Node.js-结合IBM Watson发现和对话服务
我知道这可能看起来很复杂,但我花了一个半星期的时间试图做到这一点,却无法理解。希望有人能给我指出正确的方向。非常感谢你 我正在使用IBM Watson和Node.js创建对话机器人。我创建了bot,并使用IBM的一个示例程序(Conversation Simple)创建了一个与bot交互的网站。一切都很好用。我现在尝试使用Watson的发现搜索文档,并用查询响应回答问题。我让Discovery在您可以查询它的地方工作,并有一个Node.js程序来查询它 我现在正试图将两者联系起来!当对话准备好查询发现时,它将移动到名为Node.js-结合IBM Watson发现和对话服务,node.js,ibm-cloud,ibm-watson,watson-conversation,watson-discovery,Node.js,Ibm Cloud,Ibm Watson,Watson Conversation,Watson Discovery,我知道这可能看起来很复杂,但我花了一个半星期的时间试图做到这一点,却无法理解。希望有人能给我指出正确的方向。非常感谢你 我正在使用IBM Watson和Node.js创建对话机器人。我创建了bot,并使用IBM的一个示例程序(Conversation Simple)创建了一个与bot交互的网站。一切都很好用。我现在尝试使用Watson的发现搜索文档,并用查询响应回答问题。我让Discovery在您可以查询它的地方工作,并有一个Node.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;
}
此代码当前打印:
{ 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的整个程序,如IBM开发人员提供的示例:。您可以遵循相同的逻辑编程。但我真的建议你在这个答案的最后看看这个项目和视频 摘要: 您可以在中看到,对发现的调用是高级JSON(对话框节点)中名为
call\u discovery
的一个操作变量
“操作”:{“调用发现:”}
基本上,有一个意图,名称在\u范围之外
,因为用户在意图中告诉了一些没有答案的东西,或者在对话中告诉了一些条件,所以会发生发现调用,并根据用户的消息返回一个对象和文档
在对话服务内创建一个上下文变量:
{
"context": {
"callDiscovery": true
},
"output": {
"text": {
"values": [
"Wait for the response, I'll check out."
],
"selection_policy": "sequential"
}
}
}
创建一个上下文变量后(例如:“callDiscovery”:true
)在用于调用发现服务的高级JSON的聊天机器人中的节点中,您需要使用代码来确定是否到达了需要调用发现服务的部分。类似于在示例中使用函数updateMessage
:
并且,在函数getMyBody
(返回问题打印内容的函数[id、文本、url等
),您需要向用户发送消息,例如:
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);
});
}
注意:根据project conversation simple,需要使用response
参数为用户发送消息,然后需要在函数中设置调用查找的参数,并在函数中添加上面的代码
- 请参见IBM Watson的官方介绍,并展示了一个调用发现服务并向用户发送结果的好例子
call_discovery
?是的,就像我上面的代码示例一样。但是您需要在对话聊天机器人的对话服务中,当您编写代码查找上下文变量时,将使用您的代码调用该函数。那么,我应该在callDiscovery函数中添加什么呢?我假设与我的代码类似?
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
}
}
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);
});
}