Fundamentos da IA e Agentes Inteligentes

por Frank de Alcantara em 16/07/2026

Fundamentos da IA e Agentes Inteligentes

Nesta série, a curiosa leitora irá construir, tijolo por tijolo, o edifício da inteligência artificial aplicada. Do agente que apenas reage ao mundo até a rede neural que aprende com ele, passando por busca, evolução, lógica e probabilidade. É uma disciplina inteira, e como toda disciplina séria, ela começa não com código, mas com definições.

Índice da Série: Inteligência Artificial Aplicada

  • 1. Fundamentos da IA e Agentes Inteligentes (Você está aqui)

Começar por definições tem um custo: a primeira aula parece a menos empolgante. Mas é a mais importante. Sem uma definição precisa de “inteligente”, qualquer discussão sobre inteligência artificial vira uma disputa de intuições, e intuições não compilam. O que faremos aqui é trocar a pergunta filosófica “as máquinas podem pensar?” — que Alan Turing considerou “sem sentido demais para merecer discussão”1 — por uma pergunta de engenharia: como construir um sistema que faça a coisa certa? A palavra “certa” é onde mora toda a matemática, e é para ela que a esforçada leitora deve olhar com atenção.

O combinado desta série é o mesmo dos Transformers: os exemplos de código eu faço em C++20 ou C++23. Depois, a leitora refaz em Python, C, JavaScript, Haskell ou qualquer linguagem que desejar. Nos laboratórios da disciplina, a implementação de referência é Python no Google Colaboratory, porque é onde a turma vai rodar tudo. Se estiver de acordo, continuamos.

1. O que é inteligência artificial

A expressão artificial intelligence nasceu em 1956, numa proposta de workshop escrita por John McCarthy, Marvin Minsky, Nathaniel Rochester e Claude Shannon para o encontro que ficou conhecido como a Conferência de Dartmouth2. A proposta era audaciosa: conjecturava-se que “todo aspecto do aprendizado, ou qualquer outra característica da inteligência, pode em princípio ser descrito com tanta precisão que uma máquina pode ser construída para simulá-lo”. Setenta anos depois, ainda estamos verificando essa conjectura, e cada artigo desta série é uma verificação parcial.

Historicamente, quem tentou definir inteligência artificial acabou em uma de quatro casas, organizadas por dois eixos. O primeiro eixo pergunta se o objetivo é reproduzir o pensamento ou o comportamento. O segundo pergunta se o padrão de sucesso é a fidelidade ao humano ou a racionalidade, entendida como fazer a coisa certa dado o que se sabe. Cruzando os dois eixos, obtemos quatro programas de pesquisa distintos.

Pensar como humano é o programa da ciência cognitiva: modelar os processos mentais de pessoas reais e comparar traços de execução do programa com traços da cognição humana. Agir como humano é o programa do teste de Turing: uma máquina é considerada inteligente se um interrogador humano, conversando por texto, não consegue distingui-la de uma pessoa. Pensar racionalmente é o programa das “leis do pensamento”, a tradição da lógica que remonta a Aristóteles, na qual raciocinar corretamente é seguir regras de inferência válidas. Agir racionalmente é o programa do agente racional: construir sistemas que, dado seu conhecimento, agem de modo a alcançar o melhor resultado esperado.

É esta última casa que a série habita, e vale explicar por quê. Os dois programas centrados no humano tornam a inteligência refém da psicologia: para saber se acertamos, precisaríamos de uma teoria completa da mente humana, que não temos. O programa das leis do pensamento é rigoroso, mas incompleto, porque nem toda ação certa decorre de uma dedução lógica; às vezes agir bem é reagir rápido, sem tempo para provar teorema algum. O programa do agente racional é mais geral que os outros três: engloba o raciocínio correto como um dos meios possíveis de agir bem, admite ação sem deliberação quando a deliberação não compensa, e — decisivo para nós — é matematicamente tratável. Podemos definir o que é agir racionalmente, medir o desempenho e otimizar. As três coisas que a engenharia exige.

A história da área é uma oscilação entre duas grandes tradições que a leitora reencontrará ao longo da série. A tradição simbólica, dominante dos anos 1950 aos anos 1980, representa conhecimento como símbolos e regras e raciocina manipulando-os; dela virão os artigos sobre busca, lógica e sistemas especialistas. A tradição conexionista, inspirada no cérebro, representa conhecimento como pesos numéricos em redes de unidades simples e aprende ajustando esses pesos; dela virá o artigo sobre redes neurais. Entre as duas, uma terceira tradição, evolucionária, toma emprestado da biologia a ideia de otimizar por seleção; dela virá o artigo sobre algoritmos genéticos. As três compartilham, na base, a mesma matemática, e mostrar isso é um dos objetivos desta série.

