MÓDULO 3.3

💬 AutoGen / AG2

Agentes que se comunicam por conversação, executam código real em sandbox e se criticam mutuamente para melhorar a qualidade. O framework ideal para pesquisa, geração de código e workflows emergentes.

6
Tópicos
40
Minutos
Inter.
Nível
Código
Tipo
1

🗣️ Filosofia conversacional: fluxo que emerge

AutoGen (agora AG2) parte de uma premissa diferente: ao invés de definir um grafo de estado ou uma equipe estruturada, o fluxo emerge da conversa. Agentes trocam mensagens, e o progresso acontece naturalmente — como uma equipe de pessoas resolvendo um problema juntas.

🧭 Três paradigmas comparados

LangGraph

Grafo explícito de estados. Você projeta cada transição. Controle máximo, mais código.

CrewAI

Equipe com papéis e tasks definidas. Colaboração estruturada com contexto compartilhado.

AutoGen

Conversa entre agentes. Fluxo emergente. Execução de código real. Reflexão mútua.

💡 Quando a conversa vence o grafo

  • Pesquisa exploratória: o agente não sabe quantas iterações precisará — a conversa determina
  • Code gen iterativo: gera código → executa → vê erro → corrige → repete até funcionar
  • Debates e revisão: múltiplas perspectivas que emergem naturalmente da troca de mensagens
2

🤝 AssistantAgent e UserProxyAgent

O par fundamental do AutoGen: AssistantAgent usa um LLM para raciocinar e gerar código, enquanto UserProxyAgent pode executar esse código localmente e simular o papel do usuário. Juntos, formam um loop de geração-execução-feedback totalmente automático.

⚙️ O par básico em ação

import autogen

# Configuração do LLM
config_list = [{"model": "gpt-4o", "api_key": "sk-..."}]
llm_config = {"config_list": config_list, "cache_seed": 42}

# AssistantAgent: usa LLM, gera respostas e código
assistente = autogen.AssistantAgent(
    name="Cientista_de_Dados",
    llm_config=llm_config,
    system_message="""Você é um cientista de dados experiente.
    Quando solicitado, escreva código Python comentado e executável.
    Sempre encerre com 'TERMINATE' quando a tarefa estiver completa."""
)

# UserProxyAgent: executa código, simula usuário
executor = autogen.UserProxyAgent(
    name="Executor",
    human_input_mode="NEVER",  # sem intervenção humana
    max_consecutive_auto_reply=10,
    is_termination_msg=lambda x: "TERMINATE" in x.get("content", ""),
    code_execution_config={
        "work_dir": "workspace",    # diretório de execução
        "use_docker": False,        # True para sandbox Docker
        "timeout": 120,             # timeout em segundos
        "last_n_messages": 3        # contexto de mensagens
    }
)

# Inicia a conversa — o loop acontece automaticamente
executor.initiate_chat(
    assistente,
    message="Analise o arquivo sales_data.csv e gere um gráfico das vendas por mês. "
            "Inclua média móvel de 3 meses."
)

# O que acontece automaticamente:
# 1. Executor envia a mensagem
# 2. Assistente gera código Python
# 3. Executor executa o código
# 4. Se erro: retorna stderr ao Assistente
# 5. Assistente corrige e tenta de novo
# 6. Quando bem-sucedido: Assistente encerra com TERMINATE

💡 human_input_mode tem 3 opções

  • "NEVER" — totalmente autônomo, sem interrupção humana
  • "TERMINATE" — humano pode intervir quando o agente quiser terminar
  • "ALWAYS" — humano aprova cada mensagem antes de enviar
3

👥 GroupChat: múltiplos agentes, uma conversa

Quando você precisa de mais de dois agentes colaborando, GroupChat é o mecanismo nativo do AutoGen. Um GroupChatManager decide quem fala a seguir com base em regras ou via outro LLM.

🏛️ GroupChat com 4 agentes

# 4 agentes especializados
pesquisador = autogen.AssistantAgent(
    name="Pesquisador",
    llm_config=llm_config,
    system_message="Você pesquisa informações e coleta dados relevantes."
)

analista = autogen.AssistantAgent(
    name="Analista",
    llm_config=llm_config,
    system_message="Você analisa dados e identifica padrões e insights."
)

critico = autogen.AssistantAgent(
    name="Critico",
    llm_config=llm_config,
    system_message="""Você critica construtivamente as análises dos outros.
    Aponte falhas de lógica, dados faltantes e conclusões precipitadas."""
)

executor = autogen.UserProxyAgent(
    name="Executor",
    human_input_mode="NEVER",
    code_execution_config={"work_dir": "ws", "use_docker": False}
)

# Cria o GroupChat
group_chat = autogen.GroupChat(
    agents=[pesquisador, analista, critico, executor],
    messages=[],
    max_round=20,                          # máximo de turnos
    speaker_selection_method="auto",        # LLM decide quem fala
    allow_repeat_speaker=False             # evita monólogo
)

# Manager coordena a conversa
manager = autogen.GroupChatManager(
    groupchat=group_chat,
    llm_config=llm_config  # usa LLM para escolher speaker
)

# Inicia o debate
executor.initiate_chat(
    manager,
    message="Pesquise e analise o impacto do GPT-4o em startups B2B SaaS. "
            "O Crítico deve questionar cada conclusão."
)

