Conteúdo


E aí, Watson? Usando QAAPI do Watson com IBM Cloud e NodeExpress

Comments

Crie um aplicativo IBM Cloud™ que usa a Watson Question and Answer API (QAAPI). O Watson da IBM é capaz de entender as nuances da língua inglesa. IBM Cloud agora inclui oito serviços do Watson, incluindo Concept Expansion, Language Identification, Machine Translation e Question and Answer. Para mais informações sobre a QAAPI do Watson e os vários serviços incluídos no IBM Cloud, consulte Watson Services.

O release atual do IBM Cloud Watson é um corpus de fatos médicos. Foram fornecidos ao Watson documentos médicos em diversos formatos (doc, pdf, html, texto e assim por diante) e o usuário pode fazer perguntas médicas à QAAPI do Watson.

Este tutorial mostra como usar a Watson Question and Answer API para fazer consultas e obter resultados de vários tipos.

No aplicativo descrito neste tutorial, o NodeExpress é usado para criar um servidor da web e enviar perguntas ao Watson usando APIs REST. Jade é usado para formatar os resultados da resposta do Watson.

Observação: O código deste aplicativo IBM Cloud, com Pergunta e Resposta como serviço, é baseado no documento "Getting started with the Question and Answer service."

O que será necessário para desenvolver o aplicativo

  • Familiaridade com a criação de aplicativos da web em um ambiente de desenvolvimento Node.js usando a estrutura de aplicativos da web NodeExpress e o mecanismo de modelo Jade
  • Conhecimento básico sobre a plataforma Cloud Foundry (a base do IBM Cloud) e contas do
  • DevOps Services e IBM Cloud do modelo de programação serviço-composição
  • A interface da linha de comandos cf, disponível para download diretamente na interface com o usuário da web do IBM Cloud
  • Conhecimento básico sobre as APIs do serviço Watson Question and Answer

Execute o aplicativoObtenha o código

Etapa 1. Implementar o aplicativo no IBM Cloud usando o comando cf

  1. Para usar a linha de comando do Git, faça o download do código do projeto DevOps Services para um diretório local chamado whatsup. Execute o comando a seguir:
    git clone https://hub.jazz.net/git/tvganesh/WhatsupWatson/
    Também é possível clonar o código de meu projeto WhatsupWatson no GitHub:
    git clone https://github.com/tvganesh/WhatsupWatson
  2. Faça o download e a instalação da ferramenta de linha de comando Cloud Foundry (cf), que será usada para fazer upload do aplicativo e gerenciá-lo. Para verificar se a instalação do Cloud Foundry foi bem-sucedida, execute o comando a seguir:
    cf –version
  3. Efetue login no IBM Cloud usando o comando CLI cf.
    cf login -a https://api.ng.bluemix.net
  4. Acesse o diretório no qual você clonou o código do aplicativo WhatsupWatson. Use seu editor favorito para editar manifest.yml. Escolha um nome apropriado para o aplicativo (por exemplo, DrWatson ou Doctor), altere o campo de nome e salve o arquivo. Insira também um nome exclusivo no campo de host. Você poderia incluir suas iniciais como um sufixo para torná-lo exclusivo. No meu caso, eu usei "WhatsupWatson" como nome do aplicativo e também no campo do host.
  5. Agora, realize o push do aplicativo para o IBM Cloud usando cf:
    cf push WhatsupWatson --no-start
  6. Digite o comando a seguir para criar uma instância do serviço Question and Answer do Watson:
    cf create-service question_and_answer question_and_answer_free_plan question_and_answer001
  7. Vincule a instância de serviço question_and_answer question_and_answer001 ao aplicativo IBM Cloud, WhatsupWatson. Nesse caso, você inseriria:

    cf bind-service WhatsupWatson question_and_answer001
  8. Agora, inicie o aplicativo:
    cf start WhatsupWatson
    Você deverá ver o droplet sendo transferido por upload:Figure showing uploading
    Figure showing uploading

É possível passar diretamente para a Etapa 2 a partir daqui, a menos que também queira incluir um serviço do painel do IBM Cloud.

Opcional: Inclua um serviço do painel do IBM Cloud

