LlamaIndex em pratique
O LlamaIndex é um framework Python que gerencia toda a cadeia de um RAG: carregamento de documentos, divisão, embeddings, indexação e consultas com fontes. Localmente, ele se conecta ao Ollama e a embeddings como BGE-M3, mas suas configurações padrão fazem chamadas à OpenAI: defina Settings.llm e Settings.embed_model antes de indexar e ajuste context_window e request_timeout.
LlamaIndex reduz um RAG a algumas linhas, mas seus valores padrão (OpenAI, janela de contexto, tempo limite de 30 segundos) criam armadilhas para instalações locais, e os tutoriais antigos de agentes não funcionam mais. Você saberá montar um pipeline totalmente local, escolher um modo de consulta, adicionar um reranker e escrever um agente com a API atual.
#LlamaIndex na prática: para que serve e quando adotá-lo
LlamaIndex é um framework Python que dá suporte a todo o fluxo de um RAG: carregar documentos, dividi-los em partes (nodes), transformá-los em vetores, indexá-los e depois consultar o índice com um LLM que cita suas fontes. A versão 0.14.25, publicada no PyPI em 21 de setembro de 2026, exige Python 3.10 ou superior. Um RAG mínimo cabe em cerca de dez linhas; o framework se torna útil quando é necessário variar as fontes, mudar o modo de resposta, adicionar um reranker ou integrar um agente. Localmente, ele funciona com Ollama para o LLM e um modelo de embeddings escolhido por você, desde que você desative suas configurações padrão, que fazem chamadas à OpenAI. Este guia monta um RAG totalmente local, mostra as configurações que importam e corrige vários exemplos desatualizados que ainda são encontrados na internet.
- Abstrações claras
- Document, Node, VectorStoreIndex, retriever, query engine: cada etapa do RAG tem um objeto dedicado, substituível.
- Conectores de dados
- SimpleDirectoryReader lê PDF, Word, PowerPoint, Markdown, imagens ou áudio; outros leitores abrangem Notion, Google Docs, Slack ou Discord.
- Modos de consulta
- Várias estratégias de síntese e mecanismos mais elaborados (subperguntas, roteamento entre índices) para ir além da simples busca vetorial.
- Execução local possível
- Ollama e os embeddings do Hugging Face ou Ollama são conectados por meio de pacotes de integração dedicados.
#As etapas de um RAG LlamaIndex e suas configurações padrão
Seus documentos, sua IA: um RAG local confiável para seus PDFs, notas e e-mails — sem enviar nada para a nuvem.
- Espaço online vitalício
- PDF + arquivos
- Atualizações vitalícias
Antes de escrever código, tenha em mente o pipeline e, principalmente, seus valores padrão: é aí que se esconde a maioria das surpresas ao executar localmente.
| Etapa | Objeto ou configuração | Valor padrão que você deve conhecer |
|---|---|---|
| Segmentação | SentenceSplitter, Settings.chunk_size | Tamanho de 1.024 tokens, com sobreposição de 20 tokens |
| Embeddings | Settings.embed_model | text-embedding-ada-002 da OpenAI, de acordo com a documentação |
| LLM | Settings.llm | gpt-3.5-turbo da OpenAI, de acordo com o tutorial introdutório |
| Armazenamento | VectorStoreIndex, StorageContext | Na memória; deve ser persistido explicitamente no disco |
| Resumo | response_mode | compact: concatena tantos chunks quantos a janela permitir |
| LLM Ollama | request_timeout | 30 segundos por padrão, um prazo muitas vezes curto demais para execução local |
#Instalação para um RAG 100 % local
O comando pip install llama-index instala um pacote inicial que inclui llama-index-core, as integrações da OpenAI para o LLM e os embeddings, e os leitores de arquivos. Para execução local, adicione as integrações do Ollama e de embeddings (llama-index-embeddings-ollama se você preferir OllamaEmbedding); os pacotes OpenAI do conjunto permanecem instalados, mas sem uso, desde que você configure Settings.
O nome de um pacote indica o caminho de importação: llama-index-llms-ollama corresponde a llama_index.llms.ollama. Quanto à memória, leve em conta os pesos do LLM (cerca de 5 GB para um modelo de 7–8B em Q4, referência do site), o modelo de embeddings e o contexto: um computador com 16 GB de RAM é adequado para um corpus pequeno; mais memória oferece uma margem maior.
#Um RAG em dez linhas (com suas configurações padrão para OpenAI)
Este código é válido, mas utiliza os modelos padrão da OpenAI: falha sem chave e, com chave, envia seus textos para o provedor. Serve como esqueleto. A seção seguinte adiciona as poucas linhas que o tornam local.
#Migrar para o uso local com Ollama e embeddings em francês
Três blocos de configuração são suficientes: o LLM, o modelo de embeddings e a divisão em trechos. Para o francês, BGE-M3 é uma escolha comum: sua ficha indica mais de 100 idiomas e entradas de até 8.192 tokens. O download do modelo pesa cerca de 2,3 GB (arquivo pytorch_model.bin do repositório Hugging Face) e ocorre apenas uma vez.
#Por que context_window e request_timeout são importantes
O código-fonte da integração do Ollama com o LlamaIndex passa o valor de context_window para o Ollama com o nome num_ctx. Sem isso, o Ollama aplica sua janela padrão, de cerca de 4.000 tokens quando há menos de 24 GiB de VRAM, segundo sua documentação. A conta é simples: cinco trechos de 700 tokens somam 3.500 tokens, antes da pergunta, das instruções do template de prompt e da resposta. Com 4.000 tokens, o prompt ultrapassa o limite e o contexto é truncado, muitas vezes sem erro visível. Com 8.000, há margem.
O tempo limite é a outra armadilha: o cliente Ollama do LlamaIndex define 30 segundos por padrão. Uma primeira chamada que carrega o modelo na memória e processa um prompt longo pode ultrapassar esse limite. Os 120 segundos do exemplo são um ponto de partida a ajustar conforme seu hardware.
#Carregar seus arquivos: configurações do SimpleDirectoryReader
SimpleDirectoryReader lê um diretório inteiro e suporta diversos formatos: PDF, Word, PowerPoint, Markdown, imagens, áudio e vídeo. Alguns parâmetros evitam indexar conteúdo indiscriminadamente.
Os conectores para serviços (Notion, Google Docs, Slack, Discord) buscam os dados online: isso é inevitável, pois eles estão lá. Depois que os documentos são carregados, a indexação e a consulta continuam locais, com seus embeddings e seu LLM Ollama. Faça um primeiro teste com alguns arquivos: um PDF digitalizado sem camada de texto não produzirá nada enquanto não passar por um OCR, como descrito no guia do Tesseract.
#Escolher um modo de consulta e o custo em chamadas ao LLM
O modo de síntese determina quantas vezes o LLM é chamado e, portanto, o tempo de resposta local. A tabela apresenta os modos documentados e seus custos, com um exemplo de cinco passagens de 700 tokens e uma janela de 8.000 tokens (estimativa).
| Modo | Princípio (documentação) | Chamadas no exemplo |
|---|---|---|
| compact (padrão) | Concatena tantos chunks quantos a janela permitir, depois faz a consulta | 1 chamada: 3.500 tokens cabem em 8.000 |
| refine | Percorre os chunks um por um, com uma chamada por chunk | 5 chamadas, em sequência |
| tree_summarize | Consulta por grupos, depois resume recursivamente as respostas | 1 chamada se tudo couber na janela; caso contrário, várias, depois um resumo final |
| simple_summarize | Trunca todo o conteúdo para que caiba em um único prompt | 1 chamada, com perda de detalhes |
| no_text | Executa apenas o retriever, sem chamar o LLM | 0 chamadas; útil para depurar a pesquisa |
Para uma pergunta factual, mantenha compact. Para resumir um documento longo, tree_summarize foi concebido para isso, ao custo de várias chamadas: em uma máquina local, reserve várias vezes o tempo de uma resposta simples. no_text é valioso para verificar o que a busca retorna, sem esperar pelo LLM.
#Adicionar um reranker local
Quando a resposta correta está nos 20 primeiros trechos, mas não nos 5 primeiros, um reranker reordena os candidatos antes de enviá-los ao LLM. A documentação do LlamaIndex recomenda o SentenceTransformerRerank como opção padrão que não exige chave de API e é executada localmente. Trata-se de um cross-encoder via sentence-transformers, e a documentação cita o Qwen3-Reranker-0.6B para uma melhor qualidade multilíngue.
O modelo apresentado aqui é o do exemplo oficial, escolhido por sua velocidade; foi projetado para o inglês: para documentos em francês, teste um reranker multilíngue. O guia dedicado detalha a escolha e a avaliação.
#Subperguntas e roteamento
- SubQuestionQueryEngine
- Decompõe uma pergunta complexa em subperguntas enviadas a ferramentas de consulta e depois sintetiza. "Compare as estratégias de 2024 e 2025" se torna duas pesquisas separadas.
- RouterQueryEngine
- Escolhe, para cada pergunta, o motor adequado entre vários (por exemplo, um índice de resumos ou um índice vetorial).
Esses dois mecanismos multiplicam as chamadas ao LLM: uma decomposição em três subperguntas acrescenta a geração das subperguntas, três respostas e a síntese final, totalizando pelo menos cinco chamadas. Em hardware local, reserve-os para as perguntas que realmente justificarem seu uso.
#Agentes: a API atual já não é a mesma dos tutoriais antigos
Muitos tutoriais usam ReActAgent.from_tools. Essa classe não existe mais no código-fonte atual: o módulo agent/react/base.py que a continha desapareceu do repositório. Os agentes agora são workflows assíncronos: FunctionAgent (um agente que chama funções ou ferramentas), ReActAgent na versão de workflow e AgentWorkflow para orquestrar vários agentes. O tutorial oficial para uso local constrói o agente com AgentWorkflow.from_tools_or_functions e o executa com await agent.run.
O nome, a descrição e os argumentos da função (sua docstring) são enviados ao LLM, que decide se deve chamá-la: portanto, capriche nessa descrição. O funcionamento do FunctionAgent baseia-se em chamadas nativas de funções; com um modelo local, escolha um modelo que suporte ferramentas no Ollama e mantenha o RAG simples se o seu não tiver esse suporte.
#LlamaIndex, LangChain ou RAG próprio: como escolher
| Critério | RAG próprio (ChromaDB, embeddings) | LlamaIndex | LangChain |
|---|---|---|---|
| Objetivo principal | Entender cada etapa, controle total | Pipeline documental com componentes prontos | Orquestração de ferramentas e agentes |
| Tempo para colocar em funcionamento | Mais demorado: tudo precisa ser escrito | Curto para um primeiro RAG | Curto para uma cadeia, mais longo para um RAG completo |
| Personalização | Sem limite, por sua conta | Configurações por componente, objetos substituíveis | Muito flexível, mais verboso |
| Risco principal | Reinventar um pipeline existente | Defeitos da OpenAI, API que evolui rapidamente | API que evolui rapidamente |
Regra prática: um RAG documental com fontes citadas, diversos formatos e algumas opções de consulta se constrói rapidamente com o LlamaIndex. Se você quiser entender primeiro o mecanismo, escreva uma versão própria uma vez: o guia ChromaDB mostra os passos. Para um agente que controla muitas ferramentas externas, compare o LangChain e os workflows do LlamaIndex de acordo com seus hábitos.
#As armadilhas que custam tempo
- Reindexar a cada execução
- Sem persist, o índice fica na memória e desaparece quando o script é encerrado. Persista o índice e depois recarregue-o com load_index_from_storage.
- Trocar de modelo sem reindexar
- Os vetores de dois modelos de embeddings não são comparáveis: modificar embed_model ou a divisão em trechos exige reconstruir o índice.
- Contexto truncado silenciosamente
- Um prompt mais longo que a janela de Ollama é truncado: verifique context_window se as respostas ignorarem as passagens finais.
- Copiar um tutorial antigo
- As APIs de agentes mudaram: verifique se os imports de um exemplo existem na versão instalada (0.14.25 no momento da redação).
- Nunca medir
- Um RAG sem avaliação se desvia sem que você perceba: o guia Ragas mostra como quantificar esse desvio.
- RAG local com ChromaDB e Ollama: tutorial em Python
- Adicionar um reranker ao seu pipeline
- Os melhores modelos de embeddings para francês
- Estratégias de chunking
- Ragas: avaliar seu RAG local com números
- Criar um agente de IA local em Python com LangChain e Ollama
- Fonte: tutorial de introdução aos modelos locais
- Fonte: instalação do LlamaIndex
- Fonte: modos de síntese de resposta
- Fonte: persistência e recarregamento de um índice
- Fonte: ficha do modelo BGE-M3
O LlamaIndex funciona inteiramente em ambiente local?+
Qual modelo de embeddings escolher para documentos em francês?+
Por que meu RAG do LlamaIndex esquece alguns trechos?+
Como evitar reindexar a cada execução?+
ReActAgent.from_tools não funciona mais; o que fazer?+
LlamaIndex ou LangChain para um RAG local?+
Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.