2. Agentes e ambientes

Fixado que nosso critério é agir racionalmente, precisamos do objeto que age. Chamamos esse objeto de agente. Um agente é qualquer coisa que percebe seu ambiente por meio de sensores e atua sobre esse ambiente por meio de atuadores. Um robô tem câmeras e motores; um agente de software tem pacotes de rede como percepções e pacotes de rede como ações; a leitora tem olhos e mãos. A definição é deliberadamente ampla, porque queremos uma teoria que valha para todos esses casos.

Precisamos agora tornar “percebe e atua” preciso. Chamamos de percepção (percept) o conteúdo que os sensores do agente entregam num dado instante. Chamamos de sequência de percepções o histórico completo de tudo que o agente já percebeu. O ponto conceitual, que a atenta leitora deve reter, é o seguinte: a ação de um agente em qualquer instante pode depender de toda a sequência de percepções observada até ali, mas não de nada que ele não tenha percebido. Formalmente, o comportamento de um agente é descrito pela sua função de agente, que mapeia cada sequência de percepções possível em uma ação:

\[f : \mathcal{P}^{*} \to \mathcal{A}\]

na qual $\mathcal{P}$ é o conjunto de percepções possíveis, $\mathcal{P}^{*}$ é o conjunto de todas as sequências finitas de percepções — a notação com asterisco é o fecho de Kleene, o conjunto de todas as cadeias finitas formadas com símbolos de $\mathcal{P}$ — e $\mathcal{A}$ é o conjunto de ações possíveis. A função de agente $f$ é um objeto matemático abstrato, em geral uma tabela infinita. O que roda de fato dentro do agente é o programa de agente, uma implementação concreta e finita de $f$. A distinção importa: a função é a especificação do comportamento; o programa é a engenharia que o realiza. Boa parte desta série é sobre programas que aproximam funções de agente boas sem precisar tabelá-las.

Para deixar de falar no abstrato, adotemos um ambiente mínimo que nos acompanhará até o fim do artigo: o mundo do aspirador. Há dois cômodos, que chamaremos de $A$ e $B$. Um agente aspirador de pó ocupa um dos cômodos a cada instante. Cada cômodo pode estar limpo ou sujo. O agente percebe apenas duas coisas: em que cômodo está e se esse cômodo está sujo. Suas ações possíveis são aspirar o cômodo atual, mover-se para a direita, mover-se para a esquerda, ou não fazer nada. É um mundo de brinquedo, e é exatamente por isso que serve: pequeno o bastante para calcularmos tudo à mão, rico o bastante para expor todas as ideias que importam.

A percepção do agente, nesse mundo, é um par: a localização e o estado de limpeza do cômodo atual, por exemplo $[A, \text{Sujo}]$. Uma função de agente possível é dada por uma regra simples: se o cômodo atual está sujo, aspire; caso contrário, mova-se para o outro cômodo. Essa regra, escrita como tabela, associa $[A,\text{Sujo}]\mapsto\text{Aspirar}$, $[A,\text{Limpo}]\mapsto\text{Direita}$, $[B,\text{Sujo}]\mapsto\text{Aspirar}$ e $[B,\text{Limpo}]\mapsto\text{Esquerda}$. Parece razoável. Mas “parecer razoável” não é um critério de engenharia. Precisamos de uma forma de decidir se essa função de agente é boa, e é aqui que a seção seguinte, a matemática do artigo, entra.

3. Racionalidade e medida de desempenho

Uma função de agente é boa se o agente que a executa faz a coisa certa. Para transformar “coisa certa” em algo mensurável, introduzimos a medida de desempenho: um critério objetivo que avalia a sequência de estados do ambiente produzida pelo comportamento do agente. Repare, e este é o primeiro ponto delicado, que a medida avalia estados do ambiente, não estados internos ou opiniões do agente sobre si mesmo. Um aspirador que se declara satisfeito com o próprio trabalho não pontua nada; um chão limpo pontua.

Para o mundo do aspirador, uma medida de desempenho natural atribui um ponto para cada cômodo limpo a cada passo de tempo. Se o agente vive por $T$ passos e denotamos por $\text{limpos}(t)$ o número de cômodos limpos após a ação do passo $t$, a medida acumulada é

