AGI
Construindo Agentes LLM para RAG do Zero e Além: Um Guia Abrangente
LLMs como GPT-3, GPT-4 e seus equivalentes de código aberto frequentemente lutam para recuperar informações atualizadas e às vezes geram alucinações ou informações incorretas.
Retrieval-Augmented Generation (RAG) é uma técnica que combina o poder dos LLMs com a recuperação de conhecimento externo. RAG permite que fundamentemos as respostas dos LLMs em informações factuais e atualizadas, melhorando significativamente a precisão e confiabilidade do conteúdo gerado por IA.
Neste post, exploraremos como construir agentes LLM para RAG do zero, mergulhando fundo na arquitetura, detalhes de implementação e técnicas avançadas. Cobriremos tudo, desde os fundamentos do RAG até a criação de agentes sofisticados capazes de raciocínio complexo e execução de tarefas.
Antes de construir nosso agente LLM, vamos entender o que é RAG e por que é importante.
RAG, ou Retrieval-Augmented Generation, é uma abordagem híbrida que combina recuperação de informações com geração de texto. Em um sistema RAG:
- Uma consulta é usada para recuperar documentos relevantes de uma base de conhecimento.
- Esses documentos são então alimentados em um modelo de linguagem junto com a consulta original.
- O modelo gera uma resposta com base na consulta e nas informações recuperadas.
Essa abordagem tem várias vantagens:
- Melhoria da precisão: Ao fundamentar respostas em informações recuperadas, RAG reduz alucinações e melhora a precisão factual.
- Informações atualizadas: A base de conhecimento pode ser atualizada regularmente, permitindo que o sistema acesse informações atuais.
- Transparência: O sistema pode fornecer fontes para suas informações, aumentando a confiança e permitindo a verificação de fatos.
Entendendo Agentes LLM
Quando você enfrenta um problema sem uma resposta simples, você frequentemente precisa seguir vários passos, pensar cuidadosamente e lembrar o que você já tentou. Agentes LLM são projetados para exatamente essas situações em aplicações de modelos de linguagem. Eles combinam análise de dados aprofundada, planejamento estratégico, recuperação de dados e a capacidade de aprender com ações passadas para resolver problemas complexos.
O que são Agentes LLM?
Agentes LLM são sistemas de IA avançados projetados para criar texto complexo que requer raciocínio sequencial. Eles podem pensar à frente, lembrar conversas passadas e usar diferentes ferramentas para ajustar suas respostas com base na situação e estilo necessário.
Considere uma pergunta no campo jurídico, como: “Quais são os resultados legais potenciais de uma violação de contrato específica na Califórnia?” Um LLM básico com um sistema RAG pode recuperar as informações necessárias de bases de dados jurídicas.
Para um cenário mais detalhado: “À luz das novas leis de privacidade de dados, quais são os desafios legais comuns que as empresas enfrentam e como os tribunais abordaram essas questões?” Essa pergunta vai além de apenas procurar fatos. É sobre entender novas regras, seu impacto em diferentes empresas e as respostas dos tribunais. Um agente LLM dividiria essa tarefa em subtarefas, como recuperar as leis mais recentes, analisar casos históricos, resumir documentos legais e prever tendências com base em padrões.
Componentes de Agentes LLM
Agentes LLM consistem geralmente em quatro componentes:
- Agente/Cérebro: O modelo de linguagem central que processa e entende a linguagem.
- Planejamento: A capacidade de raciocinar, dividir tarefas e desenvolver planos específicos.
- Memória: Mantém registros de interações passadas e aprende com elas.
- Uso de Ferramentas: Integra recursos variados para realizar tarefas.
Agente/Cérebro
No núcleo de um agente LLM está um modelo de linguagem que processa e entende a linguagem com base em vastas quantidades de dados em que foi treinado. Você começa dando a ele um prompt específico, orientando o agente sobre como responder, quais ferramentas usar e quais metas alcançar. Você pode personalizar o agente com uma persona adequada para tarefas ou interações específicas, melhorando seu desempenho.
Memória
O componente de memória ajuda os agentes LLM a lidar com tarefas complexas, mantendo um registro de ações passadas. Existem dois principais tipos de memória:
- Memória de Curto Prazo: Age como um bloco de notas, acompanhando discussões em andamento.
- Memória de Longo Prazo: Funciona como um diário, armazenando informações de interações passadas para aprender padrões e tomar decisões mais informadas.
Combinando esses tipos de memória, o agente pode oferecer respostas mais personalizadas e lembrar preferências do usuário ao longo do tempo, criando uma interação mais conectada e relevante.
Planejamento
O planejamento permite que os agentes LLM raciocinem, dividam tarefas em partes gerenciáveis e adaptem planos à medida que as tarefas evoluem. O planejamento envolve duas principais etapas:
- Formulação de Planos: Dividir uma tarefa em subtarefas menores.
- Reflexão de Planos: Revisar e avaliar a eficácia do plano, incorporando feedback para refinar estratégias.
Métodos como a Chain of Thought (CoT) e Tree of Thought (ToT) ajudam nesse processo de decomposição, permitindo que os agentes explorem diferentes caminhos para resolver um problema.
Para mergulhar mais fundo no mundo dos agentes de IA, incluindo suas capacidades atuais e potenciais, considere ler “Auto-GPT & GPT-Engineer: Um Guia Aprofundado sobre os Principais Agentes de IA Atuais”
Configurando o Ambiente
Para construir nosso agente RAG, precisamos configurar nosso ambiente de desenvolvimento. Estaremos usando Python e várias bibliotecas principais:
- LangChain: Para orquestrar nossos componentes LLM e recuperação
- Chroma: Como nosso repositório de vetores para embeddings de documentos
- Modelos GPT da OpenAI: Como nosso LLM base (você pode substituí-lo por um modelo de código aberto, se preferir)
- FastAPI: Para criar uma API simples para interagir com nosso agente
Vamos começar configurando nosso ambiente:
<p># Crie um novo ambiente virtual python -m venv rag_agent_env source rag_agent_env/bin/activate # No Windows, use `rag_agent_env\Scripts\activate`</p> <p># Instale os pacotes necessários pip install langchain chromadb openai fastapi uvicorn
Agora, vamos criar um novo arquivo Python chamado rag_agent.py e importar as bibliotecas necessárias:
<p>from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitter from langchain.llms import OpenAI from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader import os</p> <p># Defina sua chave de API da OpenAI os.environ["OPENAI_API_KEY"] = "sua-chave-de-api-aqui"</p>
Construindo um Sistema RAG Simples
Agora que temos nosso ambiente configurado, vamos construir um sistema RAG básico. Vamos começar criando uma base de conhecimento a partir de um conjunto de documentos, então usaremos isso para responder a consultas.
Etapa 1: Preparar os Documentos
Primeiro, precisamos carregar e preparar nossos documentos. Para este exemplo, vamos supor que temos um arquivo de texto chamado knowledge_base.txt com algumas informações sobre IA e aprendizado de máquina.
<p># Carregue o documento loader = TextLoader("knowledge_base.txt") documents = loader.load()</p> <p># Divida os documentos em pedaços text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents)</p> <p># Crie embeddings embeddings = OpenAIEmbeddings()</p> <p># Crie um repositório de vetores vectorstore = Chroma.from_documents(texts, embeddings)</p>
Etapa 2: Criar uma Cadeia de QA com Recuperação
Agora que temos nosso repositório de vetores, podemos criar uma cadeia de QA com recuperação:
<p># Crie uma cadeia de QA com recuperação qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())</p>
Etapa 3: Consultar o Sistema
Agora podemos consultar nosso sistema RAG:
<p>query = "Quais são as principais aplicações do aprendizado de máquina?" result = qa.run(query) print(result)
Etapa 4: Criando um Agente LLM
Enquanto nosso sistema RAG simples é útil, é bastante limitado. Vamos aprimorá-lo criando um agente LLM que possa realizar tarefas mais complexas e raciocinar sobre as informações que recupera.
Um agente LLM é um sistema de IA que pode usar ferramentas e tomar decisões sobre quais ações tomar. Vamos criar um agente que não apenas responda perguntas, mas também realize buscas na web e cálculos básicos.
Primeiro, vamos definir algumas ferramentas para nosso agente:
<p>from langchain.agents import Tool from langchain.tools import DuckDuckGoSearchRun from langchain.tools import BaseTool from langchain.agents import initialize_agent from langchain.agents import AgentType</p> <p># Defina uma ferramenta de calculadora class CalculatorTool(BaseTool): name = "Calculadora" description = "Útil para quando você precisa responder a perguntas sobre matemática"</p> <p>def _run(self, query: str) try: return str(eval(query)) except: return "Não consegui calcular isso. Certifique-se de que sua entrada seja uma expressão matemática válida."</p> <p># Crie instâncias de ferramentas search = DuckDuckGoSearchRun() calculator = CalculatorTool()</p> <p># Defina as ferramentas tools = [Tool(name="Busca",func=search.run,description="Útil para quando você precisa responder a perguntas sobre eventos atuais"), Tool(name="RAG-QA",func=qa.run,description="Útil para quando você precisa responder a perguntas sobre IA e aprendizado de máquina"), Tool(name="Calculadora",func=calculator._run,description="Útil para quando você precisa realizar cálculos matemáticos") ]</p> <p># Inicialize o agente agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )</p>
Agora temos um agente que pode usar nosso sistema RAG, realizar buscas na web e realizar cálculos. Vamos testá-lo:
<p>result = agent.run("Qual é a diferença entre aprendizado supervisionado e não supervisionado? Além disso, qual é 15% de 80?") print(result)</p>
Esse agente demonstra uma vantagem chave dos agentes LLM: eles podem combinar múltiplas ferramentas e etapas de raciocínio para responder a consultas complexas.
Aprimorando o Agente com Técnicas RAG Avançadas
Enquanto nosso sistema RAG atual funciona bem, existem várias técnicas avançadas que podemos usar para aprimorar seu desempenho:
a) Busca Semântica com Recuperação de Passagem Densa (DPR)
Em vez de usar recuperação baseada em embeddings simples, podemos implementar DPR para busca semântica mais precisa:
<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p> <p>question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base") context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")</p> <p># Função para codificar passagens def encode_passages(passages): return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output</p> <p># Função para codificar consulta def encode_query(query): return question_encoder(query, max_length=512, return_tensors="pt").pooler_output</p>
b) Expansão de Consulta
Podemos usar expansão de consulta para melhorar o desempenho de recuperação:
<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>
<p>model = T5ForConditionalGeneration.from_pretrained("t5-small")
tokenizer = T5Tokenizer.from_pretrained("t5-small")</p>
<p>def expand_query(query):
input_text = f"expandir consulta: {query}"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
outputs = model.generate(input_ids, max_length=50, num_return_sequences=3)
expanded_queries = [tokenizer.decode(output, skip_special_tokens=True) for output in outputs]
return expanded_queries</p>
c) Refinamento Iterativo
Podemos implementar um processo de refinamento iterativo onde o agente pode fazer perguntas de follow-up para esclarecer ou expandir sua recuperação inicial:
<p>def iterative_retrieval(initial_query, max_iterations=3):
query = initial_query
for _ in range(max_iterations):
result = qa.run(query)
clarification = agent.run(f"Com base nesse resultado: '{result}', qual pergunta de follow-up devo fazer para obter informações mais específicas?")
if clarification.lower().strip() == "nenhum":
break
query = clarification
return result</p>
# Use isso no processo do seu agente
Implementando um Sistema de Múltiplos Agentes
Para lidar com tarefas mais complexas, podemos implementar um sistema de múltiplos agentes onde diferentes agentes se especializam em diferentes áreas. Aqui está um exemplo simples:
<p>class SpecialistAgent:
def __init__(self, name, tools):
self.name = name
self.agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)</p>
<p>def run(self, query):
return self.agent.run(query)</p>
<p># Crie agentes especializados
research_agent = SpecialistAgent("Pesquisa", [Tool(name="RAG-QA", func=qa.run, description="Para perguntas sobre IA e ML")])
math_agent = SpecialistAgent("Matemática", [Tool(name="Calculadora", func=calculator._run, description="Para cálculos")])
general_agent = SpecialistAgent("Geral", [Tool(name="Busca", func=search.run, description="Para perguntas gerais")])</p>
<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>
<p>def run(self, query):
# Determine qual agente usar
if "calcular" in query.lower() or any(op in query for op in ['+', '-', '*', '/']):
return self.agents['Matemática'].run(query)
elif any(term in query.lower() for term in ['ia', 'aprendizado de máquina', 'aprendizado profundo']):
return self.agents['Pesquisa'].run(query)
else:
return self.agents['Geral'].run(query)</p>
<p>coordinator = Coordinator({'Pesquisa': research_agent, 'Matemática': math_agent, 'Geral': general_agent})</p>
<p># Teste o sistema de múltiplos agentes
result = coordinator.run("Qual é a diferença entre CNN e RNN? Além disso, calcule 25% de 120.")
print(result)</p>
Esse sistema de múltiplos agentes permite especialização e pode lidar com uma gama mais ampla de consultas de forma mais eficaz.
Avaliando e Otimizando Agentes RAG
Para garantir que nosso agente RAG esteja funcionando bem, precisamos implementar métricas de avaliação e técnicas de otimização:
a) Avaliação de Relevância
Podemos usar métricas como BLEU, ROUGE ou BERTScore para avaliar a relevância dos documentos recuperados:
from bert_score import score <p>def evaluate_relevance(query, retrieved_doc, generated_answer): P, R, F1 = score([generated_answer], [retrieved_doc], lang="en") return F1.mean().item()</p>
b) Avaliação da Qualidade da Resposta
Podemos usar avaliação humana ou métricas automatizadas para avaliar a qualidade da resposta:
<p>from nltk.translate.bleu_score import sentence_bleu</p> <p>def evaluate_answer_quality(reference_answer, generated_answer): return sentence_bleu([reference_answer.split()], generated_answer.split())</p> <p># Use isso para avaliar as respostas do seu agente
Direções Futuras e Desafios
À medida que olhamos para o futuro dos agentes RAG, várias direções emocionais e desafios surgem:
a) RAG Multimodal: Estender RAG para incorporar dados de imagem, áudio e vídeo.
b) RAG Federado: Implementar RAG em bases de conhecimento distribuídas e preservadoras de privacidade.
c) Aprendizado Contínuo: Desenvolver métodos para que os agentes RAG atualizem suas bases de conhecimento e modelos ao longo do tempo.
d) Considerações Éticas: Abordar viés, justiça e transparência em sistemas RAG.
e) Escalabilidade: Otimizar RAG para aplicações em grande escala e em tempo real.
Conclusão
Construir agentes LLM para RAG do zero é um processo complexo, mas gratificante. Cobrimos os fundamentos do RAG, implementamos um sistema simples, criamos um agente LLM, o aprimoramos com técnicas avançadas, exploramos sistemas de múltiplos agentes e discutimos estratégias de avaliação e otimização.