Caso queira, é possível incluir um serviço do painel do IBM Cloud seguindo as instruções a seguir:

  1. O aplicativo WhatsupWatson deve constar no painel do IBM Cloud. Ele aparecerá no painel com o status Not running.Figure showing dashboard
    Figure showing dashboard
  2. Agora, clique em Add a Service e, em Watson, inclua Question and Answer.Figure showing adding a service
    Figure showing adding a service
  3. Inclua o Watson Question and Answer-gk ao aplicativo WhatsupWatson.Figure showing Question and Answer
    Figure showing Question and Answer
  4. Aparece a mensagem Restage Application. Clique em OK. Quando o aplicativo estiver em execução, será possível começar a usar o Doc Watson.
  5. A menos que você queira usar a GUI do DevOps, pode ignorar a Etapa 1a e ir diretamente para a Etapa 2.

Etapa 1a. Implemente no IBM Cloud usando a GUI do DevOps

Este procedimento é um método alternativo para implementar o aplicativo WhatsupWatson usando a GUI do DevOps.

  1. Acesse o projeto em WhatsupWatson.
  2. Clique em Edit Code > Fork. Dê um nome apropriado ao projeto.Figure showing choosing the Fork optioin
    Figure showing choosing the Fork optioin
  3. Desmarque Make it private e Add features for Scrum development. Selecione e marque Deploy to IBM Cloud. Em seguida, clique em Save.Figure showing Deploy to IBM Cloud
    Figure showing Deploy to IBM Cloud
  4. Abra o arquivo manifest.yml usando o editor de GUI e insira o nome do aplicativo (por exemplo, "DrWatson" ou "Doctor", conforme o caso). Use um nome exclusivo no campo de host. Confirme e realize o push das alterações.
  5. Agora, clique em Build and Deploy. Figure showing Build and Deploy
    Figure showing Build and Deploy
  6. Escolha a opção Simple deploy e, por fim, clique em Request Deploy. Figure showing request deploy
    Figure showing request deploy
  7. Em alguns momentos, OK é exibido e o WhatsupWatson aparece no painel do IBM Cloud com o status Not Running.
  8. Agora, siga as etapas em Opcional: Inclua um serviço do painel do IBM Cloud acima e, em seguida, execute o aplicativo como descrito abaixo.

Etapa 2. Executar o aplicativo

Para executar o aplicativo Watson Question and Answer, clique na rota. Neste caso, a rota é WhatsupWatson.mybluemix.net.

Figure showing choosing the route
Figure showing choosing the route

Etapa 3. Dr. Watson a seu dispor

Isso deve abrir o Watson Question and Answer, e o aplicativo será executado como mostrado abaixo. Não são necessárias outras alterações para executar o aplicativo.

Figure showing Watson question and answer
Figure showing Watson question and answer

Clique em qualquer um dos links para usar o serviço Watson Question and Answer.

Detalhes de implementação do WhatsupWatsonapp

A seção abaixo descreve brevemente como o aplicativo WhatsupWatson é implementado.

app.js

No módulo app.js, o ambiente VCAP é analisado para obter as credenciais para usar o serviço Watson Question and Answer, como mostrado abaixo.

if (process.env.VCAP_SERVICES) {
  var VCAP_SERVICES = JSON.parse(process.env.VCAP_SERVICES);
  // retrieve the credential information from VCAP_SERVICES for Watson QAAPI
  hostname   = VCAP_SERVICES["question_and_answer"][0].name;               
  passwd = VCAP_SERVICES["question_and_answer"][0].credentials.password;
  username = VCAP_SERVICES["question_and_answer"][0].credentials.username;
  watson_url = VCAP_SERVICES["question_and_answer"][0].credentials.url;
}

O corpus do Watson é configurado para healthcare:
parts = url.parse(watson_url +'/v1/question/healthcare');

Há diferentes maneiras de fazer perguntas ao Watson. As respostas dependem das opções e parâmetros usados para FAZER a pergunta ao Watson. O aplicativo usa uma rota para cada tipo e opção de pergunta. Os tipos são:

a. Consulta síncrona simples: Postar uma consulta síncrona simples para o Watson.

Essa é a consulta mais simples que pode ser feita ao Watson. Nesse caso, é necessário incluir apenas o texto da pergunta e o tempo limite da sincronização. O tempo limite de sincronização indica o período em que o cliente aguarda respostas do serviço Watson.

// Ask Watson a simple synchronous query
app.get('/question',question.list);
app.post('/simplesync',simplesync.list);

b. Pergunta baseada em evidência: Peça ao Watson que responda com base em evidências, como condições médicas.