\[M = \sum_{t=1}^{T} \text{limpos}(t)\]

com $\text{limpos}(t) \in {0, 1, 2}$, já que há dois cômodos. O valor máximo possível em $T$ passos é $2T$, atingível apenas por um agente que, de algum modo mágico, mantivesse os dois cômodos limpos em todos os instantes. Nenhum agente real chega lá partindo de um mundo sujo, porque limpar leva tempo; a medida, portanto, ordena agentes pela rapidez e persistência com que produzem limpeza.

A escolha da medida de desempenho é uma decisão de projeto, não um dado da natureza, e escolhas diferentes premiam agentes diferentes. A medida acima, por exemplo, é indiferente ao esforço: um agente que fica perpetuamente indo e voltando entre dois cômodos limpos pontua igual a um que para quieto, porque mover-se não suja nem limpa nada. Se quiséssemos penalizar o desperdício de energia, bastaria subtrair um custo por movimento, e veríamos os dois agentes se separarem. Voltaremos a isso no quinto exercício desta seção, no qual essa mudança de medida inverte qual agente é preferível. A lição que a atenta leitora deve levar é que projetar a medida de desempenho é projetar o que o agente vai otimizar; errar a medida é obter, com competência, o comportamento errado.

Com a medida em mãos, podemos finalmente definir o objeto central de toda a série. Um agente racional é aquele que, para cada sequência de percepções possível, seleciona uma ação que se espera que maximize sua medida de desempenho, dada a evidência fornecida pela sequência de percepções até ali e qualquer conhecimento prévio embutido no agente. A expressão “se espera que maximize” carrega peso. Ela é uma esperança matemática, um valor esperado, e é o que separa racionalidade de sorte.

Definamos o valor esperado antes de usá-lo, como manda a casa. Se uma ação $a$, tomada num estado de conhecimento, pode levar a resultados $r_1, r_2, \dots, r_n$ com probabilidades $P(r_i)$ e cada resultado tem valor $V(r_i)$ segundo a medida de desempenho, então o valor esperado da ação é

\[\mathbb{E}[a] = \sum_{i=1}^{n} P(r_i)\, V(r_i)\]

isto é, a média dos valores possíveis ponderada pelas suas probabilidades. Um agente racional escolhe a ação de maior $\mathbb{E}[a]$. Note que ele maximiza o desempenho esperado, não o desempenho realizado: a diferença entre os dois é tudo, e é a fonte de um mal-entendido que convém desarmar já.

Racionalidade não é onisciência. Um agente onisciente conheceria o resultado real de suas ações e agiria com base nele; nenhum agente do mundo físico é onisciente, porque as percepções não revelam o futuro. Um agente racional faz o melhor com a informação que tem, e a informação que tem pode ser insuficiente para evitar um mau resultado. Se a leitora atravessa a rua depois de olhar para os dois lados e ver a via livre, e uma peça de avião cai do céu e a atinge, a decisão de atravessar não foi irracional; foi racional e azarada. Racionalidade maximiza o valor esperado dado o conhecimento disponível; ela não promete o melhor resultado em cada sorteio individual. O quarto exercício desta seção formaliza exatamente essa distinção com números.

Da definição decorrem três consequências que os agentes desta série exibirão em graus variados. A primeira é que, quando o ambiente é parcialmente observável, agir racionalmente pode exigir coletar informação: às vezes a ação de maior valor esperado não é a que resolve o problema, mas a que reduz a incerteza sobre ele, como um médico que pede um exame antes de prescrever. A segunda é que um agente racional deve aprender: quando o conhecimento embutido de fábrica é incompleto ou o ambiente muda, o agente que ajusta seu comportamento à experiência supera o que repete uma tabela fixa. A terceira é que essa capacidade de aprender dá ao agente autonomia, a medida em que seu comportamento passa a depender da própria experiência e não apenas do conhecimento que o projetista lhe deu. Um agente que depende inteiramente do projetista e nada aprende é frágil; se o projetista errou, o agente erra junto, para sempre.

Antes dos exercícios, convém que a leitora experimente com as próprias mãos a relação entre função de agente e medida de desempenho. O laboratório abaixo implementa o mundo do aspirador. Escolha o tipo de agente, defina a sujeira inicial clicando nos cômodos e avance passo a passo, observando a medida de desempenho acumular. Tente responder, olhando a tela, à pergunta que os exercícios respondem no papel: qual agente pontua mais, e por quê? Experimente também o modo estocástico, no qual a sujeira reaparece com certa probabilidade, e note como isso muda qual comportamento compensa.

