06-02-01 — LlamaIndex: foco em dados, RAG e agentes data-aware
TL;DR
LlamaIndex não é um agent framework — é um data framework. Seu ponto forte é conectar LLMs a qualquer fonte de dados (PDFs, bancos SQL, APIs, SharePoint) e construir pipelines de indexação + retrieval altamente otimizados. Use LlamaIndex quando o problema central é como recuperar o dado certo; use LangChain/LangGraph quando o problema é como orquestrar o fluxo do agente.
Filosofia: data-centric vs agent-centric
LlamaIndex parte de uma premissa diferente dos outros frameworks: a maior dificuldade em produção não é o LLM, mas conectar o LLM aos seus dados corporativos. Por isso sua arquitetura gira em torno de:
- Data Connectors (Readers) — ingere dados de 100+ fontes
- Indices — estruturas otimizadas para retrieval (vector, keyword, summary, knowledge graph)
- Retrievers — estratégias de busca (dense, sparse, hybrid, BM25)
- Query Engines — interface de alto nível para perguntas sobre dados indexados
- Agents — agentes que usam query engines como ferramentas
Pipeline básico
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
# Configuração global
Settings.llm = OpenAI(model="gpt-4o-mini")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
# 1. Ingestão: carrega documentos
documents = SimpleDirectoryReader("./data/contratos/").load_data()
# 2. Indexação: cria vetores e armazena
index = VectorStoreIndex.from_documents(documents)
# 3. Query Engine: interface para perguntas
query_engine = index.as_query_engine(similarity_top_k=5)
response = query_engine.query("Qual o prazo de entrega do contrato com a TIM?")
print(response)
print(response.source_nodes) # chunks que embasaram a resposta
Indices avançados
from llama_index.core import SummaryIndex, KeywordTableIndex
from llama_index.core.indices.knowledge_graph import KnowledgeGraphIndex
# SummaryIndex: melhor para resumos e sínteses
summary_index = SummaryIndex.from_documents(documents)
summary_engine = summary_index.as_query_engine(response_mode="tree_summarize")
# KeywordTableIndex: melhor para busca por termos exatos
keyword_index = KeywordTableIndex.from_documents(documents)
# Router Query Engine: escolhe automaticamente qual índice usar
from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.tools import QueryEngineTool
tools = [
QueryEngineTool.from_defaults(query_engine=query_engine, description="Para busca semântica em contratos"),
QueryEngineTool.from_defaults(query_engine=summary_engine, description="Para resumir documentos completos"),
]
router_engine = RouterQueryEngine.from_defaults(query_engine_tools=tools, use_async=True)
Agentes data-aware
LlamaIndex tem seu próprio sistema de agents onde os query engines viram ferramentas. O agente decide automaticamente qual fonte de dados consultar:
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import QueryEngineTool, FunctionTool
# Query engines como ferramentas do agente
contratos_tool = QueryEngineTool.from_defaults(
query_engine=index.as_query_engine(),
name="busca_contratos",
description="Busca informações nos contratos corporativos"
)
# Função Python como ferramenta
def calcular_multa(valor: float, percentual: float) -> float:
"""Calcula multa contratual."""
return valor * percentual / 100
multa_tool = FunctionTool.from_defaults(fn=calcular_multa)
agent = ReActAgent.from_tools(
[contratos_tool, multa_tool],
llm=Settings.llm,
verbose=True
)
response = agent.chat("Qual a multa de 10% sobre o valor do contrato com a Vale?")
Integração com vector stores enterprise
from llama_index.vector_stores.azureaisearch import AzureAISearchVectorStore
from llama_index.vector_stores.postgres import PGVectorStore
# Azure AI Search (ideal para stack Microsoft)
vector_store = AzureAISearchVectorStore(
search_or_index_client=search_client,
index_name="contratos-index",
embedding_dimensionality=1536,
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
LlamaIndex vs LangChain: quando usar cada um
| Critério | LlamaIndex | LangChain |
|---|---|---|
| Foco principal | Indexação e retrieval de dados | Orquestração de fluxos LLM |
| RAG avançado | ✅ Nativo, muito mais opções | ⚠️ Possível, menos especializado |
| Múltiplas fontes de dados | ✅ 100+ conectores | ✅ Muitos loaders |
| Agentes com estado | ⚠️ Básico | ✅ Via LangGraph |
| Multi-agent complexo | ❌ Não é o foco | ✅ Via LangGraph |
| Curva de aprendizado | Moderada | Moderada |
LlamaCloud e LlamaParse
LlamaParse: parser especializado para PDFs complexos (tabelas, figuras, layouts multi-coluna) — muito superior ao PyPDF2 para documentos corporativos. LlamaCloud: plataforma gerenciada para pipelines de dados + RAG em produção.
Como isso se conecta
- Módulo 05 (RAG) — LlamaIndex implementa todos os padrões RAG vistos no módulo anterior
- 06-01-01 LangChain — podem ser combinados: LlamaIndex para retrieval, LangChain para orquestração
- 06-03-01 Semantic Kernel — SK tem seu próprio sistema de Memory/RAG, mas LlamaIndex é mais maduro para casos complexos
- 06-04-03 Decision matrix — LlamaIndex é a escolha quando RAG avançado é o requisito principal