Agentes, Tools, Memória e o Protocolo ReAct

Estrutura de um Agente no LangChain

  • Modelo de Linguagem (LLM): Responsável por interpretar a entrada do usuário e gerar raciocínios internos.
  • Ferramentas (Tools): Funções externas que o agente pode acionar para obter informações ou executar tarefas.
  • Protocolo de Decisão: Define como o agente decide quando e como usar as ferramentas. O mais comum é o ReAct.
  • Memória (opcional): Armazena o histórico da conversa para manter contexto entre interações.

Funcionamento do Protocolo ReAct

Recebimento da entrada: O agente recebe a solicitação do usuário.

Raciocínio interno: O modelo de linguagem avalia a solicitação e decide se já possui informações suficientes ou se precisa de dados externos.

Tomada de decisão:

  • Se a resposta pode ser gerada com o conhecimento interno, o agente responde diretamente.

  • Se for necessário buscar informações ou realizar cálculos, o agente escolhe a ferramenta mais adequada.

Para decisão se é necessario a utilização de uma ferramenta, e se necessario, qual ferramenta será utilizada ocorre a partir do treinamento do modelo, que deve ser adequado para function calling, com padrões necessarios para as funções que são repassadas para o modelo em tempo de execução no contexto do prompt.

Essa função possui um formato de entrada e saida bem definido, isso faz com que a utilização de ferramentas seja mais preciso e controlavel pelo proprio modelo.

Seleção da ferramenta:

  • Baseada em um mapeamento interno de nomes e descrições para funções executáveis.

  • A escolha é feita considerando a descrição textual de cada ferramenta e a necessidade identificada no raciocínio.

Execução da ferramenta: - O LangChain aciona a função associada à ferramenta, passando os parâmetros necessários, o resultado é retornado ao agente.

Novo raciocínio: - O modelo incorpora o resultado ao seu contexto interno. - Decide se precisa de mais ações ou se já pode formular a resposta final.

Resposta final: O agente apresenta a resposta ao usuário.

Estruturas de Dados Envolvidas

  • Memória:
    • Implementada como um buffer de conversação (lista ordenada de pares pergunta-resposta).
    • Pode ser persistente (armazenada em banco de dados) ou volátil (apenas na sessão atual).
    • Pode ser vetorizada para permitir buscas semânticas no histórico.
  • Ferramentas:
    • Representadas como objetos ou registros contendo:
      • Nome identificador.
      • Descrição textual.
      • Função executável.
  • Mapeamento de Ferramentas:
    • Estrutura que associa nomes e descrições a funções.
    • Usada pelo modelo para decidir qual ferramenta acionar.

Ciclo de Operação no ReAct

  1. Estado de raciocínio: o modelo decide o próximo passo.
  2. Estado de ação: uma ferramenta é executada.
  3. Retorno ao estado de raciocínio com novos dados.
  4. Repetição do ciclo até que a resposta final seja formulada.

Exemplo de Agente com:

  • Busca na Web (DuckDuckGo)
  • Cálculo matemático (Python REPL)
  • Memória de conversa
from langchain_community.tools.ddg_search import DuckDuckGoSearchRun
from langchain.chat_models import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, Tool
from langchain.memory import ConversationBufferMemory
from langchain_experimental.utilities import PythonREPL
import os

# LLM
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0, openai_api_key=os.environ.get('OPENAI_API_KEY'))

# Ferramenta de cálculo
python_repl = PythonREPL()
calc_tool = Tool(
    name="Calculadora Python",
    func=python_repl.run,
    description="Executa cálculos matemáticos em Python."
)

# Busca na web com DuckDuckGo
search = DuckDuckGoSearchRun()
search_tool = Tool(
    name="Busca Web",
    func=search.run,
    description="Busca informações atualizadas na internet."
)

# Memória
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# Agente
tools = [calc_tool, search_tool]
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True
)

print(agent.run("Quem é o atual presidente do Brasil?"))

Testando o agente

Podemos agora fazer perguntas que exijam: - Raciocínio + cálculo - Busca na web - Memória de conversa

# Exemplo 1: cálculo
print(agent.run("Qual é a raiz quadrada de 256?"))

# Exemplo 2: busca na web
print(agent.run("Quem ganhou o prêmio Nobel de Física em 2025?"))

# Exemplo 3: memória
print(agent.run("Me lembre o que perguntei antes."))

O uso de agentes em conjunto com LLMs traz uma benefícios que vão além de “perguntar e responder”:

1. Redução de Alucinações

Modelos de linguagem, por mais avançados que sejam, podem inventar informações quando não têm dados suficientes ou quando a pergunta exige conhecimento muito específico. Ao integrar ferramentas externas (como busca na web, bancos de dados internos ou cálculos), o agente pode consultar fontes confiáveis antes de responder, reduzindo drasticamente a chance de respostas incorretas ou inventadas.

Exemplo:

  • Sem agente: a LLM tenta responder com base apenas no que “lembra” do treinamento.

Isso leva a um problema causado quando estamos em ambientes mais especificos, como por exemplo perguntando a respeito de dados de determinada area de conhecimento ou de informação escassa, fazendo com que a LLM tente inferir informações que podem conflitar com dados mais recentes ou serem puramente alucinação.

  • Com agente: a LLM decide buscar a informação em tempo real, garantindo que a resposta seja baseada em dados concretos.

2. Aplicações Mais Específicas

Em aplicações corporativas ou de nicho, muitas vezes é necessário que a LLM:

  • Consulte bases interna (documentos, manuais, relatórios)
  • Execute processos específicos (cálculos, consultas a APIs internas)
  • Siga regras de negócio definidas pela empresa

Com agentes, conseguimos conectar a LLM a essas fontes e processos, além de permitir a interação com sistemas especializados criando soluções hibridas.

3. Acesso a Dados Recentes

LLMs são treinadas com uma janela delimitada de conhecimento (cutoff date) devido ao periodo dos dados utilizados para o treinamento desse modelo. Isso significa que, sozinhas, elas não sabem nada sobre eventos posteriores a essa data. Ao integrar ferramentas como DuckDuckGo ou APIs de notícias, o agente pode buscar informações atualizadas e incorporá-las na resposta.

4. Acesso a Dados Especificos via Protocolos como MCP

O MCP (Model Context Protocol) é um protocolo de comunicação que permite que LLMs interajam com fontes de dados privadas de forma padronizada e autenticada, possuindo padrão de autorização e autenticação para comunicação entre LLM e sistemas externos, podendo inclusive ser utilizado entre dois agentes. Isso significa que podemos:

  • Conectar a LLM a bancos de dados internos
  • Consultar sistemas corporativos
  • Consumir serviços externos

Essa abordagem é fundamental para:

  • Compliance (LGPD, GDPR e contratos especificos)
  • Segurança da informação
  • Customização de respostas com base em dados internos