FMFelipe MiillerNotes on software & systems
HomeBlogAbout
GitHub

Keep building.

Felipe Miiller · © 2026

MailGitHubGitHubLinkedinGitHub
View source on GitHub
Back to blog

GraphRAG na Prática: Arquitetura, Implementação e o Estado da Arte

29/09/2026
13 min de leitura
3706 palavras
RAGArquiteturaDataBase
  • GraphRAG na Prática: Arquitetura, Implementação e o Estado da Arte
  • 1. O problema: quando a resposta está no caminho, não no texto
  • 1.1 O exemplo que expõe o limite
  • 1.2 Comparativo
  • 1.3 O contraponto que quase nenhum artigo traz
  • 2. Os quatro modos de busca
  • 2.1 Busca Local — entity linking + k-hop
  • 2.2 Busca Global — o pipeline de três etapas
  • 2.3 DRIFT Search
  • 2.4 Text2Cypher e GraphRAG agêntico
  • 2.5 HybridRAG
  • 3. GraphRAG-R1: treinar o modelo a decidir quanto buscar
  • 3.1 Rollout-with-Thinking
  • 3.2 Retrieval-Masked Loss
  • 3.3 O objetivo GRPO
  • 3.4 As duas recompensas que controlam custo
  • 3.5 Treinamento em três estágios
  • 3.6 Resultados — F1 verificado
  • 3.7 Eficiência de tokens — com a ressalva que importa
  • 3.8 Transferibilidade
  • 4. Implementação: as quatro etapas
  • 4.1 Etapa 1 — Modelagem e ingestão
  • 4.2 Etapa 2 — Infraestrutura de grafo
  • 4.3 Etapa 3 — O pipeline de indexação
  • 4.4 Etapa 4 — Context fusion
  • 5. Caso real: AMD sobre Apache Iceberg
  • 6. Limitações e armadilhas
  • 7. Checklist de decisão
  • Referências

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ãoVector RAGGraphRAG
Método de recuperaçãoSimilaridade vetorial sobre chunks não estruturadosConsultas estruturadas (Cypher/Gremlin) ou travessia topológica
Raciocínio multi-hopFraco — depende de encadeamento heurístico de promptsForte — o caminho é calculado, não inferido
Eficiência de contextoBaixa — passagens inteiras, ruidosasAlta — triplas e subgrafos, densidade factual alta
ExplicabilidadeBaixa — cita o trecho, não a lógicaAlta — exibe nós, arestas e caminho percorrido
Atualização de conhecimentoDispendiosa — re-chunking + re-embeddingMutação local de nós e arestas
Consultas que atende bemFato isolado, semântica, sumarização diretaDependências, caminhos mínimos, análise de rede, temas globais
Custo de construçãoBaixoAlto — 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:

  1. Entity linking — termos da pergunta viram nós-âncora
  2. k-hop traversal — BFS ou DFS até a profundidade k
  3. 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?"

  1. Detecção hierárquica de comunidades — o grafo é particionado em níveis de granularidade pelo algoritmo Leiden hierárquico
  2. Relatórios de comunidade — um LLM resume cada comunidade, destacando entidades-chave, relações centrais, claims e temas dominantes
  3. 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.

JGRPO(θ)=Eq,{oi}[1G∑i=1Gmin⁡(ρiAi, clip(ρi, 1−ϵ, 1+ϵ)Ai)−βDKL(πθ∥πref)]\mathcal{J}_{GRPO}(\theta) = \mathbb{E}_{q,\{o_i\}} \left[ \frac{1}{G} \sum_{i=1}^{G} \min\left( \rho_i A_i,\ \mathrm{clip}(\rho_i,\, 1-\epsilon,\, 1+\epsilon) A_i \right) - \beta D_{KL}(\pi_\theta \parallel \pi_{ref}) \right]JGRPO​(θ)=Eq,{oi​}​[G1​i=1∑G​min(ρi​Ai​, clip(ρi​,1−ϵ,1+ϵ)Ai​)−βDKL​(πθ​∥πref​)]

com a razão de importância ρi=πθ(oi∣q)/πold(oi∣q)\rho_i = \pi_\theta(o_i|q) / \pi_{old}(o_i|q)ρi​=πθ​(oi​∣q)/πold​(oi​∣q) e a vantagem normalizada dentro do grupo:

Ai=ri−μrσrA_i = \frac{r_i - \mu_r}{\sigma_r}Ai​=σr​ri​−μr​​

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:

Rn={R0,n=1Rn−1+R0⋅kn−1,n>1R_n = \begin{cases} R_0, & n = 1 \\ R_{n-1} + R_0 \cdot k^{n-1}, & n > 1 \end{cases}Rn​={R0​,Rn−1​+R0​⋅kn−1,​n=1n>1​

Com R0=0.5R_0 = 0.5R0​=0.5 e 0<k<10 < k < 10<k<1, o total acumulado converge para a série geométrica 11−kR0\frac{1}{1-k} R_01−k1​R0​ — 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:

RCAF=F1×a×e−bNR_{CAF} = \mathrm{F1} \times a \times e^{-bN}RCAF​=F1×a×e−bN

Com a=2a = 2a=2 e b=0.1b = 0.1b=0.1 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-Judge

3.6 Resultados — F1 verificado

BenchmarkGraphRAG-R1Melhor baselineGanho relativo
HotpotQA38,0027,52 (HippoRAG2)+38,08%
MuSiQue20,0612,35 (R1-Searcher)+62,43%
2Wiki32,2417,54 (Prompt Engineering)+83,81%
PopQA (out-of-domain)35,0429,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étodoHotpotQA — F1 / tokensMuSiQue — F1 / tokens
KGP10,73 / 2.6874,61 / 2.858
ToG11,44 / 3.1375,02 / 2.874
GraphRAG-R138,00 / 1.67420,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:

EtapaO que faz
NERMapeia e categoriza elementos (Serviço, Servidor, Incidente, Vulnerabilidade)
Extração de relaçõesProduz triplas direcionais (Entidade_A, tipo_relação, Entidade_B)
Resolução de coreferênciaTroca pronomes e menções ambíguas pelo nó canônico
CanonicizaçãoUnifica "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 dedicadoEngine zero-ETL
ExemplosNeo4j, Amazon Neptune, TigerGraphPuppyGraph
ArmazenamentoListas de adjacência nativasVirtualizado sobre a fonte (Iceberg, Delta, BigQuery, PostgreSQL, S3)
VantagemTravessia profunda rápida, Cypher/Gremlin madurosSem duplicação, sem dessincronização, reflete o lake em tempo real
CustoPipeline de ETL para manter em sincroniaDesempenho 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:

SubsistemaImplementações padrão
Language ModelVia wrapper LiteLLM (métodos chat e embed)
Input ReaderText, CSV, JSON, JSONL, Parquet, MarkItDown
CacheFile, Blob, CosmosDB
LoggerFile, Blob
StorageFile, Blob, CosmosDB
Vector StoreLanceDB, Azure AI Search, CosmosDB
Pipeline + Workflowsrun_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