A Inteligência Artificial (IA) é uma área que, nos últimos anos, tem estado cada vez mais presente no nosso quotidiano. A possibilidade de ter máquinas que, de certa forma, imitam o ser humano na forma de pensar e de tomar decisões, das mais simples às mais complexas, abre um mundo de possibilidades para transformar e melhorar áreas como a saúde, a agricultura, a exploração espacial, o desporto, a indústria automóvel e outras.
Embora ainda não nos seja completamente óbvio, a IA já está muito presente no nosso dia a dia. Por exemplo, as redes sociais usam os chamados sistemas de recomendação que, em suma, priorizam o conteúdo que acreditam que o utilizador vai preferir. A decisão de apresentar determinado tipo de conteúdo a um utilizador específico tem em conta os seus dados pessoais (idade, sexo, etc.) e as interações que este tem com os diferentes conteúdos da plataforma. Além das redes sociais, os assistentes pessoais (por exemplo, Google Assistant, Siri, Alexa), smartphones, carros e muitos outros, já possuem alguma forma de IA incorporada neles. A presença da IA nas nossas vidas continuará a crescer à medida que vamos entendendo melhor o seu funcionamento e de que maneira a podemos aplicar aos diferentes cenários.
Quer se trate de um chatbot, reconhecimento ótico de caracteres (OCR), análise de texto, reconhecimento facial ou qualquer outro tipo de tarefa de IA, verificamos uma procura crescente destas funcionalidades de IA nas soluções que os nossos clientes nos pedem para criar, à medida que estes se tornam mais cientes da IA em geral e dos benefícios que esta pode trazer aos seus negócios. Com isto em mente, dedicámos parte do tempo que temos de autoaprendizagem durante a semana, para desenvolver um framework que pudesse resolver algumas das tarefas de IA, para poderem ser facilmente implementadas em vários projetos.
Neste artigo, vamos partilhar o nosso progresso, como abordámos o desenvolvimento deste framework, que tecnologias utilizámos, as tarefas que queríamos que o framework resolvesse, que conceitos aprendemos e que dificuldades encontramos ao longo do caminho.
Antes de começarmos a desenvolver o framework, foi necessário decidir as tarefas que queríamos que esta resolvesse nesta primeira fase, criar uma arquitetura e escolher as tecnologias a serem utilizadas para o seu desenvolvimento. Em termos de tarefas, decidimos que o framework deveria conseguir extrair entidades e intenções de qualquer texto e realizar manutenção preditiva. A decisão de extrair entidades e intenções é justificada pelo facto de ser uma das tarefas dentro de Robotic Process Automation (RPA). Basicamente, RPA consiste em software que pode ser facilmente programado para realizar atividades rotineiras, atualmente realizadas por humanos, de forma controlada, flexível e escalável. Esta tecnologia alivia os colaboradores de terem de realizar tarefas repetitivas e propensas a erros, e permite que estes se concentrem em tarefas com maior significado e importância, o que, em última instância, ajuda as organizações a serem mais produtivas e eficientes. A decisão de incluir a manutenção preditiva na fase inicial do framework prende-se com o facto de, atualmente, existirem vários equipamentos constituídos por inúmeros sensores, capazes de fornecerem dados necessários para determinar quando é que um determinado equipamento precisa de manutenção, para evitar futuras falhas.
Para compreender melhor estas duas tarefas e ter uma melhor ideia de como as resolver, tivemos que aprofundar e explorar algumas das abordagens mais utilizadas pela comunidade. A extração de entidades e de intenções é um subcampo do processamento de linguagem natural (PLN), um ramo da inteligência artificial cujo principal objetivo é dar aos computadores a capacidade de entender texto e diálogo de forma semelhante aos humanos. Para resolver tarefas relacionadas ao PLN, deparámo-nos com os seguintes conceitos e abordagens:
(Exemplo de word embedding)
(Arquitetura Transformer)
A manutenção preditiva combina a ciência dos dados e análise preditiva para prever falhas num determinado equipamento, para poder ser planeada manutenção corretiva antes do ponto de falha. O objetivo é agendar a manutenção no momento mais conveniente e rentável, de modo a maximizar a vida útil do equipamento. A manutenção preditiva pode ser feita de duas formas: Classificação e Regressão. No primeiro método, tenta-se prever se uma falha é iminente nas próximas N etapas, e no segundo, tenta-se prever quanto tempo falta até a próxima falha.
Para resolver problemas de manutenção preditiva, é possível utilizar algoritmos de machine learning mais clássicos, como Support Vector Machine (SVM) ou K-Nearest Neighbors (k-NN ou KNN), ou pode-se seguir a rota do Deep Learning e utilizar auto-encoders, recurrent neural networks (RNN) ou redes long short-term memory (LSTM). Para lhe dar um pouco mais de contexto, fizemos um breve resumo de como funcionam os algoritmos anteriormente mencionados.
(Overview de um modelo Auto-encoder)
(Estrutura de uma rede LSTM)
Quanto à implementação do framework, determinámos que a melhor abordagem seria abstrair a utilização das bibliotecas open source de machine learning mais comuns. Com esta abordagem, podemos rapidamente acrescentar novos problemas para resolver e podemos optar por utilizar qualquer biblioteca sem termos que nos comprometer com uma específica. Isto foi alcançado através da criação de uma interface comum que pode ser utilizada por qualquer biblioteca, de forma que esta se comporte sempre da mesma forma, independentemente do problema que está a ser resolvido.
Com isto em mente, o diagrama seguinte mostra a arquitetura adotada:
O ProblemSolver é a classe principal e o ponto de entrada através do qual o programador interage com a ferramenta. Este terá que passar o problema que está a tentar resolver, os dados a serem usados e o formato dos mesmos. Internamente, os dados são convertidos num dataframe Pandas que depois é utilizado pela implementação concreta do ProblemInterface e que define as características de um problema. Para cada tipo de problema, é possível treinar um modelo personalizado, que será atribuído um ID e guardado em disco no formato pickle, ou é possível fazer uma previsão através de um modelo já existente em disco.
Os problemas que o framework resolve atualmente são:
Em termos de tecnologias, decidimos utilizar Python para o desenvolvimento do nosso framework, uma vez que é uma das linguagens de programação mais utilizadas e é frequentemente utilizada para tarefas de machine e deep learning.
Além do Python, para a tarefa de extração de entidades utilizámos o Spacy, uma biblioteca de open source, amplamente utilizada e orientada para problemas de PLN, que tem uma particularidade bastante relevante e que não é muito comum noutras bibliotecas desta tipologia: o suporte da língua portuguesa. Para as tarefas de classificação binária e regressão, utilizámos o Pycaret, outra biblioteca open source e amplamente utilizada, que contém vários módulos para resolver tarefas no domínio da classificação, regressão, PLN, deteção de anomalias e muitos outras.
Como mencionado anteriormente, queríamos ter a liberdade de poder utilizar várias bibliotecas, já que algumas são mais adequadas para um tipo de tarefa do que outras, e também queríamos que a interação dos programadores com o framework fosse o mais fácil e direta possível. Como as implementações concretas do framework estão sempre por detrás da camada de abstração proposta, os programadores não precisarão de se preocupar com futuras atualizações dessas implementações e poderão facilmente integrar novas implementações, pois estas seguirão sempre a camada de abstração.
É importante destacar que o framework em questão está pronta para fornecer soluções úteis aos nossos clientes, no entanto, o seu desenvolvimento está longe de estar concluído. Pretendemos continuar a melhorar o framework, de modo a englobar outras das tarefas de machine learning mais relevantes, para que depois possam ser rapidamente incorporadas nos produtos dos nossos clientes. Relativamente ao futuro, pretendemos acrescentar novas tarefas a serem resolvidas, tais como OCR, classificação de imagens, deteção de objetos, tracking de objetos, e melhorar os resultados obtidos nas tarefas mencionadas ao longo deste artigo. Não perca os próximos artigos referentes às atualizações deste framework!