Exercícios resolvidos

Os cinco exercícios a seguir usam o mundo do aspirador com dois cômodos $A$ e $B$. Salvo aviso, o agente começa no cômodo $A$ e cada aritmética foi conferida programaticamente.

Exercício 1. Considere a função de agente reativa da Seção 2: se o cômodo atual está sujo, aspire; senão, se está em $A$, vá para a direita; se está em $B$, vá para a esquerda. Suponha que os dois cômodos comecem sujos e que o agente viva por oito passos. Calcule a medida de desempenho $M = \sum_{t=1}^{8}\text{limpos}(t)$, contando os cômodos limpos após a ação de cada passo.

Resolução. Rastreamos o mundo passo a passo. No passo 1, o agente está em $A$, que está sujo, então aspira; $A$ fica limpo, $B$ continua sujo, e $\text{limpos}(1)=1$. No passo 2, $A$ está limpo, então o agente vai para a direita; nada muda na limpeza, e $\text{limpos}(2)=1$. No passo 3, o agente está em $B$, que está sujo, e aspira; agora ambos limpos, $\text{limpos}(3)=2$. Do passo 4 em diante, os dois cômodos permanecem limpos, e o agente apenas oscila entre eles — direita, esquerda, direita, esquerda — sem alterar coisa alguma, de modo que $\text{limpos}(t)=2$ para $t=4,5,6,7,8$. Somando,

\[M = 1 + 1 + 2 + 2 + 2 + 2 + 2 + 2 = 14.\]

O máximo possível seria $2 \times 8 = 16$; o agente perde dois pontos porque leva os três primeiros passos para deixar tudo limpo. Repare, de passagem, na oscilação inútil a partir do passo 4: ela não custa nada sob esta medida, mas custará no Exercício 5.

Exercício 2. Um agente de entregas pode cumprir a mesma tarefa por dois planos. O plano 1 leva $t=10$ passos de tempo e gasta $e=3$ unidades de energia; o plano 2 leva $t=6$ passos e gasta $e=8$ unidades. A utilidade do agente é $U = -(\alpha\, t + \beta\, e)$, com peso de tempo $\alpha=1$ e peso de energia $\beta=2$. Ordene os dois planos e explique por que um agente puramente baseado em objetivos não os distinguiria.

Resolução. Aplicando a fórmula,

\[U_1 = -(1\cdot 10 + 2\cdot 3) = -16, \qquad U_2 = -(1\cdot 6 + 2\cdot 8) = -22.\]

Como $U_1 > U_2$, o plano 1 é preferível: apesar de mais lento, seu consumo de energia muito menor domina, dado que a energia pesa o dobro do tempo. Um agente baseado em objetivos verifica apenas se o objetivo foi alcançado; para ele, os dois planos são igualmente bons, porque ambos entregam. É a função de utilidade que introduz uma ordem de preferência entre estados que satisfazem o mesmo objetivo, e é por isso que agentes baseados em utilidade decidem onde agentes baseados em objetivos apenas dão de ombros.

Exercício 3. Um cômodo se resuja de forma estocástica: a cada passo, o agente pode aspirar a um custo de energia $c=0{,}5$ ponto. Ao perceber o cômodo, ele o encontra sujo com probabilidade $p=0{,}7$. A medida de desempenho de um passo é $1$ se o cômodo termina limpo, menos o custo de energia gasto. Compare o desempenho esperado por passo de duas políticas: a política $A$, que aspira sempre; e a política $B$, que aspira apenas quando percebe sujeira.

Resolução. A política $A$ aspira em todo passo, então o cômodo sempre termina limpo (recompensa $1$) e sempre paga o custo $c$; seu desempenho esperado por passo é

\[\mathbb{E}[A] = 1 - c = 1 - 0{,}5 = 0{,}5.\]

A política $B$ decide pela percepção. Com probabilidade $p=0{,}7$ o cômodo está sujo: ela aspira, termina limpo, ganha $1$ e paga $c$, resultando em $1-c$. Com probabilidade $1-p=0{,}3$ o cômodo já está limpo: ela não aspira, termina limpo, ganha $1$ e não paga nada. Logo,

\[\mathbb{E}[B] = p\,(1-c) + (1-p)\cdot 1 = 0{,}7\cdot 0{,}5 + 0{,}3\cdot 1 = 0{,}65.\]

