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?"))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.
- Representadas como objetos ou registros contendo:
- 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
- Estado de raciocínio: o modelo decide o próximo passo.
- Estado de ação: uma ferramenta é executada.
- Retorno ao estado de raciocínio com novos dados.
- 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
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