Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Grafo MultiAgentes

  1. Conceitos básicos do LangGraph
  • Nós (Nodes) → Funções/agentes especializados.
  • Arestas (Edges) → Conexões entre nós.
  • Arestas Condicionais → Controlam fluxo dinâmico.
  • Busca agêntica → Agente pesquisa, analisa e decide.
  • Multiagentes

Divisão de responsabilidades:

  • Planejar
  • Pesquisar
  • Escrever
  • Criticar
  • Refinar

Isso melhora:

  • Modularidade
  • Escalabilidade
  • Qualidade do conteúdo
from langgraph.graph import StateGraph
  1. Uso do Selenium para web scraping
    Selenium é usado quando páginas exigem JS dinâmico.
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com")
text = driver.find_element(By.TAG_NAME, "body").text
driver.quit()
  1. Persistência e streaming no fluxo de agentes

Persistência: salvar estado entre execuções.

graph.compile(checkpointer=memory)


for chunk in app.stream(inputs):
    print(chunk)
  1. Lógica de Human‑in‑the‑Loop
    Humano intervém quando:
  • confiança < limiar
  • crítica aponta falhas graves
  • domínio sensível
if state["critic"]["confidence"] < 0.7:
    return "human_review"
  1. Classe Agent State
    Estado central compartilhado entre nós.
from typing import TypedDict

class AgentState(TypedDict):
    task: str
    plan: str
    draft: str
    critic: str
    content: str
  1. Prompts dos 5 agentes
AgenteFunção principal
PlanejadorQuebrar tarefa em plano
EscritorGerar texto
PensadorRaciocínio técnico
PesquisadorBuscar fatos
CríticoAvaliar e corrigir
----------------------------------------------------
PLANNER_PROMPT = "Crie um plano de redação estruturado."
WRITER_PROMPT  = "Escreva o texto conforme o plano."
CRITIC_PROMPT  = "Avalie clareza, precisão e coerência."
  1. Nó de planejamento
    Converte tarefa → plano.
def plan_node(state: AgentState):
    state["plan"] = llm.invoke(f"Plano para: {state['task']}")
    return state
  1. Nó de pesquisa com Tavily
from tavily import TavilyClient
tavily = TavilyClient()

def research_node(state):
    query = f"Informações atualizadas sobre {state['task']}"
    state["content"] = tavily.search(query)
    return state
  1. Nó de geração (5 parágrafos)
def generate_node(state):
    prompt = f"""
    Use o plano:
    {state['plan']}
    Gere 5 parágrafos.
    """
    state["draft"] = llm.invoke(prompt)
    return state
  1. Nó de reflexão (crítica técnica)
def critic_node(state):
    state["critic"] = llm.invoke(
        f"Avalie tecnicamente:\n{state['draft']}"
    )
    return state
  1. Pesquisa de crítica (atualização web)
    Valida críticas com dados externos.
def critic_research_node(state):
    findings = tavily.search("verificação factual do conteúdo")
    state["draft"] += f"\n\nAtualizações:\n{findings}"
    return state
  1. Aresta condicional (continuar ou encerrar)
def should_continue(state):
    return "end" if "aprovado" in state["critic"] else "revise"
``
  1. Integração no LangGraph
graph = StateGraph(AgentState)

graph.add_node("plan", plan_node)
graph.add_node("research", research_node)
graph.add_node("generate", generate_node)
graph.add_node("critic", critic_node)

graph.add_edge("plan", "research")
graph.add_edge("research", "generate")
graph.add_edge("generate", "critic")
graph.add_conditional_edges("critic", should_continue)

app = graph.compile()
  1. Interface gráfica com Gradle (conceito)
    Gradle não é UI, mas pode empacotar:
  • Backend Python (API)

  • Frontend (JavaFX / WebView)

  • Fluxo típico:

  • Gradle → build

  • UI → chama API LangGraph

  • Exibe streaming do agente

gradle build
gradle run

Teste o fluxo disparando uma tarefa e acompanhando:

plano
rascunho
crítica
versão final

AgenteFunção principalPlanejadorQuebrar tarefa em planoEscritorGerar textoPensadorRaciocínio técnicoPesquisadorBuscar fatosCríticoAvaliar e corrigir
PythonPLANNER_PROMPT = "Crie um plano de redação estruturado."WRITER_PROMPT = "Escreva o texto conforme o plano."CRITIC_PROMPT = "Avalie clareza, precisão e coerência."Mostrar mais linhas

  1. Nó de planejamento
1 resposta
solução!

Olá, Ricardo! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso do LangGraph para criar um fluxo de agentes, utilizou muito bem o Selenium para web scraping dinâmico e ainda compreendeu a importância da persistência para manter estados entre execuções.

Continue postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Sugestão de conteúdo para você mergulhar ainda mais no tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

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