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!

0
respostas

[Projeto] Faça como eu fiz: construindo um sistema especialista | Fundamentos de IA: explorando a estrutura e abordagens de sistemas inteligentes

Sistema Especialista para Diagnóstico Respiratório

class BaseDeConhecimento:
    def __init__(self):
        self.fatos = set()
        self.regras = []
    
    def adicionar_fato(self, fato):
        self.fatos.add(fato)
    
    def adicionar_regra(self, premissas, conclusao):
        self.regras.append({"premissas": set(premissas), "conclusao": conclusao})
    
    def obter_fatos(self):
        return self.fatos

class SistemaEspecialista:
    def __init__(self, base_conhecimento):
        self.base = base_conhecimento
        self.historico_inferencias = []
    
    def inferir(self):
        mudou = True
        while mudou:
            mudou = False
            for regra in self.base.regras:
                if regra["premissas"].issubset(self.base.fatos):
                    if regra["conclusao"] not in self.base.fatos:
                        self.base.adicionar_fato(regra["conclusao"])
                        self.historico_inferencias.append(
                            f"Inferência: {regra['premissas']} → {regra['conclusao']}"
                        )
                        mudou = True
    
    def obter_diagnostico(self):
        self.inferir()
        diagnosticos = [f for f in self.base.fatos if "diagnóstico" in f.lower()]
        return diagnosticos
    
    def explicar_raciocinio(self):
        return "\n".join(self.historico_inferencias)

# Configuração da Base de Conhecimento
base = BaseDeConhecimento()

# Adicionando regras de diagnóstico
base.adicionar_regra(
    ["febre alta", "tosse"],
    "diagnóstico: infecção respiratória"
)

base.adicionar_regra(
    ["diagnóstico: infecção respiratória", "dificuldade respiratória"],
    "diagnóstico: pneumonia"
)

base.adicionar_regra(
    ["febre baixa", "espirro", "nariz entupido"],
    "diagnóstico: resfriado comum"
)

base.adicionar_regra(
    ["tosse seca", "fadiga", "febre"],
    "diagnóstico: bronquite"
)

base.adicionar_regra(
    ["dificuldade respiratória", "sibilância"],
    "diagnóstico: asma"
)

# Criando Sistema Especialista
sistema = SistemaEspecialista(base)

# Teste 1: Paciente com Pneumonia
print("=== TESTE 1: Paciente com Pneumonia ===")
sistema.base.fatos.clear()
sistema.historico_inferencias.clear()
sistema.base.adicionar_fato("febre alta")
sistema.base.adicionar_fato("tosse")
sistema.base.adicionar_fato("dificuldade respiratória")

diagnosticos = sistema.obter_diagnostico()
print(f"Sintomas: febre alta, tosse, dificuldade respiratória")
print(f"Diagnósticos: {diagnosticos}")
print(f"Raciocínio:\n{sistema.explicar_raciocinio()}\n")

# Teste 2: Paciente com Resfriado
print("=== TESTE 2: Paciente com Resfriado ===")
sistema.base.fatos.clear()
sistema.historico_inferencias.clear()
sistema.base.adicionar_fato("febre baixa")
sistema.base.adicionar_fato("espirro")
sistema.base.adicionar_fato("nariz entupido")

diagnosticos = sistema.obter_diagnostico()
print(f"Sintomas: febre baixa, espirro, nariz entupido")
print(f"Diagnósticos: {diagnosticos}")
print(f"Raciocínio:\n{sistema.explicar_raciocinio()}\n")

# Teste 3: Paciente com Asma
print("=== TESTE 3: Paciente com Asma ===")
sistema.base.fatos.clear()
sistema.historico_inferencias.clear()
sistema.base.adicionar_fato("dificuldade respiratória")
sistema.base.adicionar_fato("sibilância")

diagnosticos = sistema.obter_diagnostico()
print(f"Sintomas: dificuldade respiratória, sibilância")
print(f"Diagnósticos: {diagnosticos}")
print(f"Raciocínio:\n{sistema.explicar_raciocinio()}")

Explicação:

  • BaseDeConhecimento: Armazena fatos (sintomas) e regras (relações entre sintomas e diagnósticos)
  • SistemaEspecialista: Implementa forward chaining, aplicando regras recursivamente até inferir todos os diagnósticos possíveis
  • Inferir(): Executa encadeamento para frente, adicionando conclusões quando todas as premissas são atendidas
  • Testes: Demonstram diagnósticos de pneumonia, resfriado e asma com raciocínio explícito