Construindo um simples agente RAG com Agno v2 e LLaMA
Introdução
Falando de forma superficial, RAG (Retrieval-Augmented Generation) é uma técnica utilizada para permitir que um LLM tenha acesso a conhecimentos específicos nos quais ele não foi treinado originalmente. Alguns exemplos incluem os documentos de onboarding da empresa A, o cardápio do restaurante B ou o FAQ da academia XYZ do seu bairro. Nesse contexto, utilizamos um modelo de linguagem (LLM) como o “cérebro” do sistema, enquanto PDFs, CSVs, vídeos e outros formatos de arquivos servem como fontes de dados externas. Sendo sincero, para compreender RAG de forma completa, é necessário entender diversos conceitos: carregamento de documentos, fragmentação (chunking) dos textos, modelos de embeddings, bancos de dados vetoriais, entre outros. Acredita em mim, é um pouquinho mais complicado do que a tabuada. Neste artigo não entrarei nos detalhes, o objetivo é mostrar como é fácil fazer isso com Agno.
Pô, legal, mas o que é esse Agno exatamente?
Resumindo a ópera, o Agno é um framework Python voltado para a construção de aplicações baseadas em LLMs. Existem outros frameworks com propostas semelhantes, como o LangChain, que tende a ser um pouco mais complexo, mas oferece um leque maior de possibilidades, e o CrewAI, que é focado na construção de sistemas multiagentes. No geral, há uma grande variedade de frameworks nesse ecossistema, cada um com suas próprias características e pontos fortes.
IDE/Editor de código
Para o desenvolvimento, estarei utilizando o PyCharm, mas fique à vontade para usar a ferramenta que preferir, como VS Code, Cursor ou o próprio PyCharm. Crie um novo projeto e, a partir dele, vamos inicializar o ambiente e instalar as dependências necessárias. Um detalhe importante: estarei usando o gerenciador de pacotes uv. Eu já o tenho instalado globalmente, mas você também pode instalá-lo no seu ambiente utilizando o pip.
Gerenciador de pacotes
Comando para instalar o uv:
Iniciando o projeto
Comando para iniciar o projeto:
Dependências
Comando para instalar as depêndencias:
Diretórios
Crie um diretório chamado assets e coloque nele o PDF que será utilizado como conhecimento do agente, além do prompt em markdown(.md), que define, de forma resumida, o comportamento dele. No repositório do projeto, disponibilizo ambos os arquivos. Caso você opte por utilizar um PDF próprio, lembre-se de ajustar o prompt de acordo com o conteúdo desse documento. Em seguida, crie outro diretório chamado src. Todos os arquivos .py que iremos criar ao longo do artigo ficarão dentro desse diretório. Nada muito complexo — uma estrutura simples já é suficiente para este projeto.
Groq api key
Normalmente eu utilizo os modelos da OpenAI, que são pagos. Existem modelos muito bons e relativamente baratos, com cerca de R$ 30 dá para fazer bastante coisa mesmo. No entanto, para manter este artigo livre de custos financeiros, vamos utilizar o LLaMA, da Meta. Para isso acesse https://groq.com/groqcloud, crie uma api key, crie um arquivo chamado .env e cole sua api key nele.
"Vale destacar que existe uma enorme variedade de provedores de LLMs(OpenAI, Anthropic, Google, Mistral, etc), e cada provedor disponibiliza diversos modelos, com características, custos e níveis de desempenho diferentes. A escolha do modelo ideal depende do caso de uso, do orçamento e dos requisitos da aplicação."
Conhecimento do agente
Continuando, crie um arquivo chamado agent_knowledge.py, com o projeto já inicializado, as dependências instaladas e a API key em mãos, o primeiro passo será trabalhar no processo de ingestão de arquivos externos. Para manter o artigo enxuto e facilitar a didática, utilizaremos apenas um único PDF como fonte de dados. Esse arquivo será disponibilizado junto com o projeto, na pasta assets. Trata-se de um PDF contendo o FAQ de uma academia fictícia, criado no ChatGPT, mas você é totalmente livre para utilizar outro documento de sua preferência. Como este é um código com fins didáticos, todo ele contém comentários explicativos detalhando cada etapa. Em termos práticos, o que fazemos a seguir é: criamos um banco de dados vetorial, instanciamos a classe de conhecimento do agente e a vinculamos a esse banco. Por fim, adicionamos o conteúdo do PDF ao conhecimento do agente, permitindo que ele seja consultado posteriormente por meio de buscas semânticas. Caso esteja usando outro pdf e não o que estou disponibilizando no repositório, não esqueça de mudar o nome ou caminho do arquivo no código.
Usando llama com Groq
Primeira parte concluída, agora vamos criar o cérebro do nosso agente, agent_model.py. Essa etapa é bastante simples. Recapitulando: utilizaremos um modelo da Meta, disponibilizado por meio da Groq, e é neste ponto que entra a api key criada previamente, responsável por autenticar o acesso ao modelo de linguagem. O Id do modelo(llama-3.3-70b-versatile) está no site da Groq, fica como dever de casa você explorar o site da Groq e outros modelos.
O Agente
Finalmente, vamos juntar todas as peças no arquivo agent.py e criar o nosso agente propriamente dito. Ele será o componente responsável por receber um “cérebro”, o modelo de linguagem (LLM) e também o conhecimento que esse cérebro poderá acessar. A partir disso, o agente será capaz de raciocinar e responder perguntas com base em tudo o que sabe, combinando modelo, histórico e dados externos. Lembre-se de ajustar o prompt do agente, pois essa é uma etapa extremamente importante. O prompt que estou utilizando está disponível na pasta assets, mas você pode modificá-lo ou criar um novo. Caso tenha usado um PDF com outro tema, certamente será necessário adaptar o prompt para que o agente se comporte corretamente dentro do novo contexto. Ao final, basta rodar o arquivo agent.py.
Finalizando
O Agno se mostra um framework relativamente simples de trabalhar, e a proposta deste artigo foi justamente demonstrar isso na prática. No entanto, como qualquer engenheiro ou engenheira sabe, sempre existe um trade-off nesse tipo de abordagem: quanto mais simples é utilizar um framework, menores tendem a ser as possibilidades de customização e controle em cenários mais complexos. No fim das contas, não existe uma ferramenta “melhor” de forma absoluta. A escolha do framework ideal depende da experiência do time, dos requisitos da aplicação e do nível de flexibilidade necessário para o projeto. Bons estudos!
Links Relacionados
Gostou do artigo? Compartilhe com outros desenvolvedores!