Desenvolvimento

18 mai, 2017

Usando serviços cognitivos (ou de inteligência artificial) para melhorar um chatbot

Publicidade

Nos artigos anteriores, vimos como criar um chatbot que possa ser implantado em dois aplicativos de mensagens: Facebook (publicado no iMasters, em português) e no Slack (leia o texto em inglês, aqui). Neste tutorial final, explico como você pode aprimorar o chatbot usando o IBM Watson Services. O chatbot de notícias nesta série usa o conteúdo do developerWorks como um exemplo, mas você pode modificar a fonte de conteúdo para atender às suas próprias necessidades.

Em outros artigos, eu descrevi a importância da inteligência artificial (IA) em seus chatbots e expliquei como é difícil construir sua própria IA – ela requer não apenas as melhores cabeças da ciência dos dados, mas também uma enorme quantidade de dados para treinar modelos. Uma pequena empresa geralmente não tem esses tipos de recursos. Felizmente, você pode usar a pesquisa avançada de IA que é feita por empresas como a IBM em seus aplicativos.

A IBM fornece suas funções de IA através dos serviços Watson em sua plataforma Bluemix. Esses serviços permitem que você incorpore IA em seu aplicativo simplesmente chamando serviços da web. Nos dois artigos anteriores desta série, deixei algumas chaves de serviço vazias na classe BaseServlet. Essas chaves são para os serviços Watson que eu uso no chatbot. Especificamente, eu uso:

  • Watson Conversation para determinar a intenção do usuário quando o usuário diz algo que não está na lista de palavras-chave do comando.
  • Watson Retrieve and Rank (recuperação e classificação) que combina um mecanismo de pesquisa com um modelo de classificação treinado para fornecer resultados de pesquisa personalizados e específicos do domínio.
  • Watson Speech to Text para interpretar o que o usuário diz ao enviar uma gravação de voz.
  • Watson Text to Speech para ler o resumo do artigo em voz alta para o usuário.
  • Watson Tradeoff Analytics para permitir que o chatbot selecione um artigo para o usuário com base nas preferências declaradas do usuário.

Nota: O Watson Conversation faz mais do que detectar a intenção de um usuário. Ele também detecta entidades em uma mensagem (isto é, conceitos ou objetos com sinônimos) e mantém o controle do estado da conversa. Você pode criar um script no serviço para gerar respostas automatizadas com base na intenção, entidades e estado de conversação atuais – tornando-o um mini-chatbot por conta própria.

É claro que existem muitos outros serviços de IA no catálogo Watson, mas vou me concentrar nesses cinco serviços como exemplos neste tutorial.

Configuração Bluemix

Antes de iniciar, você deve ter acesso ao Bluemix. Você pode se inscrever para um teste gratuito de 30 dias sem cartão de crédito requerido. Você obtém acesso a 2 GB de memória de runtime e contêiner para executar aplicativos, serviços e APIs ilimitados da IBM e suporte complementar. Essa memória deve ser suficiente para testes e projetos pessoais.

1. Depois de iniciar sessão no Bluemix, selecione um serviço do catálogo Watson para adicionar à sua conta.

2. Configurar e criar o serviço. Para cada serviço, crie uma credencial – um nome de usuário e senha – para acessar o serviço. O nome de usuário e a senha são passados para o serviço da web usando cabeçalhos HTTP.

3. As credenciais geradas automaticamente acessam o serviço Watson.

Você pode testar os web services usando ferramentas de linha de comando como curl ou usando um web-based API explorer. Neste tutorial, eu uso curl. O API explorer pode acessar web services endpoints usando uma página web interativa. Você pode construir um request e ver detalhes da resposta que é gerada pelo API explorer do Watson, conforme mostrado na figura a seguir. (Observe o nome de usuário e a senha no canto superior direito.)

Watson Conversation

Vejamos o serviço Watson Conversation. Uma de suas funções é detectar a intenção do usuário em uma mensagem, o que é útil em conversas do chatbot. O chatbot pode mapear a entrada do usuário para uma das várias “ações” que ele sabe como executar e, em seguida, dar a resposta apropriada. É a essência de fazer o chatbot parecer “inteligente”.

Nota: Se você precisar apenas de um classificador de intenção de linguagem natural, você pode usar o serviço Watson Natural Language Classifier. No entanto, o Conversation oferece muitos recursos e ferramentas úteis para o desenvolvimento do chatbot.