Como $\mathbb{E}[B] = 0{,}65 > \mathbb{E}[A] = 0{,}5$, a política reativa é mais racional, com vantagem de $0{,}15$ ponto por passo. A diferença é exatamente a energia poupada nos passos em que o cômodo já estava limpo, $p$ vezes… não: é $(1-p)\cdot c = 0{,}3\cdot 0{,}5 = 0{,}15$, a fração de passos em que $B$ evita um gasto que $A$ faz. Perceber antes de agir compensa quando agir custa.

Exercício 4. Formalize, com valores esperados, a afirmação de que uma ação pode ser racional e ainda assim dar um resultado ruim. Um agente escolhe entre atravessar a rua agora ou esperar. Atravessar leva ao outro lado com valor $+10$ com probabilidade $0{,}999$, mas com probabilidade $0{,}001$ ocorre um acidente freak de valor $-1000$. Esperar tem valor certo $+2$. Mostre que atravessar é racional e que, ainda assim, no evento raro, foi a pior escolha em retrospecto.

Resolução. O valor esperado de atravessar é

\[\mathbb{E}[\text{atravessar}] = 0{,}999\cdot 10 + 0{,}001\cdot(-1000) = 9{,}99 - 1{,}0 = 8{,}99,\]

enquanto esperar vale $\mathbb{E}[\text{esperar}] = 2$. Como $8{,}99 > 2$, um agente racional atravessa: é a ação de maior valor esperado dada a informação disponível. Se, no entanto, o sorteio cair no evento de probabilidade $0{,}001$, o resultado realizado de atravessar é $-1000$, muito pior do que o $+2$ garantido de ter esperado. A decisão continua tendo sido racional; o que falhou não foi o raciocínio, foi a sorte. Racionalidade é uma propriedade da decisão dada a informação, não do resultado dado o acaso. Confundir as duas é o erro que leva a punir boas decisões por maus resultados, e a premiar o contrário.

Exercício 5. Compare dois agentes reativos pela média de desempenho sobre as quatro configurações iniciais de sujeira, todas equiprováveis, com o agente sempre começando em $A$. O agente oscilante é o do Exercício 1. O agente econômico aspira quando o cômodo está sujo e, quando o cômodo está limpo, não faz nada (fica parado). Agora a medida penaliza movimento: $M = \sum_{t=1}^{8}\text{limpos}(t) - 0{,}1\cdot(\text{número de movimentos})$.

Resolução. As quatro configurações são $(A,B)$ nos estados sujo/limpo: ambos sujos, só $A$ sujo, só $B$ sujo, ambos limpos. Simulando oito passos para cada agente em cada configuração e aplicando a medida penalizada, obtemos, para o agente oscilante, os desempenhos $13{,}4$, $15{,}3$, $14{,}3$ e $15{,}2$, cuja média é

\[\overline{M}_{\text{oscilante}} = \tfrac{13{,}4 + 15{,}3 + 14{,}3 + 15{,}2}{4} = 14{,}55.\]

Para o agente econômico, os desempenhos são $8{,}0$, $16{,}0$, $8{,}0$ e $16{,}0$, com média

\[\overline{M}_{\text{econômico}} = \tfrac{8{,}0 + 16{,}0 + 8{,}0 + 16{,}0}{4} = 12{,}00.\]

O agente econômico vence quando o cômodo distante já está limpo — nesses casos ele fica parado, não gasta movimento e faz o máximo de $16$ pontos. Mas ele perde feio nas duas configurações em que o cômodo distante começa sujo: como nunca se move, abandona aquele cômodo à própria sorte e pontua apenas $8$. O agente oscilante, ao patrulhar, sempre limpa os dois cômodos, e o pequeno custo de mover-se não compensa a limpeza perdida pelo econômico. Na média, o oscilante é mais racional sob esta medida. A moral, que a atenta leitora deve guardar, é dupla: economizar ação não é o mesmo que agir bem, e a resposta a “qual agente é racional?” depende inteiramente de qual medida de desempenho se adota. Troque a medida e o veredito pode se inverter.

4. A especificação PEAS

Antes de projetar um agente, é preciso especificar completamente o problema que ele resolve. A sigla PEAS, de Performance, Environment, Actuators, Sensors (desempenho, ambiente, atuadores e sensores), organiza essa especificação em quatro perguntas. Qual é a medida de desempenho? Qual é o ambiente em que o agente opera? De que atuadores ele dispõe para agir? De que sensores ele dispõe para perceber? Responder às quatro antes de escrever qualquer linha de código evita o erro clássico de construir um agente competente para o problema errado.

