Solucionado (ver solução)

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!

Solucionado
(ver solução)
1
resposta

[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
1 resposta
solução!

Olá, Estudante! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou a base de conhecimento para estruturar sintomas com Python, utilizou muito bem o encadeamento para frente (forward chaining) para inferir diagnósticos e ainda compreendeu a importância da explicação do raciocínio para tornar o sistema especialista transparente.

Uma dica interessante para o futuro é adicionar pesos ou níveis de confiança às regras, simulando incerteza nos diagnósticos. Assim:

base.adicionar_regra(
    ["febre alta", "tosse"],
    "diagnóstico: infecção respiratória (confiança: 0.8)"
)

Isso faz o sistema refletir melhor a realidade clínica, onde sintomas não garantem 100% de certeza.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Adicionar granularidade nos sintomas: diferenciar intensidade ou duração.
  • Integrar com dados reais: usar prontuários ou bases médicas para enriquecer regras.
  • Explorar bibliotecas avançadas: como experta para sistemas especialistas ou pgmpy para redes bayesianas.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução do navegador.

Ah, uma pergunta: Você acredita que sistemas especialistas são mais eficazes em diagnósticos médicos simples com regras claras ou em cenários complexos quando combinados com modelos probabilísticos?

Abraço e bons estudos!

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