Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Faça como eu fiz: construindo um sistema especialista

Variação: Sistema Dinâmico e Interativo (Chatbot Especialista)

Sistemas reais não recebem todos os fatos de uma vez. Muitas vezes, eles leem as regras e perguntam ao usuário os sintomas faltantes para tentar validar uma hipótese.

O que muda?
Se o sistema esbarrar em uma regra onde falta uma informação, ele pausa e pergunta ao paciente (via input) se ele tem aquele sintoma específico.

class SistemaEspecialistaInterativo:
    def __init__(self, base_conhecimento):
        self.base = base_conhecimento
        self.perguntas_feitas = set() # Evita fazer a mesma pergunta duas vezes

    def inferir_interativamente(self):
        print("=== INICIANDO TRIAGEM MÉDICA ===\n")
        novos_fatos = True
        
        while novos_fatos:
            novos_fatos = False
            
            for condicoes, conclusao in self.base.regras:
                # Se o diagnóstico já foi feito, pula a regra
                if conclusao in self.base.fatos:
                    continue
                
                condicoes_atendidas = True
                
                for condicao in condicoes:
                    if condicao not in self.base.fatos:
                        # Se não sabemos desse fato e ainda não perguntamos, perguntamos agora!
                        if condicao not in self.perguntas_feitas and "infecção" not in condicao: 
                            # O 'infecção' é checado para ele não perguntar diagnósticos intermediários
                            resposta = input(f"O paciente apresenta '{condicao}'? (S/N): ").strip().upper()
                            self.perguntas_feitas.add(condicao)
                            
                            if resposta == 'S':
                                self.base.fatos.append(condicao)
                            else:
                                condicoes_atendidas = False
                                break # Falhou nesta regra, vai para a próxima
                        else:
                            condicoes_atendidas = False
                            break
                            
                # Se passou por todas as condições (sendo S ou já estando na base)
                if condicoes_atendidas:
                    print(f"\n[!] DIAGNÓSTICO INFERIDO: {conclusao.upper()} [!]\n")
                    self.base.fatos.append(conclusao)
                    novos_fatos = True

# --- TESTANDO A VARIAÇÃO 2 ---
# Usando a mesma BaseDeConhecimento original do seu exemplo
base_v2 = BaseDeConhecimento() # Supondo que a classe original está importada
base_v2.adicionar_regra(["febre alta", "tosse"], "infecção respiratória")
base_v2.adicionar_regra(["infecção respiratória", "dificuldade para respirar"], "pneumonia")

sistema_v2 = SistemaEspecialistaInterativo(base_v2)
# Ao rodar, ele perguntará: "O paciente apresenta 'febre alta'? (S/N):"
# sistema_v2.inferir_interativamente()
1 resposta

Olá, Carlos. Tudo bem com você?

A ideia de transformar a solução em um sistema dinâmico e interativo aproxima bastante o exercício de situações encontradas em aplicações reais. Em vez de depender de todos os fatos previamente cadastrados, o sistema coleta novas informações durante a inferência, tornando o processo mais flexível e permitindo que o diagnóstico seja construído conforme as respostas do usuário.

A utilização do conjunto perguntas_feitas evita perguntas repetidas e contribui para uma melhor experiência durante a interação. Como sugestão de evolução, você poderia validar as respostas recebidas pelo input, aceitando apenas S ou N. Dessa forma, caso o usuário digite outro valor, o sistema pode solicitar uma nova resposta antes de continuar. Outra possibilidade seria armazenar as perguntas e respostas em um histórico, permitindo explicar posteriormente quais evidências levaram ao diagnóstico. Por exemplo, ao inferir pneumonia, o sistema poderia informar que essa conclusão foi obtida porque foram confirmados os sintomas de febre alta, tosse e dificuldade para respirar.

Na sua opinião, como esse sistema poderia ser adaptado para trabalhar com níveis de confiança nas respostas, em vez de utilizar apenas respostas binárias?

Parabéns por explorar uma solução além da proposta inicial e por compartilhar sua implementação. Continue contribuindo com suas ideias. O fórum está à disposição para acompanhar seu aprendizado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!