Implementação de um Sistema Especialista remoto na Web utilizando Java

    Alexandre Leopoldo Gonçalves
    Jomi Fred Hübner

    Resumo

    O artigo faz uma breve introdução a Sistemas Especialistas (SEs), relata alguns de seus problemas e limitações sugerindo um protótipo distribuído utilizando a Internet. O protótipo visa implementar um SE dividido em três partes: um servidor que aceita requisições de usuários distribuídos geograficamente, resolvendo tais requisições devolvendo uma resposta, a interconexão entre cliente/servidor utilizando redes TCP/IP com o conceito de sockets e, por último, o lado do cliente que efetua consultas por meio de uma interface conhecida, a WWW.

    Palavras-chave: Sistema Especialista Distribuído, Internet, Cliente/Servidor, Sockets, Aplicação Java

    Abstract

    The article introduces Expert Systems (ES), it is showed the problems and limitations of those systems and, also, it is suggested a distributed prototype based on Internet. The prototype aim to implement an ES divided in three parts: a server that receive requisitions of geographic distributed users and solve this requisitions sending an answer, the interconection between client/server using TCP/IP networks with sockets concepts and at last the client side that realize consultation with known interface, the WWW.

    1. Introdução

    Inteligência Artificial (IA) é um campo de estudos que busca o desenvolvimento de sistemas inteligentes. Um sistema inteligente é aquele capaz de resolver problemas, que, quando resolvidos por humanos, exigem um comportamento dito inteligente [HAR 88].

    Para tornar possível a tarefa de resolver problemas de maneira inteligente, os pesquisadores de IA desenvolveram sistemas que utilizam muito conhecimento sobre alguma área específica. Estes sistemas são chamados de Sistemas Especialistas (SEs) e representam um ramo da IA aplicada que ocupa-se em desenvolver programas que usem o conhecimento simbólico para simular o comportamento de especialistas humanos [HAR 88].

    O professor Edward Feigenbaum, da Universidade de Stanford, um dos principais pesquisadores em sistemas especialistas, definiu um SE como:

    "...um programa inteligente de computador que usa conhecimento e procedimentos inferenciais, para resolver problemas que são bastante difíceis de forma a requererem, para sua solução, muita perícia humana. O conhecimento necessário para atuar a esse nível, mais os procedimentos inferenciais empregados, pode considerar-se um modelo da perícia aos melhores profissionais do ramo.

    O conhecimento de um sistema especialista consiste em fatos e heurísticas. Os fatos constituem um corpo de informação que é largamente compartilhado, publicamente disponível e geralmente aceito pelos especialistas em um campo. As heurísticas são em sua maioria privadas, regras pouco discutidas de bom discernimento (regras do raciocínio plausível, regras de boa conjectura), que caracterizam a tomada de decisão a nível de especialista na área. O nível de desempenho de um sistema especialista é função principalmente do tamanho e da qualidade do banco de conhecimento que possui [HAR 88]".

    Faigenbaum chama os que constróem Sistemas Especialistas baseados no conhecimento de "engenheiros do conhecimento" e refere-se à sua tecnologia como "engenharia do conhecimento".

    Contudo, os SEs possuem certas limitações ou enfrentam problemas tais como:

    • Fragilidade: como os SEs possuem conhecimentos altamente específico a respeito de um determinado domínio, estes não podem contar com conhecimentos mais genéricos quando surge uma necessidade;
    • Falta de Metaconhecimento: os SEs não tem conhecimento muito sofisticado ou tem dificuldade de raciocinar sobre seu próprio escopo e restrições;
    • Aquisição de Conhecimento: mesmo com o desenvolvimento de ferramentas a aquisição de conhecimento continua sendo um grande problema uma vez que transferir o conhecimento de um especialista humano para o computador nem sempre é tarefa fácil.
    • Validação: fazer uma validação ou medir o conhecimento de um SE torna-se difícil, pois é difícil quantificar o uso do conhecimento;
    • Distribuição de Usuários: na maioria dos SEs o usuário está muito ligado ao sistema não podendo utilizá-lo em qualquer lugar ou sua atualização não é dinâmica;
    • Interfaces Complicadas: as interfaces são dirigidas ao problema (geralmente sem padrão), difíceis de operar tornando-se complicadas para o usuário.

    As técnicas de IA permitem a construção de SEs onde cada parte representa uma etapa altamente independente e identificável em direção à solução de um problema ou de um conjunto de problemas [LEV 88].

    Este trabalho tem por objetivo o desenvolvimento de um protótipo de SE Distribuído tornando possível que usuários independente de sua localização tenham acesso a conhecimento especialista sobre determinado problema por meio de uma interface padronizada e bastante conhecida.

    2. Técnicas de Comunicação de Processos Distribuídos

    Os SEs promovem ampla utilização em aplicações práticas (auxílio na resolução de problemas de otimização industrial, sistemas gerenciais, sistemas financeiros etc.). Contudo deve-se procurar não só por necessidade mas também por questões de agilidade a redução de custos e tempos visando distribuir o conhecimento. Para tal é preciso levar em conta algumas características que viabilizam a implementação desses sistemas.

    Primeiramente um ambiente nativamente distribuído como a Internet que é baseado em uma interface padronizada e bastante conhecida como a World Wide Web (WWW), sendo esta a parte mais interessante da grande rede e uma importante fonte de auxílio para pesquisadores ou simplesmente usuários que desejem acesso a determina informação. A Web está baseada na Hypertext Markup Language (HTML), que é uma linguagem para confecção de páginas e no Hypertext Transfer Protocol (HTTP) [LYN 93], que é um protocolo baseado no TCP/IP [GAS 93] para acesso de informação entre sites Web. Tendo escrito uma página HTML pode-se carregar o seu resultado utilizado os chamados browsers, programas que viabilizam a navegação pela Internet bem como a carga de páginas HTML.

    Em seguida pode-se considerar uma linguagem com propriedades distribuídas possibilitando guanhos no desenvolvimento de aplicações levando-se em conta somente as características relevantes ao projeto de sistemas. A linguagem de programação Java é projetada para resolver vários problemas nas modernas práticas de programação incorporando uma série de objetos prontos, o que facilita a programação. Devido a sua arquitetura neutra, aplicações em Java são ideais para ambientes como a Internet [SUN 95].

    Java possui duas formas básicas de utilização:

    • Applet: são como programas, mas são executados por um browser tal como HotJava ou Netscape Navigator que interpretam o código Java, ou seja, o código binário que esta sendo transportado pela rede. Para que isso seja possível o documento HTML contém uma referência a uma classe Java que encontra-se no servidor e será executada na máquina cliente.
    • Aplicação: difere de um Applet por possuir a função main(). A aplicação executa como qualquer outro programa tradicional podendo estar na máquina servidora ou em uma máquina stand-alone.

    E por último deve-se considerar o meio de conexão entre o cliente e o servidor. Para que isso seja possível é necessário a implementação de sockets em redes TCP/IP (como a Intenet). Sockets são um meio de comunicação de alto nível entre aplicacões executando em uma rede (conexão entre programas clientes e programas servidores) baseados em um protocolo comum para que haja a conexão [SUN 95]. Na linguagem Java devem ser definidas as classes Sockets tanto no lado do servidor quanto no lado do cliente visando efetuar as conexões e trocas de mensagens. No lado do servidor são definidas as propriedades de conexão e gerenciamento de requisições, por exemplo, o seguinte trecho de programa

      try {
      serverSocket = new ServerSocket(10000);
      } catch (IOException e) {
      System.out.println("Não é possível escutar a porta: " + 10000 + ", " + e);
      System.exit(1);
      }

    cria um objeto "serverSocket" que recebe o número de uma porta que este deve ficar escutando. Se o servidor consegue conectar-se a porta com sucesso, este fica pronto para aceitar conexões de clientes. Após isso cria-se os objetos de recebimento e envio de mensagens.

      Socket clientSocket = null;
      try {
      clientSocket = serverSocket.accept();
      } catch (IOException e) {
      System.out.println("Falha na tentativa de conexão: " + 10000 + ", " + e);
      System.exit(1);
      }
      DataInputStream entrada = new DataInputStream(
      new BufferedInputStream(clientSocket.getInputStream()));
      PrintStream saida = new PrintStream(
      new BufferedOutputStream(clientSocket.getOutputStream(), 1024), false);
      String inputLine, outputLine;

    Tendo efetuado a conexão, o servidor fica esperando em loop por requisições de clientes até que seja finalizada a conexão.

      while ((inputLine = entrada.readLine()) != null) {
      outputLine = kkp.processInput(inputLine);
      saida.println(outputLine);
      saida.flush();
      if (outputLine.equals("fim")) break;
      }

    O loop lê as entradas do socket (pelo comando "readLine()") que são recebidas pelo objeto "entrada" onde este contém o conteúdo da string do socket. O objeto "kkp" processa as entradas devolvendo uma resposta que será mostrada pelo objeto "saida". O programa termina quando é encontrada a palavra "fim", o que provoca o fechamento de todas as entradas, saídas, o socket cliente e o socket servidor.

      os.close();
      is.close();
      clientSocket.close();
      serverSocket.close();

    Do outro lado, cria-se um objeto para que o cliente possa conversar com o servidor. Contudo para isso ser possível, o servidor tem que estar ativo, ou seja, já deve estar executando na porta especificada esperando por uma requisição de conexão do cliente, por exemplo, o seguinte trecho de programa cria um objeto "kkSocket", um objeto de recebimento e um de envio de mensagens para que seja realiza uma conexão.

      Socket kkSocket = new Socket("camboriu", 10000);
      PrintStream saida = new PrintStream(kkSocket.getOutputStream());
      DataInputStream entrada = new DataInputStream(kkSocket.getInputStream());
      StringBuffer buf = new StringBuffer(50);

    O programa cliente fica recebendo todas as mensagens vindas do servidor contidas no objeto "entrada". Caso o cliente necessite fazer novas consultas é enviada ao servidor as opções desejadas anexadas ao socket pelo objeto "saida".

      while ((fromServer = entrada.readLine()) != null) {
      if (fromServer.equals("fim")) break;
      while ((c = System.in.read()) != '\n') {
      buf.append((char)c);
      }
      saida.println(buf.toString());
      saida.flush();
      buf.setLength(0);
      }

    A comunicação termina quando é encontrado a palavra "fim" provocando a desconexão do programa cliente e o fechamento de todas as entradas, saídas e o socket.

      saida.close();
      entrada.close();
      kkSocket.close();

    3. Proposta de Sistema Especialista Distribuído

    Esta proposta visa apresentar um modelo de SE Distribuído possiblitando que usuários façam consultas de qualquer parte do mundo através da Internet. A figura 1 apresenta um diagrama da junção de tecnológias utililizadas na resolução do problema de distribuição de um SE.

    Figura 1: Sistema Especialista Distribuído.

    O modelo possui um servidor de conhecimento contendo as regras de inferências e fatos. Recebe requisições de clientes (usuários Web), realiza as interências e envia uma mensagem contendo o resultado. Do outro lado ficam os usuários que efetuam consultas ao SE por meio da Internet utilizando-se de um browser capaz de interpretar o código Java. Para que se torne possível a comunicação entre cliente e servidor utiliza-se o protocolo TCP/IP e o conceito de socket para criar um link entre o cliente e o servidor. O SE servidor executa permanentemente esperando requisições e quando o usuário deseja fazer consultas este chama o sistema pela Internet devendo efetuar a conexão que é requisitada na página Web.

    Outra alternativa de funcionamento seria implementar todo o SE como um Applet que executa somente no lado do cliente, porém isto geraria muito tráfego na rede.

    4. Estudo de Caso

    Para verificar a viabilidade de utilização do modelo proposto implementou-se um SE de teste. O sistema permite que usuários façam consultas para saber se o seguro aprova ou reprova determinado tipo de tratamento estando baseado em uma árvore de decisão simples descrita na figura 2.

    Figura 2: Árvore de decisão do protótipo.

    A implementação constituiu-se em duas etapas: implementação do cliente e implementação do servidor.

    • Cliente: baseado em um Applet (figura 3) que lê os campos para que o usuário faça suas escolhas e envia os dados para a aplicação servidora através do botão "Atualiza". Para que um Applet possa ser carregado via rede é necessário que exista uma referência embutida dentro da página HTML à classe Java compilada, bem como um browser compatível com a linguagem. O protótipo pode ser acessado em http://furb.rct-sc.br/~alex/prototipo.html;
      • Servidor: constitui-se em uma aplicação Java baseada na árvore de decisão da figura 2. A aplicação é conectada a uma porta, no caso 10000, estando pronta para receber pedidos de conexões e consultas. Feita a conexão estabelece-se um link entre o cliente e o servidor onde o cliente faz as requisições e o servidor realiza as inferências devolvendo o resultado que é visualizada pelo cliente.

    Figura 3: Applet representado a entrada de dados do Sistema Especialista.

    5. Conclusões

    Este trabalho apresenta uma proposta para resolução do problema de SEs Distribuídos na Internet por meio da integração de três tecnologias: WWW, Java e TCP/IP/sockets. O modelo foi verificado em um estudo de caso que mostrou a viabilidade da implementação desses sistemas uma vez que usuários, independente de sua localização, tem a possibilidade de obter conhecimento especializado sobre um assunto por meio de uma interface padronizada e conhecida.

    Os SEs possuem certas limitações havendo a necessidade de incorporar outras metodologias. Entre estas, podem-se citar a Inteligência Artificial Distribuída (IAD) [DEM 90], [WEI 95], [GAS 88] que está suportada na tecnologia de Agentes. Estes Agentes podem otimizar o processo de consulta e inferência a sistemas baseados em conhecimento a partir da cooperação e distribuíção de tarefas. Outra técnica que poderia ser utilizada para otimizar os SEs Distribuídos seria a lógica difusa [COX 94], [JEN 95] proporcionando a estes sistemas a capacidade de tratar dados imprecisos e qualitativos.

    Os SE bem como outras técnicas da IA promovem revoluções nas áreas de conhecimento onde são implementadas. Tais técnicas já se encontram aplicadas em sistemas industriais, engenharia de computadores, nos sistemas comerciais e na área militar. Contudo é preciso evoluir muito e a compreensão de como o ser humano pensa torna-se cada vez mais necessário para conseguir-mos respostas adequadas as crescentes necessidades da sociedade.

    6. Bibliografia

    [HAR 88] HARMON, Paul ; KING, David. Sistemas Especialistas. Rio de Janeiro: Campus, 1988.

    [GAS 93] GASPARINI, Anteu FabianoL. ; BARRELA, Francisco Eugenio. TCP/IP Solução para conectividade. 1.ed. São Paulo: Érica, 1993.

    [LYN 93] LYNCH, Daniel C. ; ROSE, Marshall T. Internet System Handbook. [s.l.]: Addison-Wesley Publishing Company, 1993.

    [SUN 95] Sun Microsystems. The Java Language : A White Paper. [s.l.]: Sun Microsystems, 1995.

    [LEV 88] LEVINE, Robert I. ; DRANG, Diane E. ; EDELSON, Barry. Inteligência Artificial e Sistemas Especialistas. São Paulo: McGraw-Hill, 1988.

    [DEM 90] DEMAZEAU, Yves; MÜLLER, Jean-Pierre (Eds). Decentralized Artificial Intelligence. vls 1,2 e 3. North-Holland : Elsevier Science Publishers, 1990.

    [WEI 95] WEISER, Mark. Intelligent Agents on the Internet: Fact, Fiction, and Forecast. IEEE Expert, V.10, No.4, p.44-49, 1995.

    [GAS 88] GASSER, Les. Distribution and Coordination of Tasks Among Intelligent Agents. In: Proceeding of the JCAI'88. Scandinavian Conference on AI. Amsterdam, Springfield, 1988.

    [COX 94] COX, Garl. The Fuzzy Systems Handbook. Massachusetts, Cambridge, :[s.l.], 1994.

    [JEN 95] JENG, Bing Chiang and LIANG, Ting-Peng. Fuzzy Indexing and Retrievel in Case-Based Systems. Expert Systems With Applications, National SunYat-sen University, Taiwan, V.8, No.1, p.135-142, 1995.