No painel do Conversation, clique para abrir um console web para o serviço. (Se você precisa saber como chegar ao painel do serviço Conversation, você pode seguir as instruções na Watson Developer Cloud).

Crie um workspace para o seu projeto e, em seguida, neste workspace, adicione serviços de intenção, de entidade e de diálogo. Neste exemplo, vou mostrar como funciona a intenção.

Para detectar intenções, você deve primeiro “treinar” um modelo. Você dá ao modelo algumas frases de exemplo e suas intenções. Depois que o modelo “aprende” alguns exemplos, ele é capaz de classificar novas frases. Quanto mais treinamento tiver um modelo, mais precisamente ele classificará novas frases.

Você também pode carregar um arquivo CSV para os dados de treinamento ou criar suas próprias intenções. Meus dados de treinamento estão em um arquivo CSV. A primeira coluna tem frases de exemplo e a segunda coluna tem as classificações. A seguir, estão alguns exemplos de frases de treinamento. As primeiras linhas são classificadas como “ajuda” e as últimas linhas são classificadas como “busca”.

Can you help me?,help
Please help!,help
Someone help,help
I want to know how this works,help
How does this work?,help
I would like to know why,search
Can you search for this for me?,search
I have a question,search
I'd like to ask a question,search

Na aba Intenções, introduza as suas intenções ou carregue o seu arquivo CSV, o console será preenchido com as suas intenções declaradas e exemplos de frase. Você pode ajustar as intenções e os exemplos interativamente no console web.

Depois que seu modelo estiver treinado, você pode consultá-lo com novas frases e ele fornecerá as intenções que ele pode “pensar” e o nível de confiança para cada intenção. O WORKSPACEID é o ID do modelo gerado quando criei o espaço de trabalho. É na URL do console da web quando você está dentro da área de trabalho.

curl -X POST -u "USERNAME":"PASSWORD" -H "Content-Type:application/json" -d "{\"input\": {\"text\": \"how are you\"}}" "https://gateway.watsonplatform.net/conversation/api/v1/workspaces/WORKSPACEID/message?version=2016-07-11"
 
{"input":{"text":"how are you"},
 "context":{"conversation_id":"..." ...},
 "entities":[],
 "intents":[{"intent":"hello","confidence":1}],
 "output":{"log_messages":[…],"text":[]}
}

Para tornar seu chatbot inteligente, você deve coletar continuamente inputs de usuários do mundo real, classificá-las manualmente e, em seguida, treinar seu classificador de linguagem natural ao longo do tempo (ou seja, criar vários modelos).

Watson Retrieve and Rank

No chatbot de entrega de notícias do developerWorks que eu criei como parte desta série, implantei um mecanismo de pesquisa Lucene (Hibernate Search) para indexar e pesquisar tutoriais a pedido do usuário. Ele funciona bem para encontrar conteúdo relevante de uma forma objetiva (ou seja, a frequência do termo–inverso da frequência nos documentos, ou valor tf-idf). No entanto, o problema com a pesquisa de termos e pesquisa de frequência nos documentos é que ela não reflete a preferência do usuário; ela só reflete o uso de palavras-chave de busca no corpo de documentos.

O serviço Watson Retrieve and Rank (recuperação e classificação) aborda este problema combinando um mecanismo de busca com aprendizado de máquina. Você pode classificar manualmente os resultados da busca para termos de pesquisa. Com base nesses dados, ele aprende suas preferências e é capaz de classificar os resultados para novos termos de pesquisa.

O Watson Retrieve and Rank precisa de duas coisas: um cluster Apache Solr e um classificador. O serviço usa o mecanismo de busca autônomo Apache Solr, que também é baseado no Lucene. Configurar um cluster Solr como um serviço na nuvem Watson tem aproximadamente três etapas:

  1. Crie um cluster Solr usando uma call de webservice. A call retorna um ID para o cluster que você pode usar mais tarde.
  2. Carregue os arquivos de configuração do Solr para o cluster. Os arquivos de configuração especificam o comportamento do mecanismo de pesquisa, por exemplo, quais palavras são tratadas como sinônimos, a estratégia de indexação, a filtragem e as políticas de cache do cluster.
  3. Carregue um documento JSON que contenha todos os documentos de origem a serem pesquisados. Você deve recuperar o texto de seus documentos, atribuir a cada um deles um ID e colocá-los em um arquivo JSON para ser carregado para o cluster Solr usando o webservice Watson.