📊 Métodos de seleção de speaker

  • "auto" — LLM decide quem deve falar com base no contexto da conversa
  • "round_robin" — cada agente fala em ordem rotativa (determinístico)
  • "random" — agente aleatório a cada turno
  • função customizada — você define a lógica de quem fala quando
4

🪞 Reflexão entre agentes: o crítico automático

O padrão de reflexão usa dois agentes: um gerador e um crítico. O gerador produz uma resposta, o crítico avalia com uma rubrica clara, e o ciclo continua até que o crítico aprove ou o limite seja atingido.

🔄 Padrão escritor-crítico

# Agente escritor
escritor = autogen.AssistantAgent(
    name="Escritor",
    llm_config=llm_config,
    system_message="""Você escreve análises técnicas claras e precisas.
    Quando receber crítica, melhore o texto e marque com [REVISADO vX]."""
)

# Agente crítico com rubrica clara
critico = autogen.AssistantAgent(
    name="Critico",
    llm_config=llm_config,
    system_message="""Avalie textos com esta rubrica (1-5 cada):
    1. Precisão técnica: dados e fatos corretos?
    2. Clareza: texto acessível ao público-alvo?
    3. Completude: todos os aspectos importantes cobertos?
    4. Estrutura: organização lógica e fluente?

    Se TODOS >= 4: responda com "APROVADO: [motivo]"
    Senão: liste melhorias específicas por critério."""
)

# Loop de reflexão controlado
proxy = autogen.UserProxyAgent(
    name="Proxy",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=8,  # máximo 4 ciclos escritor+crítico
    is_termination_msg=lambda x: "APROVADO" in x.get("content", ""),
    code_execution_config=False
)

# Inicia com o tópico para o escritor
proxy.initiate_chat(
    autogen.GroupChatManager(
        groupchat=autogen.GroupChat(
            agents=[escritor, critico, proxy],
            messages=[],
            speaker_selection_method="round_robin"
        ),
        llm_config=llm_config
    ),
    message="Escreva uma análise de 300 palavras sobre LangGraph para CTOs de startup."
)

💡 Rubrica clara = feedback acionável

O crítico precisa de uma rubrica específica para dar feedback acionável. "Está bom" ou "melhore" são inúteis. "Clareza (3/5): o parágrafo 2 usa jargão sem definição para o público-alvo indicado" é o que o escritor precisa para melhorar.

5

💻 Execução de código em sandbox

A execução de código é o superpoder do AutoGen. O AssistantAgent gera Python, o UserProxyAgent executa em ambiente controlado, o stdout/stderr vira feedback automático, e o agente corrige até funcionar — sem nenhuma intervenção humana.

Execução local (desenvolvimento)

code_execution_config={
    "work_dir": "workspace",
    "use_docker": False,
    "timeout": 60
}
  • • Sem overhead de Docker
  • • Acesso a recursos locais
  • • Risco: código malicioso pode executar
  • • Ideal para desenvolvimento e testes

Docker sandbox (produção)

code_execution_config={
    "work_dir": "workspace",
    "use_docker": "python:3.11-slim",
    "timeout": 120
}
  • • Isolamento completo do sistema
  • • Código não acessa recursos externos
  • • Overhead de inicialização do container
  • • Obrigatório em produção com código gerado

⚠️ Segurança na execução de código

Nunca execute código gerado por LLM em produção sem sandbox. O LLM pode — intencionalmente ou não — gerar código que acessa arquivos sensíveis, faz chamadas de rede não autorizadas ou consome recursos excessivos.

  • Sem sandbox em produção
  • Docker com acesso à rede sem allowlist
  • Sem timeout configurado
  • Docker com network isolado para produção
6

🎯 Quando preferir AutoGen sobre os outros

AutoGen não é a resposta certa para tudo. Mas há casos onde ele supera LangGraph e CrewAI: quando o fluxo precisa emergir naturalmente, quando execução de código real é central, ou quando debates entre múltiplas perspectivas são o núcleo do problema.

1

Geração e depuração de código iterativa

O agente precisa escrever Python, executar, ver o erro, corrigir e repetir até funcionar. AutoGen foi construído exatamente para isso.

2

Pesquisa exploratória sem etapas fixas

Quando você não sabe quantas iterações serão necessárias, nem qual será a próxima pergunta — a conversa define o caminho.

3

Análise com perspectivas múltiplas

Debates, revisões críticas, análises de risco onde diferentes "vozes" precisam se contradizer e chegar a um consenso emergente.

📊 Tabela de decisão rápida

Cenário AutoGen LangGraph CrewAI
Code gen + execução iterativa ★★★ ★★
Workflow com branches complexos ★★★ ★★
Time de agentes especialistas ★★ ★★ ★★★
Pesquisa / debate multi-perspectiva ★★★ ★★

🎯 Resumo do Módulo

Filosofia conversacional — fluxo emerge da troca de mensagens entre agentes
AssistantAgent + UserProxyAgent — par fundamental para code gen e execução automática
GroupChat — N agentes em conversa com manager coordenando quem fala
Reflexão escritor-crítico — melhora iterativa com rubrica clara de aprovação
Docker sandbox em produção — isola execução de código gerado por LLM

Próximo Módulo:

3.4 — 🤖 OpenAI Agents SDK: handoffs, guardrails e o padrão Swarm