GraphRAG na Prática: Arquitetura, Implementação e o Estado da Arte
Lede: O RAG vetorial recupera o trecho que parece com a sua pergunta. O GraphRAG recupera a cadeia de relações que responde a ela. A diferença aparece quando a resposta não está em um parágrafo — está na topologia. Este artigo cobre os quatro modos de busca, o pipeline de implementação real, e onde o GraphRAG-R1 (aceito no Web Conference 2026) mostra que treinar o modelo a decidir quanto buscar vale mais que qualquer heurística fixa.
🧭 O que você leva daqui:
A pergunta que separa RAG vetorial de GraphRAG — e a evidência de quando não migrar
Os 4 modos de busca (Local, Global, DRIFT, Text2Cypher) e quando usar cada um
GraphRAG-R1: GRPO, Rollout-with-Thinking e as duas recompensas que controlam custo
Números verificados de F1 e de tokens, com as ressalvas que os papers fazem
Pipeline de implementação: ingestão, infraestrutura, indexação, context fusion
1. O problema: quando a resposta está no caminho, não no texto
1.1 O exemplo que expõe o limite
Considere esta pergunta de diagnóstico de infraestrutura:
"Quais componentes são afetados se o serviço de autenticação falhar?"
O que o RAG vetorial faz: converte a pergunta em um embedding e busca chunks cujo texto seja semanticamente próximo de "serviço de autenticação" e "falha". Se as dependências estão documentadas de forma fragmentada — o serviço de autenticação num doc, o módulo de pagamentos noutro, a configuração do banco num terceiro — a busca vetorial não tem como juntar as pontas. Ela devolve os três trechos e torce para o LLM inferir a dependência. Resultado: omissão de componentes críticos ou alucinação de dependências que não existem.
O que o GraphRAG faz: localiza o nó Serviço_Autenticação, percorre as arestas depende_de / executa_em / afeta a jusante, e devolve o subgrafo de impacto exato. O LLM recebe a cadeia causal como estrutura, não como narrativa para adivinhar.
A diferença não é de qualidade de embedding. É de tipo de evidência: similaridade vetorial versus caminho percorrido.
1.2 Comparativo
| Dimensão | Vector RAG | GraphRAG |
|---|---|---|
| Método de recuperação | Similaridade vetorial sobre chunks não estruturados | Consultas estruturadas (Cypher/Gremlin) ou travessia topológica |
| Raciocínio multi-hop | Fraco — depende de encadeamento heurístico de prompts | Forte — o caminho é calculado, não inferido |
| Eficiência de contexto | Baixa — passagens inteiras, ruidosas | Alta — triplas e subgrafos, densidade factual alta |
| Explicabilidade | Baixa — cita o trecho, não a lógica | Alta — exibe nós, arestas e caminho percorrido |
| Atualização de conhecimento | Dispendiosa — re-chunking + re-embedding | Mutação local de nós e arestas |
| Consultas que atende bem | Fato isolado, semântica, sumarização direta | Dependências, caminhos mínimos, análise de rede, temas globais |
| Custo de construção | Baixo | Alto — pipeline de extração com LLM + armazenamento |
1.3 O contraponto que quase nenhum artigo traz
GraphRAG não é um upgrade geral. Ele perde em QA geral, e há benchmark independente medindo isso.
O paper "RAG vs. GraphRAG: A Systematic Evaluation" mostra, em QA geral (NQ), F1 de 64,78 para RAG contra 34,28 para KG-GraphRAG baseado em triplas. A busca densa é melhor quando a resposta está num trecho e a pergunta é direta.
O paper "Do We Still Need GraphRAG?" chega à mesma conclusão por outro caminho: "dense RAG is already effective for general QA, while GraphRAG provides decisive gains primarily on multi-hop QA" — com ganho médio de +27,23 de F1 nos três benchmarks multi-hop, e perda em QA geral.
E o custo? A análise unificada da VLDB mostra que métodos baseados em grafo são consistentemente mais caros em tempo e tokens que o VanillaRAG. No caso extremo, um GGraphRAG consome ~9 minutos e 300 mil tokens por consulta contra o VanillaRAG no dataset MultihopSum.
🚨 A regra honesta: GraphRAG é uma decisão condicional, não um padrão de qualidade. Se o seu corpus é grande e as perguntas são majoritariamente diretas, você vai pagar mais caro e acertar menos. Migre quando a pergunta exigir conectar fatos distribuídos — e não antes.
2. Os quatro modos de busca
2.1 Busca Local — entity linking + k-hop
Para perguntas focadas em uma entidade e sua vizinhança imediata:
- Entity linking — termos da pergunta viram nós-âncora
- k-hop traversal — BFS ou DFS até a profundidade
k - Serialização — o subgrafo vira triplas no prompt
Baixa latência, escopo contido, consumo previsível. Exemplos: "Quais fornecedores fornecem componentes para o produto X?"
2.2 Busca Global — o pipeline de três etapas
Introduzida no paper original da Microsoft (From Local to Global, 2024), responde a perguntas holísticas sobre o corpus inteiro, onde não existe entidade-âncora: "Quais são os principais fatores de risco operacionais na base de conhecimento?"
- Detecção hierárquica de comunidades — o grafo é particionado em níveis de granularidade pelo algoritmo Leiden hierárquico
- Relatórios de comunidade — um LLM resume cada comunidade, destacando entidades-chave, relações centrais, claims e temas dominantes
- Map-reduce — a consulta aciona respostas parciais por relatório relevante, depois uma etapa reduce sintetiza tudo
🔍 Por que Leiden e não Louvain? Leiden é a evolução do Louvain: ambos têm as fases de reatribuição e compressão, mas Leiden acrescenta uma fase de refinamento antes da compressão. Isso impede a patologia clássica do Louvain — gerar comunidades internamente desconectadas. No GraphRAG isso importa: uma comunidade desconectada produz um relatório que mistura entidades sem relação real entre elas.
A saída são duas tabelas: communities (com parent, children, level, entity_ids, relationship_ids) e community_reports.
2.3 DRIFT Search
Dynamic Reasoning and Inference with Flexible Traversal. Combina as duas buscas: começa com busca local a partir de entidades e, conforme descobre caminhos relacionais, expande adaptativamente para relatórios de comunidade de nível superior, reajustando a profundidade com base na evidência encontrada no meio do caminho. É o modo mais equilibrado para perguntas que começam específicas e terminam amplas.
2.4 Text2Cypher e GraphRAG agêntico
O LLM vira agente deliberativo: avalia a intenção, gera a consulta em Cypher ou Gremlin, executa, lê o resultado e decide se expande mais ou responde.
⚠️ Text2Cypher é o ponto mais frágil de toda a arquitetura. O LLM gera sintaxe inválida ou referencia esquema que não existe — e o erro só aparece em tempo de execução, contra o banco de produção. Mitigações: injetar o esquema validado no prompt, incluir exemplos few-shot e uma camada de validação sintática antes de executar. Sem isso, você tem um agente capaz de derrubar consultas em produção.
2.5 HybridRAG
O meio-termo mais prático, por duas vias:
- Expansão vetor-para-grafo — a busca vetorial recupera trechos e entidades candidatas; elas viram seeds para uma expansão k-hop que preenche as lacunas relacionais
- Filtragem grafo-para-vetor — o grafo estabelece o escopo primeiro, e a busca vetorial fica restrita aos nós dentro desse subgrafo, eliminando o ruído fora do contexto estrutural
3. GraphRAG-R1: treinar o modelo a decidir quanto buscar
O problema que o paper enfrenta: os GraphRAGs existentes usam heurísticas fixas de busca. Ou recuperam pouco e erram, ou recuperam demais e estouram custo. O GraphRAG-R1 (Yu et al., aceito no Web Conference 2026) treina o LLM com RL para decidir, chamada a chamada.
3.1 Rollout-with-Thinking
O modelo interrompe a própria geração para chamar a ferramenta de recuperação. Tokens especiais delimitam cada fase:
<|begin_of_query|>...<|end_of_query|>— o modelo emite a consulta<|begin_of_documents|>...<|end_of_documents|>— o contexto retornado entra na sequência
3.2 Retrieval-Masked Loss
Os tokens do documento recuperado ficam fora do cálculo da perda. Sem isso, o modelo é penalizado por não conseguir prever um texto que ele mesmo não controla — o que degrada os pesos. O gradiente só flui pelos tokens que o LLM gerou.
3.3 O objetivo GRPO
A arquitetura adapta o GRPO (Group Relative Policy Optimization), usando a média de recompensa do grupo de tamanho G como baseline — o que elimina a necessidade de um modelo crítico separado.
com a razão de importância e a vantagem normalizada dentro do grupo:
3.4 As duas recompensas que controlam custo
Progressive Retrieval Attenuation (PRA) — combate a busca rasa. Recompensa a primeira chamada, e cada chamada seguinte recebe um incremento com decaimento exponencial:
Com e , o total acumulado converge para a série geométrica — o teto que impede o modelo de lucrar chamando a ferramenta indefinidamente.
Cost-Aware F1 (CAF) — combate o super-pensamento, penalizando o F1 pelo número de operações:
Com e no setup do paper. Duas trajetórias com o mesmo F1: vence a que fez menos chamadas.
3.5 Treinamento em três estágios
Hiperparâmetros do setup experimental
- SFT: temperatura 1.0, **máximo de 8 chamadas de recuperação**, learning rate 5e-6, 1 época - LoRA em **todos os três estágios**: `r=16`, `lora_alpha=32` - Backbones: Qwen2.5-7B, Qwen2.5-7B-Instruct e Llama-3-8B (Apêndice A.2) - Dados de cold start gerados pelo ERNIE-3.5-128K; avaliação de acurácia por LLM-as-a-Judge3.6 Resultados — F1 verificado
| Benchmark | GraphRAG-R1 | Melhor baseline | Ganho relativo |
|---|---|---|---|
| HotpotQA | 38,00 | 27,52 (HippoRAG2) | +38,08% |
| MuSiQue | 20,06 | 12,35 (R1-Searcher) | +62,43% |
| 2Wiki | 32,24 | 17,54 (Prompt Engineering) | +83,81% |
| PopQA (out-of-domain) | 35,04 | 29,21 (ToG) | +19,96% |
O ganho cresce com a dificuldade do dataset. E o resultado em PopQA — que não apareceu no treino — indica generalização zero-shot real, não overfitting.
3.7 Eficiência de tokens — com a ressalva que importa
| Método | HotpotQA — F1 / tokens | MuSiQue — F1 / tokens |
|---|---|---|
| KGP | 10,73 / 2.687 | 4,61 / 2.858 |
| ToG | 11,44 / 3.137 | 5,02 / 2.874 |
| GraphRAG-R1 | 38,00 / 1.674 | 20,06 / 2.086 |
🔍 Leia esse quadro com cuidado antes de adotar esses números. A comparação de custo é contra KGP e ToG, que no HotpotQA pontuam F1 10,73 e 11,44 — ou seja, ficam muito abaixo do R1-Searcher (26,82) da tabela principal. O paper compara contra "dois métodos GraphRAG melhorados por raciocínio que também suportam múltiplas recuperações", e dentro desse recorte o GraphRAG-R1 ganha de lavada nos dois eixos.
Ou seja: é uma comparação justa dentro de uma família de métodos, não a prova de que o GraphRAG-R1 economiza tokens contra o melhor RAG disponível. Contra o RAG vetorial denso, a conta muda de signo.
3.8 Transferibilidade
O framework se encaixa em retrievers existentes, substituindo apenas a ferramenta de busca sob o GraphRAG-R1. Ganho médio de F1 sobre o método original:
- LightRAG: +38,37% — o maior de todos
- Demais baselines: de +5,26% a +36,25%
O paper também adaptou o DALK (Dynamic Co-Augmentation of LLMs and KG to answer Alzheimer's Disease Questions, EMNLP 2024) — um recuperador originalmente do domínio médico — e o avalia em datasets de domínio geral, com alta relativa de F1 de ~69,50% no Qwen2.5-7B. A direção importa: é um recuperador médico operando em domínio geral, e não o contrário.
4. Implementação: as quatro etapas
4.1 Etapa 1 — Modelagem e ingestão
Esquema primeiro. Defina rótulos de nó, tipos de aresta e atributos válidos antes de escrever qualquer código. O grafo é o contrato.
Dados não estruturados exigem pipeline de NLP:
| Etapa | O que faz |
|---|---|
| NER | Mapeia e categoriza elementos (Serviço, Servidor, Incidente, Vulnerabilidade) |
| Extração de relações | Produz triplas direcionais (Entidade_A, tipo_relação, Entidade_B) |
| Resolução de coreferência | Troca pronomes e menções ambíguas pelo nó canônico |
| Canonicização | Unifica "J. Smith", "John Smith" e "Dr. John Smith" num ID global |
Dados tabulares dispensam tudo isso. Se as chaves estrangeiras já definem os vínculos, o esquema relacional vira vértices e arestas por mapeamento declarativo.
4.2 Etapa 2 — Infraestrutura de grafo
| Banco de grafo dedicado | Engine zero-ETL | |
|---|---|---|
| Exemplos | Neo4j, Amazon Neptune, TigerGraph | PuppyGraph |
| Armazenamento | Listas de adjacência nativas | Virtualizado sobre a fonte (Iceberg, Delta, BigQuery, PostgreSQL, S3) |
| Vantagem | Travessia profunda rápida, Cypher/Gremlin maduros | Sem duplicação, sem dessincronização, reflete o lake em tempo real |
| Custo | Pipeline de ETL para manter em sincronia | Desempenho depende do pushdown da fonte |
4.3 Etapa 3 — O pipeline de indexação
O Microsoft GraphRAG executa nove transformações sequenciais:
1. LoadDocuments — documentos brutos das fontes 2. ChunkDocuments — divisão em text units 3. ExtractGraph — LLM/NER extrai entidades e relações 4. ExtractClaims — declarações e reivindicações associadas 5. EmbedChunks — embeddings dos blocos de texto 6. DetectCommunities — Leiden hierárquico → hierarquia de comunidades 7. EmbedEntities — embeddings de nós e descrições 8. GenerateReports — LLM sintetiza o relatório de cada comunidade 9. EmbedReports — embeddings dos relatórios (habilita a Busca Global)
🧩 A ordem importa.
EmbedReportsé a 9ª etapa e é justamente o que torna a Busca Global possível. Se você pular essa etapa, o GraphRAG funciona apenas como busca local — sem erro, sem aviso, só um sistema mais burro do que a documentação sugere.
Factory Pattern — o framework permite registrar provedores customizados por identificador de string. Sete subsistemas:
| Subsistema | Implementações padrão |
|---|---|
| Language Model | Via wrapper LiteLLM (métodos chat e embed) |
| Input Reader | Text, CSV, JSON, JSONL, Parquet, MarkItDown |
| Cache | File, Blob, CosmosDB |
| Logger | File, Blob |
| Storage | File, Blob, CosmosDB |
| Vector Store | LanceDB, Azure AI Search, CosmosDB |
| Pipeline + Workflows | run_workflow customizado e listas nomeadas |
LLM Caching é obrigatório em produção: requisição idêntica (mesmos parâmetros e prompt) retorna do cache em disco, Blob ou CosmosDB. Garante idempotência na reexecução do pipeline e resiliência a rate limit.
Orquestração: neo4j-graphrag (nativo do Neo4j), a biblioteca Microsoft GraphRAG, ou integração customizada com LangChain e LlamaIndex.
4.4 Etapa 4 — Context fusion
Triple serialization — cada aresta vira frase declarativa:
(Serviço_Autenticação) -[depende_de]-> (Módulo_Pagamentos) (Módulo_Pagamentos) -[executa_em]-> (Cluster_DB_Principal)
Subgraph summarization — um modelo menor converte o subgrafo recuperado em narrativa antes de inseri-lo no prompt principal.
Structured blocks — separa fato de grafo de trecho não estruturado:
<graph_facts> (Serviço_Autenticação)-[AFETA]->(Serviço_Pagamentos) (Serviço_Autenticação)-[EXECUTA_EM]->(Cluster_K8s_Alpha) </graph_facts>
Budget dinâmico de tokens — a alocação muda conforme o tipo de consulta: busca local prioriza triplas próximas por relevância; busca global prioriza relatórios de comunidade de alto nível. Subgrafo que estoura o orçamento sofre pruning por score de caminho.
5. Caso real: AMD sobre Apache Iceberg
🏷️ Esta seção resume um case study de fornecedor (PuppyGraph / MinIO), não uma medição independente. Trate os números como relato do fornecedor, não como benchmark reproduzido.
A AMD construiu sua Data Intelligence Platform sobre Apache Iceberg. O problema: chamados no ServiceNow, tarefas no Jira, commits no GitHub, telemetria e arquivos de configuração estavam em silos, e perguntas como "quais commits introduziram os incidentes mais recorrentes deste componente?" exigiam atravessar todos eles.
A resposta foi o PuppyGraph como camada de grafo zero-copy sobre as tabelas Iceberg — sem carregar os dados para um store de grafo separado.
Stack verificado: MinIO AIStor como object store, Apache Iceberg com catálogo Nessie, Dremio para SQL, PuppyGraph para Cypher e LangChain + Microsoft AutoGen orquestrando agentes — Claude Opus 4 como LLM do agente e GPT-4o como LLM crítico.
Resultados relatados: travessias multi-hop entre chamados, commits e configurações passaram a responder em tempo sub-segundo, contra consultas que antes levavam minutos. O case da MinIO reporta 90%+ de redução na latência de consulta, 95%+ de redução de ciclos de debug e zero pipelines de ETL. O sistema passou a correlacionar chamados novos com alterações de código e correções históricas.
6. Limitações e armadilhas
Sensibilidade à qualidade do grafo. A precisão do GraphRAG é limitada pela qualidade do grafo embaixo. Erro de NER, relação espúria ou duplicação não desduplicada viram aresta falsa — e um grafo ruidoso produz resposta pior que RAG vetorial simples. Esta é a falha mais comum e a mais subestimada.
Atualização e sincronização. Bancos de grafo dedicado exigem ETL contínuo, que falha. Engines zero-ETL leem da fonte primária e eliminam o problema — ao custo de depender do pushdown da fonte.
Explosão combinatória. Travessia de muitos saltos sobre grafo denso cresce explosivamente. Imponha k máximo, timeout e pruning de caminho. Sem isso, uma consulta recursiva sem limite derruba o banco.
Text2Cypher gera consulta inválida. Já citado: esquema no prompt, few-shot e validação sintática antes da execução.
Complexidade de construção. O pipeline de extração chama LLM para cada chunk. Num corpus grande, o custo de indexação supera o de consulta em muitos cenários. Meça antes de comprometer.
7. Checklist de decisão
Fique no RAG vetorial quando:
- As respostas vivem em um único trecho de texto
- As perguntas são diretas e isoladas
- Você não tem orçamento nem equipe para manter um pipeline de extração
Adote GraphRAG quando:
- A pergunta exige conectar fatos distribuídos em documentos heterogêneos
- Você precisa mapear topologia de dependências
- Explicabilidade é requisito regulatório ou de auditoria
- O domínio é relacional por natureza: fraude, cadeia de suprimento, interação medicamentosa
Comece por HybridRAG quando:
- Você não tem certeza de qual padrão domina. A busca vetorial pega o grosso e a travessia em grafo preenche só as lacunas relacionais. Custo incremental baixo, com diagnóstico imediato de onde o grafo realmente agrega.
Prototipe com zero-ETL quando:
- Você quer validar a hipótese antes de pagar migração. Rodar PuppyGraph sobre o lakehouse existente responde "isso funciona?" em horas, não em meses.
Ordem de implantação sugerida:
- Mapear as 20 perguntas mais frequentes dos seus usuários
- Classificar cada uma: fato isolado, multi-hop ou global
- Se menos de 20% exigir multi-hop, não migre — o RAG denso vence
- Prototipar com zero-ETL sobre o lakehouse e medir antes de escalar
- Validar a qualidade do grafo com uma amostra manual de arestas
- Implementar context fusion com budget de tokens e pruning
- Medir o custo de indexação separado do custo de consulta
- Só então avaliar treinamento RL para dosar as chamadas de busca
Referências
- 📚 GraphRAG-R1 (arXiv 2507.23581) — Yu et al., aceito no Web Conference 2026 · GRPO, PRA, CAF, estágios de treino
- 📚 From Local to Global: A Graph RAG Approach to Query-Focused Summarization — Edge et al., 2024 · origem da Busca Global
- 📚 Microsoft GraphRAG — Documentação — pipeline, dataflow, Leiden, subsistemas
- 📚 Microsoft GraphRAG — Default Dataflow — as fases e a detecção de comunidades
- 📚 Microsoft GraphRAG — DRIFT Search — busca híbrida local + global
- 📚 RAG vs. GraphRAG: A Systematic Evaluation (arXiv 2502.11371) — o contraponto: RAG vence em QA geral
- 📚 Do We Still Need GraphRAG? (arXiv 2604.09666) — ganho multi-hop de +27,23, com perda em QA geral
- 📚 In-depth Analysis of Graph-based RAG in a Unified Framework (VLDB) — o custo real: tempo e tokens por método
- 📚 Case study: AMD + Iceberg + PuppyGraph — relato de fornecedor
- 📚 MinIO Customer Story — AMD — métricas de 90% / 95% / 0 ETL
- 🔧 DALK (EMNLP 2024) — recuperador médico usado no teste de transferência
- 🔧 neo4j-graphrag-python — orquestração nativa Neo4j