3

이 작업은 복잡해 보일 수 있지만이 작업을 수행하는 데는 1 주일 반을 소비 했으므로 알아낼 수는 없습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다. 정말 고맙습니다!Node.js - IBM Watson Discovery 및 Conversation Services 결합

대화 봇을 생성하기 위해 IBM Watson 및 Node.js와 협력하고 있습니다. 나는 로봇을 만들었고 IBM의 예제 프로그램 중 하나 (Conversation-Simple)를 사용하여 웹 사이트가 로봇과 상호 작용할 수있게했다. 그것으로 모든 것이 작동합니다. 이제 Watson의 Discovery를 사용하여 문서를 검색하고 쿼리 응답과 함께 질문에 응답하려고합니다. Discovery는 쿼리 할 수있는 곳에서 작동하며 쿼리 할 Node.js 프로그램이 있습니다.

이제 두 개를 연결하려고합니다. 대화에서 검색을 쿼리 할 준비가되면 query이라는 인 텐트로 이동합니다.

왓슨이 응답을 보내고 응답의 변수가 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 있는지 확인 할 수 있으며 쿼리 왓슨 디스커버리 인 경우?

이것은 내가 현재 발견을 조회하는 방법입니다

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의 값으로 할 사용자에 대한 응답을. conversation-with-discovery :

이 IBM https://github.com/watson-developer-cloud/conversation-simple IBM 개발자에서이 예처럼

답변

1

에서 전체 프로그램입니다. 당신은 동일한 논리 프로그래밍을 따를 수 있습니다. 그러나이 답변이 끝나면 프로젝트와 비디오를 확인하는 것이 좋습니다.

요약 : 당신은 workspace에서 볼 수

은 발견에 대한 호출은 고급 JSON (대화 노드) 내부에 하나 개 액션 변수call_discovery이라고합니다. if 사용자가 의도에 어떤 대답이나 대화의 일부 조건이없는 뭔가 발견을위한 전화를 알려주기 때문에

"action":{"call_discovery: ""}, 기본적으로

는 이름 out_of_scope 한 의도를 가지고이 발생하면이 발생하고 사용자가 보낸 메시지에 따라 문서가있는 개체가 하나씩 반환됩니다.호출 검색 서비스, 당신이 필요위한 고급 JSON에 Chatbot에서 노드 내부 :

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

후 한 컨텍스트 변수 ("callDiscovery": true 예)를 작성

것은 대화 서비스 내 하나 개의 컨텍스트 변수를 만듭니다 Discovery를 요청해야하는 부분에 도착했는지 확인하기 위해 코드를 사용합니다. conversation-simple 예를 들어 내부 기능 updateMessage를 사용하여 같은 것을됩니다 함수에서, getMyBody

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

그리고 (에 인쇄를 반환하는 기능을 당신의 질문 [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를 사용하여 follo를 추가합니다. 귀하의 기능에서 위의 윙 코드.

  • 은 IBM 왓슨에 의해 공식 videoproject에 대해 이야기하고 검색 서비스를 호출하는 하나의 좋은 예를 보여주는보기 및 사용자에 대한 결과를 보냅니다.
+0

그래서이 프로젝트를 사용하려고했지만 문제가 발생했습니다. " call_discovery ". 대화 대화에서 어떻게 호출합니까? 도와 주셔서 너무 고마워요! – James

+0

Watson 대화 내에서 하나의 컨텍스트 변수를 생성해야합니다. 검색 서비스를 호출하려는 대화 상자 노드에서 쿼리 된 텍스트를 반환합니다. –

+0

call_discovery를 호출합니까? – James