Para treinar um classificador, você o trata de forma muito parecida com o modo como treina o classificador de linguagem natural. Você cria um arquivo CSV que contém perguntas que o usuário provavelmente fará, seguido por qualquer número de colunas que listam o ID do documento de resultado da pesquisa e a relevância (classificação) de cada documento. Depois que o modelo estiver treinado, você pode fazer consultas de pesquisas subsequentes. Watson tentará retornar os resultados que estiverem ordenados de acordo com sua preferência.

O processo de configuração de um cluster Solr e do classificador para o serviço Watson Retrieve and Rank é bastante complicado. Consulte a documentação do Watson para acompanhar arquivos de exemplo.

Watson Tradeoff Analytics

O serviço Watson Tradeoff Analytics pode ajudar o seu chatbot a equilibrar múltiplos fatores de decisão e a fazer recomendações aos seus usuários. Este caso de uso é muito comum. A abordagem simplista é filtrar e ordenar resultados com base na preferência do usuário ou nos critérios estabelecidos. Mas filtragem e ordenação muitas vezes dá resultados pobres porque são muito grosseiras. O serviço Tradeoff Analytics equilibra critérios conflitantes usando um algoritmo chamado Pareto Optimization.

Para usar o Tradeoff Analytics você deve entregar os fatores a serem otimizados e uma lista de opções possíveis com pontuação para cada fator. A seguir está um arquivo de entrada de dados XML de um exemplo oficial da IBM. A matriz columns contém campos (keys) que devem ser otimizados na decisão. A matriz options contém as opções para dela selecionar. Cada elemento options contém todas as keys das columns.

{
  "subject": "phones",
  "columns": [
    {
      "key": "price",
      "type": "numeric",
      "goal": "min",
      "is_objective": true,
      "full_name": "Price",
      "range": {
        "low": 0,
        "high": 400
      },
      "format": "number:2"
    },
    {
      "key": "weight",
      "type": "numeric",
      "goal": "min",
      "is_objective": true,
      "full_name": "Weight",
      "format": "number:0"
    },
    {
      "key": "brand",
      "type": "categorical",
      "goal": "min",
      "is_objective": true,
      "full_name": "Brand",
      "range": [
        "Apple",
        "HTC",
        "Samsung",
        "Sony"
      ],
      "preference": [
        "Samsung",
        "Apple",
        "HTC"
      ]
    },
    {
      "key": "rDate",
      "type": "datetime",
      "goal": "max",
      "full_name": "Release Date",
      "format": "date: 'MMM dd, yyyy'"
    }
  ],
  "options": [
    {
      "key": "1",
      "name": "Samsung Galaxy S4",
      "values": {
        "price": 249,
        "weight": 130,
        "brand": "Samsung",
        "rDate": "2013-04-29T00:00:00Z"
      }
    },
    {
      "key": "2",
      "name": "Apple iPhone 5",
      "values": {
        "price": 449,
        "weight": 112,
        "brand": "Apple",
        "rDate": "2012-09-21T00:00:00Z"
      }
    },
    {
      "key": "3",
      "name": "HTC One",
      "values": {
        "price": 299,
        "weight": 143,
        "brand": "HTC",
        "rDate": "2013-03-01T00:00:00Z"
      }
    }
  ]
}

Poste o seguinte conteúdo XML como um corpo HTTP POST para o serviço Tradeoff Analytics.

curl -X POST -u USERNAME":"PASSWORD"
--header "Content-Type: application/json"
--data @problem.json
https://gateway.watsonplatform.net/tradeoff-
analytics/api/v1/dilemmas?generate_visualization=false"

O serviço retorna uma sugestão para cada uma das opções possíveis. Seu chatbot agora pode retornar os resultados para o usuário. Neste caso, a melhor opção é options 1, que é Samsung Galaxy S4.