A tabela abaixo especifica três agentes que reaparecerão na série, do brinquedo ao realista.

Agente Desempenho (P) Ambiente (E) Atuadores (A) Sensores (S)
Aspirador Cômodos limpos por passo, menos energia Dois cômodos, sujeira Aspirar, mover, parar Localização, sensor de sujeira
Diagnóstico médico Saúde do paciente, custo, precisão Paciente, exames, histórico Perguntas, pedidos de exame, tratamento Sintomas relatados, resultados de exames
Roteador de entregas Entregas no prazo, combustível, segurança Malha de ruas, trânsito, clima Direção, aceleração, frenagem Câmeras, localização por satélite, mapa

Cada linha esconde decisões que os artigos seguintes vão detalhar. O roteador de entregas, em particular, será nosso fio condutor nos artigos sobre busca e otimização, porque encontrar o melhor caminho num mapa é o exemplo canônico de problema de busca, e distribuir várias entregas é o exemplo canônico de problema de otimização. A leitora que compreender o aspirador terá compreendido a estrutura; o que muda no roteador é a escala, não a natureza.

5. Propriedades dos ambientes

O ambiente da especificação PEAS não é um monólito; ele tem propriedades que determinam quais algoritmos são aplicáveis. Classificar o ambiente antes de escolher a técnica é o que separa a engenharia do chute. Descrevemos as seis dimensões que mais importam, cada uma com o exemplo que a torna concreta e a consequência algorítmica que ela impõe.

Um ambiente é completamente observável quando os sensores dão acesso ao estado completo relevante a cada instante, e parcialmente observável quando não. O mundo do aspirador, se o agente enxergasse os dois cômodos de uma vez, seria completamente observável; como ele só percebe o cômodo em que está, é parcialmente observável, e essa é a razão pela qual o agente econômico do Exercício 5 falha: ele não sabe se o cômodo distante está sujo. A observabilidade parcial obriga o agente a manter um estado interno que resume o histórico, e é o que motivará os agentes baseados em modelo da próxima seção.

Um ambiente é determinístico quando o próximo estado é completamente determinado pelo estado atual e pela ação do agente, e estocástico quando o resultado envolve probabilidade. O mundo do aspirador do Exercício 1 é determinístico; o do Exercício 3, no qual a sujeira reaparece com probabilidade $0{,}7$, é estocástico. Em ambientes determinísticos, o agente pode planejar uma sequência de ações confiando que ela se cumprirá; em ambientes estocásticos, ele precisa raciocinar sobre valores esperados, como fizemos, e é daí que virá a necessidade do raciocínio probabilístico dos artigos 9 e 10.

Um ambiente é episódico quando a experiência do agente se divide em episódios independentes, em que a ação de um episódio não afeta os seguintes, e sequencial quando cada decisão influencia as futuras. Classificar peças defeituosas numa esteira é episódico: cada peça é julgada por si. Jogar xadrez é sequencial: um lance ruim agora custa vinte lances adiante. Ambientes sequenciais exigem planejamento e busca no futuro; episódicos permitem decisões locais, e por isso são mais fáceis.

Um ambiente é estático quando não muda enquanto o agente delibera, e dinâmico quando o tempo corre durante a deliberação. Um quebra-cabeça sobre a mesa é estático: a leitora pode pensar o tempo que quiser. Dirigir é dinâmico: hesitar é decidir. Ambientes dinâmicos impõem prazos ao raciocínio e frequentemente forçam o agente a agir com uma resposta apenas boa, em vez de esperar pela ótima.

Um ambiente é discreto quando estados, tempo, percepções e ações formam conjuntos enumeráveis de valores distintos, e contínuo quando variam suavemente. O xadrez é discreto; a direção de um carro, com ângulo de volante e velocidade contínuos, não é. Ambientes discretos casam com busca e lógica; contínuos casam com cálculo e otimização numérica, e é por isso que redes neurais, que operam sobre números reais, brilham no contínuo.

Um ambiente é de agente único ou multiagente conforme haja ou não outras entidades cujo comportamento o agente precise modelar como agentes. O aspirador está sozinho; o roteador de entregas divide as ruas com outros motoristas que reagem às suas manobras. Ambientes multiagentes introduzem competição ou cooperação e são o terreno da busca adversarial do artigo 5, na qual o agente precisa antecipar o que um oponente racional fará.

