Tópico dedicado a Graph RAG — arquitetura, implementação prática e…
INEMA
🧠 HACKS DE FLUXO – GRAPH RAG⌗
🔹 1. Hacks de modelagem do grafo (antes de qualquer código)⌗
✅ Hack 1 — Comece com 1 nível de relacionamento⌗
- ❌ Erro comum: tentar multi-hop (doc → faq → procedure → policy)
-
✅ Melhor:
-
doc → faq
- doc → procedure
80% do valor vem do primeiro salto
✅ Hack 2 — Relacionamentos no metadata primeiro⌗
Antes de criar tabela edges:
{
"related_faq_ids": ["uuid1", "uuid2"],
"related_procedure_ids": ["uuid3"]
}
Depois, se escalar:
- normaliza para uma tabela de edges
📌 Mais rápido para MVP.
✅ Hack 3 — Um grafo lógico > grafo formal⌗
Você não precisa Neo4j.
Postgres + IDs já resolve:
- mais barato
- mais simples
- mais observável
🔹 2. Hacks de ingestão (onde mais dá problema)⌗
✅ Hack 4 — Classificação ≠ Embedding⌗
Use LLM barato para classificar Use embedding separado depois
Nunca peça para o LLM “classificar e embedar” no mesmo prompt
✅ Hack 5 — Sempre faça o LLM cuspir JSON fechado⌗
Prompt com:
Responda APENAS com JSON válido.
Sem texto fora do JSON.
E use:
- retry automático
- “corrija este JSON” se quebrar
✅ Hack 6 — FAQs: quebre tudo⌗
Se um documento tem 10 perguntas:
- split em 10 FAQs
- embed question + answer juntos
🎯 Recall sobe muito.
✅ Hack 7 — IDs semânticos no começo⌗
Mesmo se você ainda não sabe os relacionamentos:
- gere UUIDs
- depois você conecta
Relacionamento pode vir depois da ingestão
🔹 3. Hacks de busca (onde a mágica acontece)⌗
✅ Hack 8 — 3 buscas pequenas > 1 busca grande⌗
Melhor:
- top 3 docs
- top 3 faqs
- top 3 procedures
Pior:
- top 9 misturados
📌 Evita FAQ dominar tudo.
✅ Hack 9 — Graph traversal só nos top resultados⌗
Nunca:
- percorra tudo
Sempre:
- pegue IDs só dos top K
Isso reduz custo e ruído.
✅ Hack 10 — Semântica primeiro, relação depois⌗
Regra fixa:
- vector search
- relation search
Nunca o contrário.
🔹 4. Hacks de contexto (qualidade da resposta)⌗
✅ Hack 11 — Contexto em blocos nomeados⌗
Passe para o LLM assim:
```[DOCUMENTOS PRINCIPAIS] ...
[FAQS RELACIONADAS] ...
[PROCEDIMENTOS RELACIONADOS] ...```
📈 O LLM entende melhor do que texto corrido.
✅ Hack 12 — Limite duro de tokens por bloco⌗
Exemplo:
- documentos: 600 tokens
- faqs: 300 tokens
- procedures: 400 tokens
Corte contexto, não deixe o modelo decidir.
✅ Hack 13 — Proíba inferência⌗
System prompt obrigatório:
“Se não estiver no contexto, diga que não encontrou.”
Isso reduz alucinação drasticamente.
🔹 5. Hacks de custo (importantíssimo)⌗
✅ Hack 14 — Cache de embedding de pergunta⌗
Perguntas repetidas?
- reuse embedding
- economiza $$$
✅ Hack 15 — Embeddings só no ingestion⌗
Nunca re-embed documentos na query.
✅ Hack 16 — Skip traversal se score baixo⌗
Se similaridade < threshold:
- não faz traversal
- responde “não encontrado”
🔹 6. Hacks de debugging (ninguém fala disso)⌗
✅ Hack 17 — Log tudo como grafo⌗
Log:
- query
- IDs retornados
- relacionamentos seguidos
Isso vira:
- auditoria
- melhoria do grafo
✅ Hack 18 — Trace visual do fluxo⌗
Mesmo simples:
Query → Doc#12 → FAQ#7 → Proc#3
Ajuda MUITO a ajustar.
🔹 7. Hacks mentais (arquitetura)⌗
✅ Hack 19 — Graph RAG ≠ conhecimento geral⌗
Use Graph RAG quando:
- dados se referenciam
- contexto importa
- sequência importa
❌ Não use para Wikipedia-like.
✅ Hack 20 — RAG simples + grafo parcial⌗
Você não precisa “converter tudo”:
- 80% RAG normal
- 20% com traversal
🧠 Frase-chave pra equipe⌗
Vector search encontra o ponto. O grafo explica o caminho.
navegação do grafo).
7) Agregar contexto (Context Aggregation)⌗
Monte um “contexto final” unificado:
- Resultados primários (semânticos)
- Contexto relacionado (via IDs)
- Deduplicação
- Ordenação (ex: priorizar primário > relacionado)
Uma estrutura boa:
primary_documents[]primary_faqs[]primary_procedures[]linked_faqs[]linked_procedures[]linked_documents[]
8) Prompt final + geração de resposta⌗
Passe ao LLM:
- pergunta do usuário
- contexto agregado
-
instruções rígidas:
-
“não invente”
- “cite fontes (IDs/títulos)”
- “se faltar, diga que não encontrou”
9) MVP: checklist do que precisa estar pronto⌗
- [ ] Supabase com pgvector
- [ ] 3 tabelas com embeddings
- [ ] Classificador LLM → JSON
- [ ] Validador JSON
- [ ] Embeddings API
- [ ] Inserção no Supabase
- [ ] Busca vetorial nas 3 tabelas
- [ ] Traversal por IDs
- [ ] Agregação do contexto
- [ ] Prompt final e resposta
10) Melhorias recomendadas (depois do MVP)⌗
- Re-ranker (melhora precisão)
- normalização de relacionamentos (tabela
edges) - multi-hop traversal (2º nível)
- controle de acesso (RLS)
- observabilidade (log de queries + recall)
Aqui vai um passo a passo prático (do zero ao funcionando) para implementar um Graph RAG com Supabase + pgvector + OpenAI, bem alinhado ao fluxo .
1) Defina o modelo de dados e os relacionamentos⌗
Você precisa de tabelas por tipo + campos de relacionamento.
Exemplo mínimo (3 tabelas):
-
documents -
id(uuid) title(text)content(text)category(text)status(text)metadata(jsonb)related_faq_id(uuid, nullable)related_procedure_id(uuid, nullable)-
embedding(vector) -
faqs -
id(uuid) question(text)answer(text)metadata(jsonb)-
embedding(vector) -
procedures -
id(uuid) title(text)steps(text)metadata(jsonb)embedding(vector)
📌 O “grafo” nasce dos IDs (related_faq_id, related_procedure_id) e/ou listas de IDs dentro de metadata.
2) Crie o projeto no Supabase e habilite pgvector⌗
- Criar projeto no Supabase
- No SQL Editor, executar:
create extension if not exists vector;
- Criar as tabelas com coluna
embedding vector(1536)(se usartext-embedding-3-small, por exemplo) - Criar índices vetoriais (recomendável):
ivfflatouhnsw(depende da versão/config)
3) Escreva o “Schema Pack” para o LLM⌗
O LLM precisa receber a descrição e o schema para classificar corretamente.
Monte um objeto como:
- nome da tabela
- descrição
- colunas obrigatórias
- tipos
- relacionamentos aceitos
Isso entra sempre no prompt de ingestão.
4) Implemente o pipeline de ingestão (Ingestion Flow)⌗
4.1 Receber o dado bruto⌗
Entrada pode ser:
- JSON
- texto
- arquivos (pdf, doc, etc.) — opcional pro MVP
4.2 Classificação (LLM)⌗
Faça o LLM responder:
- qual tabela (
documents|faqs|procedures) - campos preenchidos conforme schema
- IDs relacionados (se existirem)
Saída do LLM tem que ser JSON.
4.3 Validação do JSON⌗
Valide com:
- JSON Schema / Zod / Pydantic
- Regras: campos obrigatórios, tipos, limites
Se falhar:
- ou re-pede ao LLM “corrigir JSON”
- ou rejeita a entrada
4.4 Geração de embedding (OpenAI)⌗
Crie o texto a embedar por tipo:
- Document:
title + "\n" + content - FAQ:
question + "\n" + answer - Procedure:
title + "\n" + steps
Chame embeddings API e receba vetor.
4.5 Inserir no Supabase (roteador)⌗
Com base no tipo classificado:
- insere na tabela correta
- salva
embedding+metadata+related_*
5) Implemente busca semântica por tabela (3 buscas em paralelo)⌗
Quando vem uma pergunta do usuário:
- Gerar embedding da pergunta
- Rodar 3 buscas vetoriais:
- documents
- faqs
- procedures
Cada busca retorna:
- top K registros
- com
ide metadados contendo relacionamentos
📌 Importante: o retorno precisa incluir related_faq_id / related_procedure_id (ou listas no metadata).
6) Implementar “Graph Traversal” (busca por IDs relacionados)⌗
Agora vem a parte Graph RAG:
A partir dos resultados semânticos:
- coletar todos
related_faq_id - coletar todos
related_procedure_id - (opcional) coletar “source_document_id” se existir
Depois, fazer consultas diretas no Supabase:
select * from faqs where id in (...)select * from procedures where id in (...)- etc.
📌 Isso é “traversal” (navegação do grafo).
7) Agregar contexto (Context Aggregation)⌗
Monte um “contexto final” unificado:
- Resultados primários (semânticos)
- Contexto relacionado (via IDs)
- Deduplicação
- Ordenação (ex: priorizar primário > relacionado)
Uma estrutura boa:
primary_documents[]primary_faqs[]primary_procedures[]linked_faqs[]linked_procedures[]linked_documents[]
8) Prompt final + geração de resposta⌗
Passe ao LLM:
- pergunta do usuário
- contexto agregado
-
instruções rígidas:
-
“não invente”
- “cite fontes (IDs/títulos)”
- “se faltar, diga que não encontrou”
9) MVP: checklist do que precisa estar pronto⌗
- [ ] Supabase com pgvector
- [ ] 3 tabelas com embeddings
- [ ] Classificador
🧩 Componentes Principais do Sistema⌗
1. LLM (Large Language Model – ex: OpenAI GPT)⌗
Funções:
- Classificar os dados de entrada (documento, FAQ ou procedimento)
- Validar e ajustar o JSON conforme o schema
- Entender relacionamentos entre entidades
- Orquestrar a estratégia de busca (semântica + relacional)
- Gerar a resposta final ao usuário
📌 Usado em múltiplas etapas, não apenas na resposta final.
2. Supabase (PostgreSQL + pgvector)⌗
Funções:
- Armazenar os dados estruturados
- Armazenar embeddings vetoriais
- Manter chaves estrangeiras (IDs relacionados)
-
Executar:
-
Busca vetorial
- Consultas diretas por ID
- Filtros por relacionamento
📌 Atua como:
- Banco relacional
- Banco vetorial
- Base do “grafo” (via FKs)
3. Vector Store (pgvector no Supabase)⌗
Funções:
- Armazenar embeddings
- Executar similaridade semântica
- Retornar metadados com IDs relacionados
Cada tabela possui seu próprio índice vetorial:
- documents_vectors
- faqs_vectors
- procedures_vectors
4. Agente de Ingestão (Ingestion Agent)⌗
Funções:
- Receber dados brutos
- Aplicar schema awareness
- Classificar o conteúdo
- Enviar para o roteador correto
Pode ser:
- Um agent LLM
- Um pipeline (LangChain / custom)
5. Roteador de Dados (Router)⌗
Funções:
-
Direcionar dados para:
-
Tabela Documents
- Tabela FAQs
- Tabela Procedures
Baseado em:
- Saída do LLM
- Tipo de dado identificado
6. Parser & Validador JSON⌗
Funções:
- Converter texto do LLM em JSON
- Validar estrutura e tipos
- Garantir compatibilidade com o schema do banco
Pode usar:
- Funções customizadas
- JSON Schema
- Pydantic / Zod
7. Agente de Consulta (Query Agent / Graph RAG Agent)⌗
Funções:
- Executar buscas vetoriais paralelas
- Interpretar metadados
- Navegar pelos relacionamentos (graph traversal)
- Agregar contexto
- Produzir resposta final
🔌 APIs Utilizadas⌗
1. OpenAI Embeddings API⌗
Uso:
- Converter texto (título + conteúdo) em vetores
Chamadas via:
- HTTP request direto (não via agent, no exemplo)
📌 Exemplo:
POST /v1/embeddings
2. OpenAI Chat / Responses API⌗
Uso:
- Classificação de dados
- Validação de schema
- Orquestração da busca
- Geração da resposta final
📌 Exemplo:
POST /v1/chat/completions
3. Supabase REST API⌗
Uso:
- Inserir dados nas tabelas
- Consultar por ID
- Filtrar registros relacionados
- Executar buscas vetoriais
4. PostgreSQL (SQL + pgvector)⌗
Uso:
- Criação de tabelas
- Criação de índices vetoriais
- Queries de similaridade
- Joins lógicos via IDs
📌 Inclui:
- SQL custom
- Funções RPC do Supabase
🧠 Como esses componentes trabalham juntos⌗
```Dados → LLM (classificação) → Parser / Validador → Embeddings API → Supabase (vector + relational)
Pergunta → Query Agent → Busca Vetorial (3 tabelas) → IDs relacionados → Queries diretas (graph traversal) → Resposta final (LLM)```
🧩 Stack típica resumida⌗
| Camada | Tecnologia |
|---|---|
| LLM | OpenAI (GPT + Embeddings) |
| Banco vetorial | Supabase + pgvector |
| Banco relacional | PostgreSQL |
| Orquestração | Agent LLM |
| Validação | JSON Schema / Pydantic |
| APIs | OpenAI + Supabase |
| Arquitetura | Graph RAG |
🧠 Do que trata o fluxo?⌗
Ele mostra como construir e operar um Graph RAG Agent que:
- Usa Supabase como banco vetorial
- Trabalha com múltiplos tipos de dados (Documentos, FAQs e Procedimentos)
- Entende e explora relações entre esses dados, em vez de tratá-los como textos isolados
🔄 Visão geral do fluxo⌗
1. Estrutura dos dados (modelo em grafo)⌗
-
Existem três tabelas principais:
-
Documents
- FAQs
- Procedures
-
Cada registro pode conter:
-
Conteúdo textual (título, texto, etc.)
-
IDs de relacionamento, como:
related_faq_idrelated_procedure_id
Esses IDs conectam os dados entre si, formando um grafo de informações.
2. Ingestão dos dados⌗
O agente recebe:
- Dados de teste
- Definição dos esquemas das tabelas (colunas + significado)
O fluxo de ingestão é:
- LLM classifica o dado
-
Decide se o conteúdo é um documento, FAQ ou procedimento 2. Validação de schema
-
Garante que o JSON gerado segue o formato correto 3. Geração de embeddings
-
Usa título + conteúdo para criar vetores 4. Roteamento inteligente
-
Envia o dado para a tabela correta no Supabase 5. Preservação de relações
-
IDs relacionados são salvos nos metadados do vetor
📌 O ponto crítico aqui é:
o agente entende onde o dado entra e com quem ele se relaciona
3. Busca e recuperação (Query Flow)⌗
Quando o usuário faz uma pergunta:
- Busca semântica paralela
-
O agente consulta 3 bancos vetoriais ao mesmo tempo:
- documentos
- FAQs
- procedimentos
- Retorno com metadados
- Cada resultado vem com IDs de relacionamento
- Travessia do grafo
-
O agente usa esses IDs para buscar:
- FAQs relacionadas
- Procedimentos relacionados
- Documentos conectados
- Estratégia dupla
- 🔍 Busca vetorial → encontra o conteúdo principal
- 🔗 Consulta por ID → traz o contexto conectado
- Agregação de contexto
- Junta tudo em uma resposta mais completa e coerente
🎯 Em resumo⌗
O fluxo é sobre:
- Como ingerir dados estruturados
- Como manter relações explícitas entre eles
- Como combinar busca semântica + relações de banco
- Como evitar respostas isoladas ou “alucinadas”
👉 Em vez de:
“encontrei este trecho parecido”
O agente consegue:
“encontrei este documento e os FAQs e procedimentos diretamente ligados a ele”
Assistente RAG de Grafos
Fluxo de Ingestão e Vetorização de Dados⌗
Entrada de dados com reconhecimento de esquema: O agente recebe dados de teste juntamente com definições de tabelas (documentos, FAQs, procedimentos) com mapeamentos de relacionamento.
Classificação de dados via LLM: Analisa os dados recebidos com base nos esquemas para determinar a atribuição correta à tabela.
Parsing e validação JSON: Extrai dados estruturados e valida conforme regras de esquema predefinidas.
Geração de embeddings OpenAI: Converte título + conteúdo em vetores por meio de requisição HTTP.
Roteamento inteligente: Direciona os dados para a tabela apropriada no Supabase com base na classificação (documentos/FAQs/procedimentos).
Preservação de relacionamentos: Armazena IDs de chave estrangeira (related_faq_id, related_procedure_id) nos metadados para permitir a navegação em grafo.
Fluxo de Recuperação em Grafo e Geração de Respostas⌗
Busca semântica em múltiplas tabelas: O agente consulta simultaneamente três repositórios vetoriais separados (um por tipo de dado).
Recuperação vetorial inicial: Retorna trechos relevantes com IDs de relacionamento embutidos nos metadados.
Navegação de relacionamentos: Utiliza os IDs retornados para buscar registros diretamente conectados nas tabelas relacionadas.
Estratégia de busca dupla: Combina busca semântica para resultados primários + consultas diretas por ID para contexto vinculado.
Agregação de contexto: Mescla dados semanticamente relevantes com informações conectadas relacionalmente para respostas abrangentes.
Caso de Negócio / Caso de Uso⌗
Solução: Um sistema RAG baseado em grafos que compreende os relacionamentos entre diferentes tipos de dados — entregando respostas que combinam conteúdo semanticamente relevante com informações diretamente relacionadas em tabelas interconectadas.
Proposta de Valor⌗
Completude Contextual: Inclui automaticamente documentos, FAQs e procedimentos relacionados, em vez de trechos isolados.
Navegação Estruturada do Conhecimento: Segue relacionamentos explícitos entre tipos de dados da mesma forma que um humano conecta informações.
Redução de Alucinação: Aproveita relacionamentos definidos em vez de inferir conexões, aumentando a precisão.
Arquitetura de Dados Escalável: Lida com bases de conhecimento complexas e multi-entidade que uma busca vetorial simples não consegue navegar.
Compradores Ideais / Indústrias⌗
TI Corporativa & Suporte: Sistemas de documentação em que guias, etapas de troubleshooting e FAQs se referenciam mutuamente.
Sistemas de Saúde: Prontuários médicos conectando diagnósticos, protocolos de tratamento, medicamentos e históricos de pacientes.
Compliance & Regulatório: Sistemas de auditoria conectando políticas, procedimentos, incidentes e ações corretivas.
Desenvolvimento de Produtos: Documentação de engenharia relacionando especificações, procedimentos de teste, issues e decisões de design.
Serviços Jurídicos: Gestão de casos ligando contratos, precedentes, petições e correspondências relacionadas.
Plataformas Educacionais: Materiais de curso conectando aulas, atividades, pré-requisitos e recursos.
Recursos Agente RAG de grafos
nm79 - Assistente RAG de Grafos Vetores
1