{
  "problem": {
    … …
    "resolution": {
    "solutions": [
      {
        "solution_ref": "1",
        "status": "FRONT"
      },
      {
        "solution_ref": "2",
        "status": "INCOMPLETE",
        "status_cause": {
          "message": "A column of a option is out of range. Option \"2\" has a value in column \"price\" which is:\"449\" while the column range is: \"[0.0,400.0]\"",
          "error_code": "RANGE_MISMATCH",
          "tokens": [
            "price",
            "449",
            "[0.0,400.0]"
          ]
        }
      },
      {
        "solution_ref": "3",
        "status": "EXCLUDED"
      }
    ]
  }
}

Watson Text to Speech

Com o serviço Watson Text to Speech seu chatbot lê em voz alta para seus usuários. Esse método é uma boa maneira de comunicar informações ao usuário quando a leitura das informações não é conveniente. Também é útil para comunicar um grande parágrafo de texto em um ambiente de mensagens móvel. No código de amostra do bot de notícias do developerWorks, eu uso o Watson Text to Speech para ler o resumo do tutorial em voz alta.

Nota: O botão “Ouça isso” está disponível apenas no aplicativo de amostra do GitHub. Não está nos aplicativos de demonstração ao vivo no Facebook Messenger e Slack.

O serviço é simples. Basta apenas fornece seu texto como um parâmetro HTTP e o serviço retorna um arquivo WAV que contém o áudio. Você pode salvar os dados WAV binários e torná-los disponíveis para o aplicativo de mensagens como um link para reprodução.

curl -X GET -u "USERNAME":"PASSWORD"
--output output.wav
"https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?accept=audio/wav&text=TEXT_TO_READ_ALOUD&voice=en-US_AllisonVoice"

No entanto, o áudio WAV é minimamente compactado e leva muito tempo para o cliente de mensagens fazer o download. Minha estratégia é passar o conteúdo do WAV por meio de um serviço de codificação de mídia baseado na web e transformá-lo em um link MP3.

No meu código de exemplo, eu escolho usar o serviço zencoder para essa finalidade. O conteúdo WAV do Watson é armazenado em cache no servidor e o link armazenado em cache é passado para o zencoder usando uma chamada de serviço da web para codificação MP3. Depois que o zencoder conclui seu trabalho de codificação, o aplicativo bot pode recuperar um link MP3 e redirecionar o usuário para lá.

Watson Speech to Text

O Watson Speech to Text transforma uma gravação de áudio de voz em texto. É útil no desenvolvimento de chatbots baseados em voz, onde o bot pode responder aos comandos de voz do usuário. Esses aplicativos de comando de voz atraem muitos usuários. A API web é simples. Você só precisa carregar o conteúdo de áudio da fala no corpo de sua solicitação de postagem HTTP.

curl -X POST -u "USERNAME":"PASSWORD"
--header "Content-Type: audio/ogg"
--data-binary @audio.ogg
"https://stream.watsonplatform.net/speech-to-text/api/v1/recognize"

Na maioria dos aplicativos de mensagens modernos, os usuários podem enviar mensagens de voz gravadas entre si. A mensagem é exibida na sessão de bate-papo como um clipe de áudio “reproduzível”. Quando o usuário envia uma mensagem de voz para um chatbot, a API envia um link MP3 do arquivo de áudio para o webhook do bot.

No bot de notícias do developerWorks, transformo o áudio em um comando de texto.

Na classe BaseServlet do meu código, eu lido com todo o processamento de voz automaticamente. Se o usuário envia uma mensagem de voz, a classe BaseServlet a transforma em texto e passa o texto para o método converse( ), que o desenvolvedor do bot implementa. Portanto, no método converse( ), você pode se concentrar em lidar com mensagens de texto.

Dependendo da sua plataforma de mensagens, você pode ter que fazer mais alguns passos. Por exemplo, a plataforma Facebook Messenger envia links de áudio de voz para um arquivo MP3. Neste caso, eu primeiro transcodifico o arquivo MP3 em um arquivo de áudio OGG, que Watson suporta e, em seguida, passo o arquivo OGG para Watson. A transcodificação é feita usando o serviço web zencoder.

Resumo

Nesta série de artigos, eu descrevi os princípios básicos e técnicas para a construção de chatbots em modernas plataformas de mensagens móveis. Os serviços cognitivos IBM Watson podem desempenhar um papel crucial ao tornar os chatbots mais inteligentes e fáceis de usar. Confira aqui o artigo sobre chatbots utilizando o Facebook Messenger.

 

***

Michael Yuan faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://www.ibm.com/developerworks/library/cc-cognitive-chatbot-watson/