O mundo do aspirador que usamos até aqui é, na versão do Exercício 1, parcialmente observável, determinístico, sequencial, estático, discreto e de agente único. Cada relaxamento dessas propriedades — torná-lo estocástico, multiagente, contínuo — sobe um degrau de dificuldade e convoca uma técnica diferente da série. É por isso que começamos pelo caso mais simples: não por preguiça, mas porque entender o degrau de baixo é a única forma honesta de subir os de cima.

6. Tipos de agente

Todo agente executa um programa que mapeia percepções em ações, mas a forma como esse mapeamento é organizado internamente varia, e cada forma resolve uma dificuldade que a anterior não resolvia. Há cinco arquiteturas clássicas, e a leitora deve enxergá-las como uma escada em que cada degrau paga um custo de complexidade para comprar uma capacidade nova.

O agente reativo simples escolhe a ação apenas com base na percepção atual, ignorando todo o histórico. Ele é uma tabela de regras condição-ação: se o cômodo está sujo, aspire. É o agente do Exercício 1, e sua virtude é a velocidade: nenhuma deliberação, resposta imediata. Seu defeito aparece quando a percepção atual não basta para decidir bem, o que ocorre sempre que o ambiente é parcialmente observável. O agente reativo simples é cego ao que não está vendo agora, e por isso o agente econômico do Exercício 5, um reativo simples, abandona o cômodo distante.

O agente reativo baseado em modelo corrige esse defeito mantendo um estado interno que resume a parte do histórico relevante para a decisão. Ele carrega um modelo de como o mundo evolui e de como suas ações o afetam, e usa esse modelo para estimar o estado atual mesmo sem observá-lo diretamente. Um aspirador baseado em modelo lembraria que já limpou o cômodo $B$ e não precisaria voltar para conferir. O custo dessa capacidade é manter e atualizar o estado interno a cada passo; o ganho é agir bem sob observabilidade parcial.

O agente baseado em objetivos vai além de reagir: ele conhece o objetivo que deseja alcançar e escolhe ações que o aproximem dele, o que em geral exige considerar o futuro. Saber que o cômodo $B$ está sujo não diz ao agente o que fazer; combinar essa informação com o objetivo “todos os cômodos limpos” e com um modelo do mundo, sim. É aqui que nasce a busca, tema dos próximos quatro artigos: encontrar uma sequência de ações que leve do estado atual a um estado que satisfaça o objetivo. O custo é a deliberação sobre o futuro; o ganho é flexibilidade, porque mudar o objetivo muda o comportamento sem reescrever regras.

O agente baseado em utilidade refina o anterior quando há muitos estados que satisfazem o objetivo, ou quando o objetivo pode ser atingido em graus. Ele carrega uma função de utilidade que atribui um número a cada estado, medindo o quão desejável ele é, e escolhe ações que maximizam a utilidade esperada. Foi o agente do Exercício 2: dois planos entregavam a encomenda, mas a utilidade distinguiu o melhor. O custo é dispor de uma função de utilidade bem calibrada; o ganho é decidir racionalmente entre alternativas que um agente baseado em objetivos julgaria equivalentes, e agir bem sob incerteza, ponderando probabilidade e desejabilidade.

O agente com aprendizado, por fim, não é uma quinta caixa ao lado das outras, mas um invólucro que se aplica a qualquer uma delas. Ele tem um componente de desempenho, que é o agente propriamente dito, e um componente de aprendizado, que observa os resultados e ajusta o primeiro para melhorá-lo com a experiência. É o que dá autonomia ao agente e o que torna a série inteira possível: os artigos sobre algoritmos genéticos e redes neurais são, no fundo, dois modos diferentes de construir o componente de aprendizado. O custo é a maquinaria de avaliar o próprio desempenho e alterar o próprio comportamento; o ganho é operar bem em ambientes que o projetista não conhecia por completo de antemão, que são todos os ambientes interessantes.

7. Um agente reativo em C++

Fechamos com código, como manda o combinado, para que a matemática das seções anteriores deixe de ser abstrata. O programa a seguir implementa o mundo do aspirador determinístico e o agente reativo simples do Exercício 1, e calcula a medida de desempenho pura $M=\sum_{t}\text{limpos}(t)$ ao longo de oito passos. É C++20 completo e compilável com g++ -std=c++20 -O2 aspirador.cpp -o aspirador.

#include <array>
#include <iostream>
#include <string>

// Estado do mundo: sujeira em cada comodo e posicao do agente.
struct Mundo {
    std::array<bool, 2> sujo{true, true};  // indices 0 = A, 1 = B
    int loc = 0;                           // agente comeca em A
};

