Lucas S. Vieira


Estrutura de um Agente


Construindo o primeiro agente


Guilda de IA

Recap: Semana 05

  • Python + API de LLM
  • HTTP request/response: JSON entra, JSON sai
  • O padrão universal /v1/chat/completions
  • Chat com memória: o histórico vai inteiro a cada chamada

"Python é a ferramenta. O LLM é o cérebro. A API é a ponte."

O que é um agente?

Agente = LLM + harness (estrutura para conversar)

O LLM puro só responde uma pergunta. Um agente:

  • Lembra da conversa (memória)
  • Tem personalidade (instruções)
  • Pode usar ferramentas (extensões — próxima aula!)

4 Componentes do Agente

  1. System Prompt — quem o agente é
  2. Memória (Histórico) — o que já foi dito
  3. Input — a pergunta atual
  4. Output — a resposta do modelo

O harness na mão: Dicts e Funções

def criar_agente(instrucoes, max_historico=20):
    return {
        "instrucoes": instrucoes,
        "historico": [],
        "max_historico": max_historico
    }
def conversar(agente, mensagem):
    messages = [{"role": "system",
                  "content": agente["instrucoes"]}]
    for msg in agente["historico"][-agente["max_historico"]:]:
        messages.append(msg)
    messages.append({"role": "user",
                     "content": mensagem})
    # ... chama o LLM, salva no histórico, retorna resposta

Por que estado separado?

Estado em dicionário = mais simples para iniciantes.

Funções puras são mais fáceis de testar e entender.

agente = criar_agente("Você é educado.")
conversar(agente, "Oi!")             # histórico atualiza
conversar(agente, "Lembra de mim?")  # tem contexto

O problema do histórico infinito

Se a conversa crescer demais, o prompt fica gigante.

Solução: esquecer de verdade — rotação.

def rotacionar(agente):
    # Esquece o mais antigo quando passa do limite
    limite = agente["max_historico"]
    if len(agente["historico"]) > limite:
        agente["historico"][:] = agente["historico"][-limite:]

E compactação?

  • Rotação apaga o mais antigo, mas joga fora informação
  • Na prática: compactação — LLM resume o histórico antes de enviar
  • Ajuda com lost in the middle: LLMs não recuperam bem info no meio do contexto (Liu et al., 2023)
  • Compactação precisa de ferramentas — fica pra outro dia

ReAct: Pensar e Agir

Agentes reais pensam e agem em ciclos (Yao et al., 2022)

Input → Thought → Action → Observation → Thought → Answer

Exemplo: "Quanto é 234 × 987 + 100?"

  • Thought: Preciso multiplicar
  • Action: calculadora[234 × 987]
  • Observation: 230958
  • Thought: Agora somo 100
  • Answer: 231058

Hoje: memória + instruções. Próxima aula: ferramentas!

Diagrama do Ciclo

  1. Usuário envia mensagem
  2. Agente monta prompt com histórico
  3. LLM processa
  4. Resposta salva no histórico
  5. Retorna ao usuário

De Requests para LangChain

Montar mensagens na mão funciona, mas é repetitivo.

Com requests Com LangChain
Montar dict manual ChatPromptTemplate
Gerenciar histórico manual InMemoryChatMessageHistory
Chamar API e parsear ChatOpenAI (endpoint OpenAI-compatible)
Rotação do histórico Manual aqui também
cadeia = prompt | llm  # pipe = encadeia
resultado = cadeia.invoke({"pergunta": "Oi!"})

Para lembrar

"Agente é LLM com memória e personalidade. ReAct completa o ciclo: pensar e agir."

🔴 Demo: Agente no Colab

  1. Abrir luksamuk.codes/pages/guilda-ia → Semana 06
  2. Clicar em 📓 Colab → fazer uma cópia no Drive
  3. Testar: criar agente, conversar, verificar memória
  • Vamos dar uma ferramenta para o agente
  • O ciclo ReAct se completa: Thought → Action → Observation

Para a próxima aula

  • Ter o Ollama instalado (local) — ou usar o Colab
  • Próxima aula: Primeira ferramenta! O agente ganha mão.

Perguntas?