// Ask Watson for responses based on evidence provided
app.get('/evidence',evidence.list);
app.post('/evidencereq',evidencereq.list);

c. Solicitar um conjunto especificado de respostas a uma pergunta: Peça ao Watson que dê um número especificado de respostas a uma pergunta.

// Ask Watson to provide specified number of responses to a query
app.get('/items',items.list);
app.post('/itemsreq',itemsreq.list);

d. Obter uma resposta formatada a uma pergunta: Peça ao Watson que formate a resposta a uma pergunta.

// Get a formatted response from Watson for a query
app.get('/format',format.list);
app.post('/formatreq',formatreq.list);

Para começar a usar o Watson, conecte o aplicativo IBM Cloud à QAAPI do Watson como serviço analisando a variável de ambiente, como mostrado abaixo.

simplesync.js

O código em simplesync.js, evidencereq.js, itemsreq.js e formatreq.js é semelhante. Os módulos constroem a pergunta no formato necessário. Os detalhes da implementação de simplesync.js são descritos abaixo:

a. Os valores do formulário são configurados em variáveis de entrada.

// Get the values from the form
var syncTimeout = req.body.timeout;
var query = req.body.query;

b. Os cabeçalhos da solicitação POST são configurados.

// Set the required headers for posting the REST query to Watson
headers = {'Content-Type'  :'application/json',
                  'X-synctimeout' : syncTimeout,
                  'Authorization' : "Basic " + new Buffer(username+":"+passwd).toString("base64")};

c. Em seguida, as opções da solicitação POST são configuradas.

// Create the request options to POST our question to Watson
var options = {host: parts.hostname,
port: 443,
path: parts.pathname,
method: 'POST',
headers: headers,
rejectUnauthorized: false, // ignore certificates
requestCert: true,
agent: false};

É necessário formatar corretamente a pergunta a ser feita ao Watson, com base na entrada recebida no formato apropriado (por exemplo, simplesync.jade).

// create the Question text to ask Watson
var question = {question : {questionText :query }};
// Set the POST body and send to Watson
req.write(JSON.stringify(question));
req.write("\n\n");
req.end();

Agora você envia a pergunta ao Watson por POST e recebe o fluxo de respostas usando os comandos Node.js .on('data') e .on('end'), conforme mostrado abaixo.