// Agente reativo simples: mapeia a percepcao (loc, sujo_aqui) em uma acao.
// Acoes: "Aspirar", "Direita", "Esquerda".
std::string agente_reativo(int loc, bool sujo_aqui) {
    if (sujo_aqui) return "Aspirar";
    return (loc == 0) ? "Direita" : "Esquerda";
}

int comodos_limpos(const Mundo& m) {
    return static_cast<int>(!m.sujo[0]) + static_cast<int>(!m.sujo[1]);
}

int main() {
    Mundo m;
    int desempenho = 0;
    constexpr int passos = 8;

    for (int t = 1; t <= passos; ++t) {
        const bool sujo_aqui = m.sujo[m.loc];
        const std::string acao = agente_reativo(m.loc, sujo_aqui);

        if (acao == "Aspirar")       m.sujo[m.loc] = false;
        else if (acao == "Direita")  m.loc = 1;
        else if (acao == "Esquerda") m.loc = 0;

        desempenho += comodos_limpos(m);
        std::cout << "passo " << t << ": acao=" << acao
                  << " limpos=" << comodos_limpos(m) << '\n';
    }

    std::cout << "medida de desempenho M = " << desempenho << '\n';  // 14
    return 0;
}

A saída termina com M = 14, o número que deduzimos à mão no Exercício 1. O leitor atento vai notar que o agente e o mundo são objetos separados: o agente só recebe a percepção (loc, sujo_aqui), nunca o Mundo inteiro. Essa separação não é estética; ela é a tradução em código da observabilidade parcial da Seção 5, e mantê-la honesta é o que impede a leitora de, sem querer, escrever um agente que trapaceia olhando o estado que não deveria enxergar. Agora é a sua vez: reimplemente este mundo em Python no Colaboratory, acrescente o modo estocástico do Exercício 3 e confirme, por simulação, os valores esperados que calculamos.

8. O fim do começo

Definimos agente, ambiente, medida de desempenho e, no centro de tudo, o agente racional, aquele que maximiza o desempenho esperado dado o que sabe. Vimos que racionalidade não é onisciência nem sorte, que a medida de desempenho é uma escolha de projeto que determina o comportamento ótimo, e que a arquitetura do agente sobe uma escada de complexidade conforme o ambiente se torna parcialmente observável, estocástico, sequencial e multiagente.

Falta o principal: como um agente baseado em objetivos, de posse de um modelo do mundo, encontra a sequência de ações que o leva ao objetivo. Esse problema tem um nome, busca, e uma matemática própria, e é para ela que vamos. No próximo artigo, o espaço de estados deixa de ser um par de cômodos e vira um grafo, e o agente racional se torna um algoritmo que o percorre.

Referências

LUGER, G. F. Inteligência artificial. 6. ed. São Paulo: Pearson, 2013.

MCCARTHY, J.; MINSKY, M. L.; ROCHESTER, N.; SHANNON, C. E. A proposal for the Dartmouth summer research project on artificial intelligence. AI Magazine, v. 27, n. 4, p. 12–14, 2006 (reimpressão da proposta de 1955).

MEDEIROS, L. F. de. Inteligência artificial aplicada: uma abordagem introdutória. Curitiba: Intersaberes, 2018.

RUSSELL, S.; NORVIG, P. Artificial Intelligence: a modern approach. 4. ed. Hoboken: Pearson, 2021.

TURING, A. M. Computing machinery and intelligence. Mind, v. LIX, n. 236, p. 433–460, 1950.

WINSTON, P. H. 6.034 Artificial Intelligence. Massachusetts Institute of Technology: MIT OpenCourseWare, 2010. Disponível em: https://ocw.mit.edu/courses/6-034-artificial-intelligence-fall-2010/.

  1. TURING, A. M. Computing machinery and intelligence. Mind, v. LIX, n. 236, p. 433–460, 1950. Turing propõe substituir a pergunta “as máquinas podem pensar?” pelo jogo da imitação, hoje conhecido como teste de Turing. 

  2. MCCARTHY, J.; MINSKY, M. L.; ROCHESTER, N.; SHANNON, C. E. A proposal for the Dartmouth summer research project on artificial intelligence, 1955. Reimpresso em AI Magazine, v. 27, n. 4, 2006. É o documento que cunhou a expressão artificial intelligence

Índice da Série: Inteligência Artificial Aplicada

  • 1. Fundamentos da IA e Agentes Inteligentes (Você está aqui)

(Updated: )