Pontos Principais
- Atualmente, muitas plataformas de serviço ao cliente têm incorporadas em suas funcionalidades, recursos que contam com inteligência artificial para reduzir o trabalho humano e aprimorar as experiências do usuário.
- Dados históricos de conversação tendem a aumentar exponencialmente com o tempo e colocar esses dados em um cluster do Apache Hadoop é uma solução escalável para gerenciamento e compartilhamento de dados.
- O Analytics Zoo é uma plataforma que unifica Analytics e IA(inteligência artificial) para TensorFlow, Keras e BigDL distribuídos no Apache Spark, de código aberto pela Intel.
- O Analytics Zoo fornece suporte rico para leitura e pré-processamento de dados de texto de clusters. Os usuários podem facilmente usar modelos internos para executar tarefas de processamento de linguagem natural de maneira distribuída.
- Este artigo apresenta uma abordagem para o desenvolvimento de um aplicativo de classificação de ponta a ponta de controle de qualidade usando o Analytics Zoo. Essa solução foi adotada e incorporada com sucesso na plataforma Azure, da Microsoft, para atender seus clientes.
Esta série de artigos explora práticas de desenvolvimento de uma plataforma de suporte ao cliente com IA usando o Intel Analytics Zoo no Azure, desenvolvida pela equipe da Microsoft Azure na China.
No artigo anterior, foi apresentado em detalhes a experiência de criação de um módulo de classificação de texto para lidar com as solicitações dos clientes com mais eficiência. O objetivo deste artigo é descrever outro importante módulo de IA, na nossa plataforma de serviços customizados, o QA ranker, que é utilizado para classificar e selecionar as melhores respostas de um grande conjunto de respostas candidatas no módulo QA.
A figura a seguir representa a arquitetura geral da plataforma de serviço ao cliente com o componente de Perguntas e Respostas (QA) realçado em laranja. Mais informações sobre o plano de fundo e a arquitetura da plataforma de suporte ao cliente podem ser vistas no artigo anterior.
Muitos clientes da plataforma Azure na China constantemente pedem ajuda para resolver os problemas técnicos que encontram (descritos em chinês) e frequentemente querem ter suporte em tempo hábil. Esse artigo apresenta um projeto de um módulo de QA com o objetivo de fornecer respostas mais precisas, em chinês, para as perguntas dos clientes com a menor quantidade de intervenções de agentes humanos possível. Na implementação inicial, as respostas são dadas aos usuários de acordo com fluxos de diálogo pré-definidos, assim como busca, indexação e ponderação de documentos baseados em recuperação de informações.
Infelizmente, nas fases iniciais de elucidação do problema, os resultados retornados pelo módulo QA não foram satisfatórios. Nos casos em que a pergunta de um cliente caísse em um fluxo de diálogo predefinido, a resposta fornecida provavelmente seria útil. No entanto, na maioria das vezes, o fluxo de diálogo predefinido não pôde capturar as perguntas feitas pelos clientes, e as respostas fornecidas não foram as esperadas.
Para melhorar os resultados e para uma melhor experiência do usuário, optou-se pela tentativa de usar uma tecnologia que utilizasse inteligência artificial para ajudar nessa tarefa. Abordagens que aproveitam as técnicas de PNL combinadas com deep learning são uma escolha natural e permitem treinamento incremental e evolução conforme os dados se acumulam. Assim sendo, foi adicionado um módulo de classificação e deep learning de QA com o objetivo de escolher as melhores respostas de uma lista de candidatas a respostas fornecida pelo mecanismo de pesquisa.
Foi adotado o modelo interno de correspondência de texto, fornecido pelo Analytics Zoo, e este modelo foi integrado à plataforma de serviços. Com o recém-adicionado módulo de classificação de perguntas e respostas, observou-se uma melhora significativa no desempenho de acordo com os resultados de benchmark e retorno dos clientes. Nas partes restantes deste trabalho, serão apresentadas as etapas gerais e as experiências práticas envolvidas no processo de adicionar um classificador de perguntas e respostas ao Intel Analytics Zoo.
O que é o Analytics Zoo?
O Analytics Zoo é uma plataforma analítica + IA (inteligência artificial) de código aberto desenvolvida pela Intel para processamento distribuído no Apache Spark usando TensorFlow, Keras e BigDL. A plataforma fornece, dentre outras funcionalidades, APIs de pipeline de alto nível, modelos predefinidos, modelos pré-treinados em conjuntos de dados públicos e casos de uso de referência. Com o sucesso na integração do módulo de classificador de texto com o Analytics Zoo, acredita-se que o Analytics Zoo seja uma boa escolha para esse estudo de caso, bem como para outros usuários de big data da Azure, criarem aplicativos de aprendizado avançados de ponta a ponta na própria Azure. Para uma introdução mais detalhada sobre o Analytics Zoo, consulte este artigo.
O que é o ranqueamento de perguntas e respostas (QA)?
Perguntas e respostas, ou Question Answering (QA), é um tipo comum de tarefa de Processamento de Linguagem Natural, que tenta responder automaticamente a questões colocadas por humanos em uma linguagem natural. No cenário deste artigo, a plataforma de serviço ao cliente tem uma coleção de textos de FAQ (perguntas e respostas comuns) e artigos de documentação disponíveis, como corpos de resposta, e tenta encontrar a melhor resposta relacionada desses corpos para cada pergunta do usuário. Tal problema pode ser considerado como um problema de correspondência de texto, para o qual é possível criar um modelo para prever a pontuação de relevância de uma pergunta e cada resposta candidata dentro de uma lista curta e, em seguida, classificar as respostas candidatas e retornar as que possuem pontuações mais altas para o cliente.
Semelhante à classificação de texto, o treinamento de um modelo de correspondência de texto também envolve coleta, preparação e validação de conjunto de dados de treinamento, limpeza e pré-processamento dos dados, seguido de treinamento, validação e ajuste do modelo. O Analytics Zoo fornece um modelo de correspondência de texto integrado e também disponibiliza exemplos de referência em Python e Scala que podem servir como guia para os primeiros desenvolvimentos. É possível consultar aqui as documentações mais detalhadas sobre APIs e funcionalidades de correspondência de texto.
Coleta e pré-processamento de dados
Foi mantida uma coleção de respostas e artigos candidatos limpos e organizados (todos em chinês), cada um com um ID distinto e uma coleção de perguntas do usuário (também em chinês) atribuídas com identidades distintas, coletadas de várias fontes. A partir desse cenário, utilizou-se agentes humanos que rotularam a melhor resposta para cada uma das questões e esses dados foram utilizados para treinar um modelo de correspondência de texto para classificação do FAQ.
Alguns exemplos de corpos de perguntas e respostas podem ser observados a seguir:
Observação: O conteúdo real está em chinês, nesse exemplo foi traduzido para inglês para melhor compreensão.
Para o carregamento de dados, foi utilizado a API TextSet do Analytics Zoo para carregar os corpos das perguntas e respostas no formato csv em um TextSet baseado em conjuntos de dados distribuídos resilientes (Resilient Distributed Datasets, RDD) de textos para pré-processamento distribuído, como no exemplo abaixo:
1. from zoo.common.nncontext import init_nncontext
2. from zoo.feature.text import TextSet
3.
4. sc = init_nncontext()
5. q_set = TextSet.read_csv("question_corpus.csv", sc, partition_num)
6. a_set = TextSet.read_csv("answer_corpus.csv", sc, partition_num)
Em seguida, foram criados arquivos de relação indicando a relevância entre pares de perguntas e respostas. Um par de perguntas e respostas marcadas como 1 (positivo) ou 0 (negativo) significa se a resposta corresponde ou não à pergunta. Como os dados originais rotulados têm apenas rótulos positivos, foi gerada uma coleção de amostras negativas por amostragem aleatória de todas as respostas não correspondentes para cada pergunta.
Foram criados arquivos de relação separados para treinamento, validação e testes de forma manual e semi-automática. Cada registro de relação contém um ID de pergunta, um ID de resposta e um rótulo (0 ou 1). As relações de amostra são semelhantes às apresentadas na figura abaixo:
As relações no formato CSV também podem ser facilmente lidas como um conjunto de dados distribuídos resilientes (RDD) utilizando a API, conforme o exemplo a seguir:
1. from zoo.feature.common import Relations
2.
3. train_relations = Relations.read("relation_train.csv", sc, partition_num)
4. validate_relations = Relations.read("relation_validate.csv", sc, partition_num)
Os seguintes passos de pré-processamento são bastante semelhantes aos feitos no módulo classificador de texto, no qual cada entrada precisa passar por tokenização, transformação de palavra para índice e alinhamento de seqüência. É possível consultar a seção correspondente no artigo anterior para maiores detalhes.
O TextSet do Analytics Zoo oferece operações incorporadas que auxilia e facilita a construção do pipeline de pré-processamento, porém a implementação original fornecida lida apenas com o idioma inglês. Como os dados do estudo de caso são em chinês, algumas adaptações foram feitas utilizando o jieba com tokens personalizados para quebrar sentenças chinesas em palavras. A parte do pré-processamento do código pode ser observada no exemplo de código a seguir:
1. transformed_q_set = a_set.tokenize().word2idx().shape_sequence(q_len)
2. transformed_a_set = q_set.tokenize().word2idx(existing_map=q_set.get_word_index()) \
3. .shape_sequence(a_len)
4. word_index = transformed_a_set.get_word_index()
Internamente, o procedimento acima primeiro passa pelas etapas de pré-processamento dos corpos da questão e, somente após isso, para os corpos das respostas. O pré-processamento é feito de forma semelhante para ambos os cenários, exceto pelo fato de que ele adiciona novas palavras ao mapa de índice de palavras obtido pelo corpo da questão para que ambos os corpos compartilhem o mesmo índice de palavras. As operações acima são baseadas em RDD e, portanto, podem ser facilmente escaladas e executadas em grandes conjuntos de dados de perguntas e respostas de maneira distribuída.
Definição e construção do modelo
Para o modelo de correspondência de texto, utilizou-se o modelo K-NRM integrado ao Analytics Zoo, que aproveita uma técnica de pool de kernel's para aprender a classificar de forma mais eficiente. A arquitetura do modelo K-NRM pode ser vista na figura a seguir:
A consulta de entrada e o documento primeiro passarão por uma camada de compartilhamento embarcada, que normalmente usa incorporação de palavras pré-treinadas como seus pesos iniciais. Uma camada de pontos subsequente gera então a matriz de tradução, na qual cada entrada representa a similaridade entre cada duas palavras na consulta e no documento. Os kernels RBF são usados para extrair recursos de soft-match de vários níveis, seguidos por uma camada de aprendizado para classificação, que combina esses recursos soft-TF em uma pontuação final de classificação. Para maiores detalhes é possível consultar o artigo "End-to-End Neural Ad-hoc Ranking with Kernel Pooling".
O modelo K-NRM pode ser desenvolvido utilizando a API abaixo:
1. knrm = KNRM(text1_length, text2_length, embedding_file, word_index=None,
2. train_embed=True, kernel_num=21, sigma=0.1, exact_sigma=0.001,
3. target_mode="ranking")
Esse modelo espera como entrada uma sequência de índices de pergunta junto com índices de resposta e gera uma saída com a pontuação entre eles. Os usuários precisam especificar os comprimentos da pergunta e resposta, q_len e a_len, respectivamente. Observe que, no que diz respeito à incorporação de palavras, o modelo suporta o GloVe para palavras inglesas pré-treinadas e mais uma vez, como como o estudo de caso está baseado no idioma chinês, modificações foram feitas e o FastText foi escolhido para palavras chinesas. No exemplo de código, o argumento word_index é o mapa da palavra e seu ID gerado pelo TextSet do corpo de resposta.
É possível configurar se a camada de incorporação é treinada ou não e o resultado da experiência mostra que obtemos melhor desempenho se ajustarmos ligeiramente a palavra incorporada de acordo com os resultados do conjunto de kernels. É possível também especificar quantos kernels usar e a largura de cada kernel, porém, para esse estudo de caso os parâmetros padrão se mostraram eficientes para o conjunto de dados.
Este é, na verdade, um modelo de múltiplos propósitos cujo target_mode pode ser "ranking" ou "classificação". É possível ver a documentação para mais detalhes.
Treinamento, avaliação e melhoria do modelo
Nesse momento temos todos os pré-requisitos para começar o treinamento: As relações de treinamento e validação bem como os TextSets pré-processados para os corpos de perguntas e respostas. Esses elementos são essencialmente os requisitos básicos para treinar o modelo de correspondência de texto.
O modelo pode ser treinado de duas maneiras, como o target_mode descrito acima indica. Uma forma é treinar cada registro de relação separadamente, como um problema de classificação binária no qual a saída será a probabilidade de a questão estar relacionada à resposta. A outra maneira é treinar um par de registros em conjunto, com cada par consistindo uma relação positiva (relação com o rótulo 1) e uma relação negativa (rótulo 0) da mesma questão, e otimizar a margem dentro do par. Nesse estudo de caso, ambas maneiras foram testadas e a segunda maneira se mostrou mais eficiente.
O treinamento em pares leva um par de relações da mesma pergunta como uma entrada e cada par de relações consiste em uma relação com o rótulo 1 e a outra com o rótulo 0. Para este caso, foi utilizado um componente "TimeDistributed" que está fora do modelo K-NRM, como pode ser observado a seguir:
1. from zoo.pipeline.api.keras.models import Sequential
2. from zoo.pipeline.api.keras.layers import TimeDistributed
3.
4. model = Sequential().add(TimeDistributed(knrm, input_shape=(2, q_len + a_len)))
O Analytics Zoo também fornece uma API para gerar diretamente todos os pares de relações dadas relações e corpos pré-processados, cujo resultado pode ser diretamente inserido no modelo, conforme o exemplo a seguir:
1. train_set = TextSet.from_relation_pairs(train_relations, q_set, a_set)
Em seguida, utilizou-se convenientemente a API Keras-Style para compilar e treinar o modelo K-NRM. Há uma perda do RankHinge que é especialmente fornecida para o treinamento em pares. A perda de hinge é usada para classificação de margem máxima e RankHinge é sua variância que visa maximizar a margem entre uma amostra positiva e uma negativa.
1. model.compile(optimizer=SGD(learning_rate), loss="rank_hinge")
2. model.fit(train_set, batch_size, nb_epoch)
Os parâmetros ajustáveis incluem, entre outros, o número de épocas, o tamanho do lote e a taxa de aprendizado. Os usuários também podem obter snapshots durante o treinamento e retomar o treinamento a partir desse instante em outro momento.
A avaliação de um modelo de classificação é um pouco diferente do treinamento. Basicamente, para cada questão de validação, preparamos uma resposta correta juntamente com várias respostas erradas. O objetivo dessa abordagem é classificar todas as respostas do candidato em ordem decrescente de acordo com suas pontuações de saída. Quanto maior a pontuação para aqueles com o rótulo real 1, melhor. O NDCG ou MAP são métricas comuns para avaliar as tarefas de classificação. Um exemplo de código para essa avaliação pode ser observado a seguir:
1. validate_set = TextSet.from_relation_lists(validate_relations, q_set, a_set)
2.
3. knrm.evaluate_ndcg(validate_set, k=3)
4. knrm.evaluate_map(validate_set)
É possível ver o resultado da avaliação no console de log, o NDCG e o MAP fornecem valores de 0 a 1, se as métricas forem próximas de 1, as respostas mais relacionadas devem ser consideradas mais importantes. É possível também gravar o resumo durante o treinamento e usar o Tensorboard para visualizar a curva de perda. Se as métricas forem relativamente baixas ou o modelo não estiver convergindo conforme esperado, isso indica que o desempenho do modelo não é bom o suficiente, sendo assim, necessário ajustar este modelo. Este é geralmente um processo repetitivo de verificação da qualidade dos dados, selecionando parâmetros de treinamento adequados ou ajustando os argumentos do modelo até que um resultado satisfatório seja obtido, somente após esse processo o modelo treinado pode efetivamente entrar em produção.
Publicação e utilização do modelo
Essa parte é praticamente a mesma apresentada no módulo de classificação de textos ilustrado em detalhes no artigo anterior. Utilizamos uma API Java baseada no estilo POJO para o serviço (veja aqui para mais detalhes) e como o pré-processamento de cada pergunta e resposta no classificador de QA é basicamente o mesmo do classificador de texto, esses dois módulos compartilham o mesmo código, de tal forma a facilitar a manutenção. O Analytics Zoo também fornece serviços web (incluindo classificação e recomendação de texto) e exemplos que podem ser utilizados e consultados.
À medida em que os retornos dos usuários são continuamente coletados, haverá cada vez mais relações para treinar, sendo possível assim publicar periodicamente o modelo de classificação atualizado.
Conclusão
Chegamos ao final do artigo que teve como objetivo demonstrar o processo de desenvolvimento de um módulo de classificação de FAQ na plataforma de big data da Azure usando o Intel Analytics Zoo. É possível seguir as etapas da abordagem apresentada e consultar as orientações e os exemplos fornecidos pelo Analytics Zoo e incorporar essa solução a outras soluções e outros cenários. Nas próximas séries desse artigo, apresentaremos uma experiência mais prática na construção da plataforma de serviço ao cliente.
Para obter mais informações, visite a página inicial do projeto do Analytics Zoo no Github, também é possível fazer o download e testar a imagem pré-instalada do Analytics Zoo e o BigDL disponíveis na loja virtual da Azure.
Sobre os autores
Chen Xu é engenheiro de software senior na Microsoft. É líder de projeto e desenvolvedor do Mooncake Support Chatbot AI.
Yuqing Wei é engenheira de software na Microsoft, com ênfase na plataforma de Big Data e tecnologias relacionadas. Ela contribui para o desenvolvimento do projeto Mooncake Support Chatbot AI.
Shengsheng (Shane) Huang é arquiteta de software sênior na Intel, contribuidora do Apache Spark e membra do PMC. Tem mais de dez anos de experiência em Big Data e agora atua como líder no desenvolvimento de infraestrutura e aplicativos distribuídos de deep learning no Apache Spark.
Kai Huang é engenheiro de software na Intel. Seu trabalho se concentra principalmente no desenvolvimento de frameworks de deep learning no Apache Spark e ajuda os clientes a trabalhar em soluções deep learning de ponta a ponta em em plataformas de Big Data.