var req = https.request(options, function(result) {
result.setEncoding('utf-8');
// Retrieve and return the result back to the client
result.on("data", function(chunk) {
output += chunk;
});

result.on('end', function(chunk) {		  
           var answers = JSON.parse(output);
			      results = answers[0];
			      res.render(
					 'answer', {
                      "results":results
                                        
			   });
			
});

Os resultados são analisados, formatados e exibidos usando Jade. Para os modelos do Jade, eu usei uma combinação de Jade e marcas HTML sequenciais.

Abaixo está a parte do modelo Jade com marcas HTML sequenciais.

answer.jade

if results.question.qclasslist
    for result in results.question.qclasslist
      p <font color="blueviolet">  Value   = <font color="black "> #{result.value} </font>
  if results.question.focuslist
    p <font color="blueviolet">  Focuslist  </font> = <font color="black "> #{results.question.focuslist[0].value} </font>
  if latlist
    p <font color="blueviolet">  Latlist  </font> = <font color="black "> #{results.question.latlist[0].value} </font>

Execute o aplicativo Whatsup Watson QAAPI

Há cinco diferentes opções de perguntas e respostas para a QAAPI do Watson. (Observação: Este aplicativo implementa quatro das cinco opções.)

1. Pergunta e resposta síncronas simples

Nessa opção, é necessário incluir apenas o texto da pergunta e o tempo limite da sincronização. A pergunta pode ser qualquer questão relacionada à medicina, já que o Watson possui um corpus médico atualmente.

Por exemplo, você poderia perguntar "O que é a doença da artéria carótida?", ou "Qual a diferença entre hepatite A e B?".

O parâmetro de tempo limite de sincronização especifica o número de segundos em que o cliente QAAPI espera por uma resposta de fluxo do Watson. Aqui está um exemplo de pergunta:

Figure showing sync timeout
Figure showing sync timeout

Quando você clica em Submit, o Watson responde:

Figure showing response
Figure showing response

2. Resposta baseada em evidência

Nesse modo de operação, é possível fazer perguntas ao Watson com base em evidências observadas. O Watson emite todas as informações relevantes com base na evidência fornecida. Como podemos ver no resultado, o Watson fornece um "fator de confiança" para cada uma das respostas.

Figure showing evidence-based response
Figure showing evidence-based response

O Watson dá respostas com valores de confiança apropriados com base na evidência fornecida.

Figure showing confidence values
Figure showing confidence values

3. Pergunta com um número especificado de respostas

Nessa opção, é possível solicitar ao Watson que forneça ao menos n itens em sua resposta. Se não puder fornecer esse número de itens, o Watson emitirá uma notificação de erro.

Figure showing specified number of responses
Figure showing specified number of responses

Para usar essa opção, clique em Option 3. Na tela abaixo, insira What is the treatment for Down's syndrome? Insira 3 no número de itens.

Figure showing down's syndrome question
Figure showing down's syndrome question

O Watson inclui três itens na resposta.

Figure showing three responses
Figure showing three responses

4. Resposta formatada

Nesse caso, o Watson fornece uma resposta formatada a uma pergunta.

Figure showing formatted response
Figure showing formatted response

5. Resposta baseada em sinônimo atualizada

Nesse modo, o Watson busca por informações relevantes com base em uma lista de sinônimos fornecida pelo usuário. No exemplo abaixo, o Watson gera uma lista de sinônimos para a pergunta "O que é febre?". Para desativar sinônimos, altere a configuração para false, podendo também incluir outros sinônimos para a procura.

Figure showing synonym list

É possível especificar na pergunta os sinônimos a serem incluídos e aqueles a serem excluídos. O Watson fará uma nova procura com base na lista de sinônimos.

Uma analisada nos componentes na resposta do Watson

Existem seções demais e informações demais na resposta do Watson para discutir tudo neste tutorial. Eu incluí abaixo pequenas seções de cada parte da resposta do Watson para a pergunta "Como tratar a doença da artéria carótida?".

  1. Detalhes da pergunta

    Nesta seção, o Watson analisa a pergunta e determina os elementos sintáticos e semânticos básicos na resposta.

    Figure showing question details
    Figure showing question details
  2. Lista de evidências

    A lista de evidências inclui muitas informações, incluindo a confiança do Watson na resposta, o texto da resposta, informações sobre copyright e assim por diante.

    Figure showing evidence list
    Figure showing evidence list
  3. Lista de sinônimos

    A pesquisa da QAAPI do Watson é baseada em uma lista de sinônimos que ele cria para a procura. Por exemplo, a palavra "febre" na pergunta também inclui o sinônimo "febrento" na lista de procura.

    Figure showing synonym list
  4. Respostas

    O Watson gera um conjunto de respostas para as perguntas, com a confiança de cada resposta.

    Figure showing answers
    Figure showing answers
  5. Notificações de erro

    Este campo exibe mensagens de erro caso o Watson Question and Answer não consiga gerar o número de itens necessário.

Conclusão

No aplicativo descrito aqui, foram incluídas as respostas do Watson a diferentes formatos de pergunta. No entanto, a real utilidade da QAAPI do Watson surge quando você faz perguntas inteligentes ao Watson e obtém informações relevantes nas respostas. Em outras palavras, a QAAPI do Watson precisa ser usada para analisar efetivamente o corpus de informações médicas e chegar até as respostas relevantes.

Podemos imaginar um cenário em que um médico chegaria a um diagnóstico possível através destas etapas:

  1. Fazer ao Watson perguntas baseadas na condição do paciente: febre, dor, calafrios etc. Isso traria à tona todas as doenças que possuem esses sintomas.
  2. O médico poderia, então, escolher as três principais doenças na resposta do Watson, fazer consultas síncronas simples para cada uma delas e observar as informações fornecidas nas respostas do Watson.
  3. Suponha agora que o médico consiga eliminar duas das três doenças. O médico pode fazer perguntas ao Watson com a opção número de resposta sobre a doença em particular.
  4. O médico poderia observar os detalhes de cada uma das respostas em relação àquela doença, ajustar a lista de sinônimos para remover informações estranhas e chegar à verdadeira doença do paciente.

Recursos para download


Tema relacionado


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Cloud computing
ArticleID=993918
ArticleTitle=E aí, Watson? Usando QAAPI do Watson com IBM Cloud e NodeExpress
publish-date=12262014