USO DE SISTEMA ESPECIALISTA PARA DECISÃO DO PERFIL DE UM INVESTIDOR VIA WEB Marcela Gonçalves Pazo Daniela Pasotto [email protected] [email protected] Silvana Vicente Lobão Rogério de Oliveira [email protected] [email protected] Faculdade de Computação e Informática Universidade Presbiteriana Mackenzie R. da Consolacão, 895 - Prédio 13 01302-907, São Paulo, SP - Brasil RESUMO Ainda existe uma forte resistência ao uso de sistemas especialistas em sistemas comerciais, seja pela falta de conhecimento por parte dos fornecedores de aplicações, seja pela falta de ferramentas e soluções, em contraposição a um amplo suporte às técnicas tradicionais de desenvolvimento. Este estudo explora o uso de uma ferramenta de construção de sistemas especialistas (o Jess) no desenvolvimento de um aplicativo para decisão do perfil de investidor do usuário (conservador, moderado ou agressivo) mostrando alternativas de como essa ferramenta pode ser facilmente integrada a técnicas amplamente utilizadas no desenvolvimento de aplicações comerciais (Java e tecnologias Web), agregando vantagens ao desenvolvimento e permitindo superar algumas das limitações da programação tradicional. Palavras-chave: sistemas especialistas, Java, aquisição do conhecimento, IA. ABSTRACT Commercial systems have still been avoid to use expert system, either for the lack of knowledge by the applications suppliers, either for the lack of tools and solutions, in contraposition to a large number of the traditional techniques and tools to develop standard applications. This study investigates the use of a tool for build expert systems (the Jess, a expert system shell) in the development of an application that decides the user’s investor financial skill (conservative, moderate or aggressive). It shows alternatives of how this tool can be integrated to the most common and up to date techniques have been used in development of commercial systems (such as Java and Web technologies), adding advantages and allowing to surpass some limitations of the traditional programming. Keywords: expert systems, Java, knowledge acquisition, IA. 1 1 Introdução Sistemas especialistas e técnicas de inteligência artificial em geral, não obstante os resultados que possam proporcionar, ainda são utilizados de forma bastante modesta em aplicativos comerciais quando comparado o uso em outras áreas (controle, bio-medicina, sistemas de suporte a decisão, diagnóstico de falhas, planejamento etc.) e frente às inúmeras soluções de suporte ao desenvolvimento tradicional (LIU, 2000). De fato os modelos de engenharia de software tradicionais e modelos de dados e processos, só recentemente contemplam soluções como aquisição e representação do conhecimento, ou mecanismos de inferência ou lógica difusa (CARLSON, 1998), (ABULSOROUR,2003). Este estudo procura mostrar a viabilidade e as vantagens do uso de sistemas especialistas no desenvolvimento de aplicações comerciais, como processamento de operações de venda, aplicações financeiras e controle de processos no setor de serviços. Para isso utilizamos um shell para construção de sistemas especialistas baseados em regras, o Jess (FRIEDMAN-HILL, 2002), que permite uma fácil integração das tecnologias atuais de desenvolvimento de aplicações (aplicações Web, e as diversas tecnologias Java como Javabeans e Servlets – ver (DEITEL, 2000)). Como aplicação dessa arquitetura optamos pelo desenvolvimento de um aplicativo que permite definir o perfil de investidor do usuário. Essa aplicação apresenta duas características que a tornam bastante adequada ao nosso propósito: por um lado pode ser encontrada em inúmeros aplicativos e sites comerciais, como os de bancos, corretoras de valores e sites consultoria de investimentos; por outro permite explorar algumas limitações da programação e desenvolvimento tradicionais que podem ser adequadamente endereçadas por sistemas especialistas baseados em regras, como diferentes graus de confiança das informações. 2 Descrição do modelo Jess (Java Expert System Shell) é um “script shell” para construção de sistemas especialistas baseados em regras inteiramente desenvolvido em Java (FRIEDMAN-HILL, 2002). Originalmente baseado na linguagem CLIPS (RILEY, 2002), o Jess ainda mantêm grande compatibilidade com a linguagem CLIPS, mas adiciona uma série de facilidades. Entre elas o Jess integra a linguagem de scripts, a base de conhecimento e sua máquina de inferência ao 2 ambiente Java e suas tecnologias, como J2EE, Javabeans e padrões de projeto (“java patterns”) (ABULSOROUR, 2003), (DEITEL, 2000). Isso permite o surgimento de diversas extensões do Jess, como a integração com pacotes de lógica difusa (“fuzzy”) e com outras tecnologias relacionadas ao ambiente Java como o JDBC e o XML, que fornecem mecanismos adicionais para o armazenamento da base de conhecimento (ABULSOROUR, 2003) (FRIEDMAN-HILL, 2002). O Java é uma linguagem orientada a objetos que vem se constituindo em um padrão aberto de linguagem para o desenvolvimento de aplicações web. Grande parte dos sistemas especialistas foram construídos usando técnicas convencionais de programação estruturada (LIU, 2000). Não obstante esse sucesso, as técnicas de orientação a objeto mostram-se mais flexíveis e naturais para o desenvolvimento, sobretudo de aplicações complexas, contexto em que encontram-se os sistemas especialistas. Desse modo, a modelagem orientada a objetos, mais próxima de como percebemos o mundo real, também parece mais adequada para o desenvolvimento de sistemas especialistas em que o sistema parece “agir” como um humano especialista (LIU, 2000). 2.1 Integrando o sistema especialista a uma aplicação Aplicações em Jess podem ser desenvolvidas de diferentes maneiras (CARLSON, 1998) (FRIEDMAN-HILL, 2002): 1. Podem ser desenvolvidas fazendo uso de scripts na linguagem Jess, executados sem o uso de código Java (scripts em grande parte compatíveis com a linguagem CLIPS) ou contendo diferentes níveis de código Java (APIs, código Java customizado e scripts sob a classe main fornecida pelo Jess). 2. Usando uma classe Java que carrega em tempo de execução scripts na linguagem Jess. 3. Ou, utilizando unicamente classes em Java que interagem com as APIs Java do pacote Jess. Avaliadas essas três opções verificamos que a opção (2) é a mais adequada para o desenvolvimento de um protótipo de aplicação comercial. A opção (1) apresenta a limitação de restringir-se ao uso limitado de uma linguagem de scripts; a opção (3), seria uma alternativa bastante adequada, mas, na presente versão do Jess não suporta todas as suas funcionalidades do 3 pacote (FRIEDMAN-HILL, 2002); a opção (2), por outro lado permite o uso de todos os recursos proporcionados pelo ambiente Java (“multithread”, “applets”, componentes e outros) e o acesso completo às funcionalidades do Jess. Essa opção basicamente consiste em carregarmos através de uma classe Java um script em linguagem Jess residente em um “flat file”. Esse arquivo contém a base de conhecimento e regras que compõem a parte “especialista” de nosso sistema. Toda parte de interface com o usuário, como uma interface web ou interfaces gráficas; lógica adicional da aplicação, como consistência de dados, controle de fluxo da aplicação e acesso a outros objetos; e interfaces, como acesso à banco de dados; podem ser manipuladas pelo código Java da aplicação. O código abaixo apresenta os principais itens dessa forma de implementação em um aplicativo Java. public static void main(String[] argv) throws JessException { Rete rete = new Rete(); // Carrega regras para o algoritmo Rete rete.executeCommand("(Regras.clp)"); rete.executeCommand("(reset)"); // Cria e instancia Beans ... // Carrega contexto (Beans) Funcall f = new Funcall("definstance", rete); f.add(new Value(<values>, RU.ATOM)); f.add(new Value(<bean>)); ... // Submete contexto a máquina de inferência f.execute(rete.getGlobalContext()); while (<bean>.isIntact()) rete.executeCommand("(run)"); } } O Jess utiliza-se da tecnologia de “beans” (componentes Javabeans) para permitir que as regras tenham acesso aos métodos Get()/Set() das instâncias beans como simples propriedades dos objetos (ABULSOROUR, 2003). Assim as propriedades são lidas e alteradas pela máquina de inferência do Jess. O padrão JavaBeans ainda possibilita que as modificações 4 nas propriedades sejam automaticamente notificadas para a máquina de inferência quando ocorrem. 2.2 Regras para definição do perfil de um investidor Desenvolvemos uma aplicação com o objetivo definir o perfil de investidor de um usuário entre 3 categorias: conservador, moderado e agressivo. Um investidor conservador é aquele que não está disposto a correr riscos e a aplicar dinheiro em investimentos com grande oscilação, ou ainda, sua atual situação não permite investimentos que envolvam altos riscos e que possam comprometer o capital investido. Um investidor moderado está disposto a correr um risco um risco um pouco mais elevado para obter uma rentabilidade maior, está propenso a aplicar uma parcela significativa do dinheiro em investimentos que oscilam muito destinando, o restante, para aplicações mais seguras. Por último o investidor agressivo está disposto a correr riscos para conseguir a máxima rentabilidade, está propenso a investir a maior parte de seu dinheiro em aplicações que apresentam grande oscilação e a destinar uma parcela mínima para aplicações mais seguras que preservem o capital investido. Os especialistas buscam propor as opções de investimento mais adequadas ao perfil de um dado cliente buscando garantir a satisfação do investidor no que se refere à rentabilidade e à proteção do capital desejada. Para isso desenvolveram uma série de regras que permitem definir o perfil do investidor através de seu histórico de investimentos, dados pessoais, intenção do investimento e informações de receita e capital. Essas informações como aplicações anteriores e satisfação com o retorno obtido (histórico de investimentos), idade, tipo de profissão, tempo de retorno esperado de uma aplicação (intenção do investimento), renda e bens do usuário influenciam diferentemente na definição do perfil do investidor, o qual ainda pode variar ao longo tempo com o histórico do cliente. Essas regras constituem o material para a construção da base de conhecimento da nossa aplicação. Para a montagem das regras e fatos da base de conhecimento adotamos uma abordagem bastante prática baseada em diferentes sites que buscam auxiliar o usuário na definição de seu perfil de investidor, os quais possuem uma série de questões e esclarecimentos para o investidor. 5 2.3 Estrutura de base de conhecimento Para o desenvolvimento da base de conhecimento utilizamos um shell de sistema especialista, o JESS (Java Expert System Shell). A máquina de inferência do JESS implementa um algoritmo Rete (RUSSELL, 1995) que permite grande eficiência no processamento de regras pelo sistema. Sua máquina de inferência suporta tanto o encadeamento para trás (backward chaining) como o encadeamento de regras para frente (foreward chaining) (CHUN, 2001). O encadeamento para trás é o mais empregado e destaca-se como mais intuitivo para o desenvolvedor, sendo a sua base o mecanismo de recursão (CHUN, 2001). Neste trabalho empregamos essa forma de encadeamento sendo a mais adequada para problemas de classe de interpretação. A estrutura básica da aplicação é uma base de conhecimento que armazena um conjunto de regras, fatos e heurísticas que juntos correspondem ao conhecimento do especialista no domínio sobre o qual foi construído o sistema. O motor de inferência é responsável pelo processamento do conhecimento. De forma geral, podemos afirmar que o processo permite tirar conclusões a partir do conhecimento armazenado, explorando o encadeamento lógico existente na base de conhecimento. Jess usuário Interface do Usuário Interface de programação JAVA Máquina De Inferência Base de Conhecimento Figura 1: Estrutura do sistema especialista. 6 O encadeamento é realizado a partir de diversas questões feitas para o usuário. Nossa construção permite que a interface com o usuário e a base de conhecimento sejam independentes garantindo a flexibilidade da aplicação. As respostas fornecidas criam novos fatos na base de conhecimento que permitirão deduzir o perfil de investidor do usuário. A figura 1 mostra de forma esquemática essa estrutura. Iniciamos a construção da base de conhecimento criando templates que são estruturas para inserção de dados na base no Jess. O templates funcionam como a definição de classes em um linguagem orientada a objetos onde as variáveis os slots representam as variáveis de instância da classe. Abaixo a definição dos templates usuariorenda e usuariograusatisfacao utilizados na aplicação para armazenar dados do usuário e sua satisfação com investimentos anteriores: ;; define dados do usuário (deftemplate usuariorenda (slot estadocivil) (slot dependentes) (slot divida) ) ;; define satisfação do usuário com investimentos anteriores (deftemplate usuariograusatisfacao (slot grau (type integer)) ) As perguntas feitas ao usuário são implementadas com o conceito de regras, essas regras são definidas no Jess por uma estrutura chamada defrule. Uma regra “dispara” as instruções à direita da regra (após =>) conforme são satisfeitas as condições do lado esquerdo (anterior a =>). Abaixo uma implementação simples de regra na forma de script shell para o controle de fluxo das questões ao usuário. ;; verifica satisfação do usuário com investimentos anteriores (defrule R0 (usuarioinvestimento (investiu sim)) => (printout t "7. Forneça o grau de satisfacao (0-100) em investimentos anteriores" (bind ?leitura (read)) 7 (if (and(>= ?leitura 1)(<= ?leitura 33)) then (bind ?alternativa7 1/33) else (if (and (>= ?leitura 34)(<= ?leitura 66)) then (bind ?alternativa7 34/66) else (bind ?alternativa7 67/100) ) ) (assert (usuariograusatisfacao (grau ?alternativa7))) (printout t crlf crlf)) À medida que o usuário entra com os dados no aplicativo um conjunto de cerca de 30 regras são verificadas fazendo as asserções necessárias e criando novos fatos na base de conhecimento. ;; regras para inferência (defrule R1 ;; dados pessoais (usuariorenda (estadocivil casado) (dependentes possui) (divida comdivida)) => (assert (caracteristicasrenda (renda rendacomprometida)))) ... (defrule R28 ;; tolerância a risco e investimentos anteriores (usuariotolerancia (tipo naotolerante)) (usuarioinvestimento (investiu nao)) => (assert (usuariograusatisfacao (grau 0))) (assert (perfil conservador)))) ... Cada regra possui do lado esquerdo a => um fato do tipo (<template> [ ( <slot> , <valor> ]). Esses fatos verificados o sistema adiciona novos fatos na base na forma (assert (<template> [ ( <slot> , <valor> ])). Completada a inserção dos fatos do usuário na base e realizada a verificação das alternativas segundo as regras fornecidas pelo especialista, o aplicativo retorna como resultado o perfil de investimento mais adequado ao usuário. Abaixo o retorno final via shell script: 8 ;; resultado final (defrule FinalRule (perfil moderado) ;; perfil moderado => (printout t crlf crlf) (printout t ?*nome* crlf crlf) (printout t "Seu perfil é MODERADO" crlf crlf) (printout t "Este e o perfil de quem esta disposto a correr pouco risco sendo recomendável ... ... 3 Resultados e discussão O uso de um shell de sistemas especialistas integrada a linguagem de desenvolvimento de aplicações permitiu separarmos, adequadamente, a construção e uso da base de conhecimento da interface de programação, comunicação e demais porções do sistema. Isso possibilita que a base de conhecimento possa ser estendida, modificada ou mesmo substituída sem alterações das demais partes do sistema. A mesma flexibilidade, proporcionada à interface com usuário, permitiria o uso da mesma base de conhecimento por múltiplas aplicações e vemos, nessa possibilidade, uma grande vantagem no reuso de regras e fatos, à exemplo do reuso de objetos. Além disso o Jess, diferentemente de outros script shells, fornece suporte mais amplo às funções de linguagem de programação. Essa característica parece bastante importante para a maior popularização do uso de sistemas especialistas em aplicações comerciais pois facilita o trabalho do programador em diversas tarefas, como a entrada e saída de dados e a manipulação tradicional de dados, permitindo ainda a adoção de soluções de programação tradicional quando requeridas. Desse modo acreditamos ter agregado vantagens ao desenvolvimento e superado algumas das limitações da programação tradicional. Trabalhos futuros podem buscar o aprimoramento da independência da máquina de inferência utilizada com relação às demais porções do aplicativo, empregando tecnologias de componentes e representações do conhecimento baseadas padrões abertos como o XML e sua extensões, e provendo formas mais adequadas de armazenamento de regras e fatos. Também podem ser explorado estender a aplicação para suportar fatores de confiança aos fatos da base de conhecimento tornando o sistema apto a operar com lógica difusa (fuzzy). 9 5 Referências bibliográficas LIU, Q., CHENG, S., Object-oriented methods drive protective relay system, em IEEE Computer Applications on Power, janeiro, 2000;33—37. FRIEDMAN-HILL, E.J., Jess, The expert system shell for the Java platform. Disponível em: <http://herzberg.ca.sandia.gov/jess/>. Acesso em: outubro, 2002. DEITEL, H.M., DEITEL, P.J., Java: How to program. Prentice-Hall: 2000. RILEY, G., What is CLIPS? Disponível em: <http://www.ghg.net/clips/CLIPS.html >. Acesso em: outubro, 2002. ABULSOROUR, A., VISVESWARAN, S., Business process automation made easy with Java em JavaWorld Part 1: Implement business rule engines in a J2EE enterprise (Setembro) Part 2: Design options for rule engine integration (Outubro). Disponível em: < http://www.javaworld.com/>. Acesso em: março, 2003. CARLSON, D., Rules and web-object systems, em Object Magazine, junho, 1998. RUSSELL, S., NORVING, P., Artificial intelligence: A modern approach. Prentice-Hall: 1995. CHUN, I-G., HONG, I-S., The implementation of knowledge-based recommender system for eletronic commerce using Java expert system library. Proceedings in IEEE International Symposium on Industrial Electronics, 2001;1766—1770. 10