A tese desta página: embedding responde "o que se parece com isto". Grafo responde "o que se conecta a isto". São perguntas diferentes, e a maior parte da frustração com busca semântica vem de fazer a segunda esperando que a primeira responda. A boa notícia é que dá para saber de antemão qual das duas você tem e as etapas 1 e 4 mostram exatamente como.
Quando o vetor basta (a maioria das vezes)
perguntas de um salto: "o que é X", "como faço Y"
busca por tema, onde o resultado certo é textualmente parecido
corpus sem estrutura clara de entidades e relações
Quando ele não basta
múltiplos saltos: a resposta não se parece com a pergunta
agregação: "quantos", "todos os", "qual a soma de"
perguntas globais: "quais são os grandes temas deste corpus"
Explore cada etapa →
A matemática, num só lugar
As 4 contas desta página. Clique em qualquer uma para pular direto para a etapa que a explica.
Honestidade, antes de começar: o conjunto de dados é fictício e minúsculo 14 entidades e 18 relações sobre uma cadeia de suprimento inventada. É pequeno de propósito: dá para você conferir cada resposta contando com o dedo, que é o objetivo. O que roda de verdade: o layout (força-mola determinística, mesmo desenho em toda visita), a travessia (busca em largura), a busca vetorial (cosseno sobre embeddings derivados do texto de cada nó), a detecção de comunidades (propagação de rótulos) e a fusão de rankings (RRF). O embedding é de saco de palavras com hashing, muito mais pobre que um modelo real mas é o mesmo mecanismo dos dois lados da comparação, então o vetor não perde por estar mal implementado. Ele perde porque a pergunta é outra.
A busca vetorial tem uma operação só: ordenar por distância e cortar em k. Ela é excelente nisso, e é o suficiente para a maior parte dos sistemas. Existem exatamente duas famílias de pergunta que essa operação não consegue nem formular, e não é questão de trocar o modelo de embedding por um melhor.
1 · Múltiplos saltos
A resposta certa não se parece com a pergunta. "Quem é a metalurgista responsável pela liga que causou o recall?" tem como resposta um nome de pessoa que não aparece em nenhum texto sobre recalls. O caminho existe, mas ele é feito de arestas, e a distância no espaço vetorial não conhece arestas.
2 · Agregação
"Quantos", "todos os", "qual a soma". O top-k devolve k resultados esse é o contrato. Se a resposta correta exige olhar 40 registros, um top-10 não os vê, e o pior é que ele não tem como saber que não viu. O modelo recebe 10 trechos, não recebe nenhum aviso de incompletude, e responde com confiança total sobre uma amostra.
O teste de três segundos: pegue as dez perguntas mais frequentes do seu sistema e classifique cada uma. Ela é respondida por um documento? Vetor resolve. Ela precisa de vários documentos ligados por uma relação, ou de contar/somar sobre um conjunto? Aí é grafo ou pelo menos um híbrido. Se nove das dez são do primeiro tipo, monte o vetor e vá embora: a etapa 7 mostra o que um grafo custa para manter, e não vale a pena pela décima.
Um grafo de conhecimento é uma lista de fatos com três campos: sujeito, relação, objeto. É isso. A estrutura é banal o mapa abaixo é o conjunto inteiro desta página, e você consegue ler todos os fatos dele em um minuto.
O conjunto inteiro
clique num nó do mapa para ver a vizinhança dele
O layout é determinístico
O desenho acima não é aleatório nem foi posicionado à mão: é uma simulação de força-mola (repulsão entre todos os pares, atração ao longo das arestas) com semente fixa e número de iterações fixo. Roda no seu navegador e dá exatamente o mesmo resultado toda vez, em qualquer máquina. Num material didático isso importa: permite o texto falar de "o nó da direita" sem estar mentindo para metade dos leitores.
Propriedades: o que o desenho esconde
Um grafo útil guarda mais do que a tripla. Cada aresta carrega quando o fato passou a valer, quando deixou, de qual documento ele foi extraído e com que confiança. Sem proveniência por aresta não há como reprocessar de forma incremental nem resolver conflito e as duas coisas aparecem no primeiro mês. É a diferença entre um grafo que dura e uma demonstração bonita.
A parte difícil não é o grafo: é chegar até ele. Alguém precisa transformar prosa em triplas, e hoje esse alguém é um LLM que cobra por token e erra. Abaixo está um parágrafo e as cinco triplas que um extrator tirou dele. Uma delas está errada. Ache antes de clicar.
O texto de origem
Triplas extraídas do parágrafo acima
clique numa tripla para ver a análise
Honestidade o erro acima é real, não é enfeite: perder negação e tempo verbal é a classe de erro mais comum na extração de relações, e é a pior porque é silenciosa. A tripla resultante é gramaticalmente perfeita, semanticamente plausível, e simplesmente falsa. Nenhuma validação de esquema pega isso; nenhum teste automático pega isso. Só uma pessoa lendo o texto original ao lado da tripla pega e é por isso que a etapa 7 lista curadoria humana como item de custo, não como boa prática opcional.
extrair com proveniência desde a primeira linha
# O esquema força o modelo a devolver o que você precisa DEPOIS,# não só o que parece bonito agora. Os três últimos campos são# o que separa um grafo mantível de uma demonstração.
SCHEMA = {
"type": "object",
"properties": {"triples": {"type": "array", "items": {
"type": "object",
"properties": {
"subject": {"type": "string"},
"relation": {"type": "string", "enum": RELACOES_PERMITIDAS},
"object": {"type": "string"},
"evidence": {"type": "string"}, # a frase exata. inegociável."negated": {"type": "boolean"}, # pergunte explicitamente"valid_from": {"type": ["string", "null"]},
},
"required": ["subject", "relation", "object", "evidence", "negated"],
"additionalProperties": False,
}}},
"required": ["triples"], "additionalProperties": False,
}
# O enum de relações é o que impede o grafo de virar sopa:# sem ele o modelo inventa "fornece", "fornecia", "é fornecedor de"# como três relações distintas, e a travessia não acha nada.# E a checagem que salva o projeto:for t in resposta["triples"]:
if t["evidence"] notin documento:
descartar(t) # evidência inventada = tripla inventadaif t["negated"]:
descartar(t) # ou grave como aresta negativa
// A aresta carrega proveniência. Sem isto, uma correção de// documento obriga a reprocessar o corpus inteiro.MERGE (s:Entidade {nome: $subject})
MERGE (o:Entidade {nome: $object})
MERGE (s)-[r:FORNECE_PARA]->(o)
SET r.doc_id = $doc_id,
r.evidencia = $evidence,
r.confianca = $conf,
r.valido_de = $valid_from,
r.extraido_em = datetime();
// Reprocessamento incremental: some tudo o que veio do documento// que mudou, e só então reextraia. Uma linha, e ela é a diferença// entre atualizar em minutos e reprocessar tudo por uma semana.MATCH ()-[r]->() WHERE r.doc_id = $doc_id DELETE r;
// A consulta de três saltos que a etapa 4 executa:MATCH path = (e:Evento {nome: "Recall 2024"})-[*1..3]-(p:Entidade {tipo: "pessoa"})
RETURN p.nome, [rel IN relationships(path) | type(rel)] AS caminho
ORDER BY length(path) LIMIT5;
A mesma pergunta, os mesmos 14 nós, dois mecanismos. À esquerda, a travessia percorre arestas. À direita, o cosseno ordena por distância. Nenhum dos dois está mal implementado e é exatamente por isso que a comparação diz alguma coisa.
Escolha a pergunta
O caminho percorrido
top-5
Repare no controle de top-k: aumente até 14 e o vetor "encontra" a resposta porque com k igual ao tamanho do conjunto, tudo está na lista. Isso não é o vetor acertando: é a lista deixando de filtrar. Num corpus de um milhão de trechos você não pode fazer k = um milhão, e é aí que a diferença deixa de ser acadêmica. A posição na lista é o que importa, não a presença nela porque o que entra no prompt são os primeiros.
Grafo grande também não cabe no prompt. Se a pergunta é global "quais são os grandes temas deste corpus", "que riscos aparecem repetidamente" nenhum top-k e nenhuma travessia resolvem, porque a resposta não está em nó nenhum: está na forma do grafo inteiro. É o problema que o GraphRAG ataca.
A ideia, em três passos
Um: agrupe o grafo em comunidades conjuntos de nós que se conectam mais entre si do que com o resto. Dois: peça a um LLM um resumo de cada comunidade, e depois resumos dos resumos, formando uma hierarquia. Três: para uma pergunta global, responda a partir dos resumos do nível certo, em vez de tentar enfiar o grafo no contexto. É caro de construir e responde perguntas que nenhuma outra abordagem alcança.
Honestidade · o custo do GraphRAG
Resumir toda comunidade de um corpus grande custa uma passagem de LLM por comunidade, em vários níveis e os resumos envelhecem junto com o grafo. Cada atualização relevante pede resumo novo das comunidades afetadas e dos níveis acima delas. Antes de adotar, tenha uma pergunta global concreta que hoje você não consegue responder. "Seria bom ter uma visão geral" não paga essa conta.
A resposta certa quase nunca é escolher um dos três. Vetor, grafo e busca léxica erram em casos diferentes e quando os erros são independentes, juntar as listas melhora as duas pontas. A parte boa: a fusão que funciona é ridiculamente simples e não precisa de nenhuma calibração.
As três listas, e a fusão delas
A fusão recíproca de rankings (RRF) soma 1/(k + posição) de cada lista. Não precisa de calibração, não precisa que as pontuações sejam comparáveis entre si, e bate combinações lineares ajustadas na maioria dos casos publicados. É a coisa mais barata que você pode fazer para melhorar recuperação.
Repare no que a fórmula não usa: as pontuações. Ela só usa a posição e é justamente isso que a torna robusta, porque um cosseno de 0,83 e um BM25 de 14,2 não são comparáveis por nenhuma normalização honesta. O k = 60 é uma constante amortecedora que impede o primeiro lugar de dominar tudo; o valor veio do artigo original e quase ninguém precisa ajustar.
A ordem de adoção que funciona: comece com vetor, porque resolve a maioria e custa pouco. Acrescente léxico em seguida é quase de graça e conserta o buraco clássico do vetor, que é buscar código de produto, sigla e nome próprio raro. Só então, e só se as suas perguntas pedirem, acrescente o grafo. Inverter essa ordem é o caminho conhecido para um projeto de seis meses que entrega o que um índice vetorial de duas semanas entregaria.
Construir um grafo é um projeto: tem escopo, tem fim, alguém apresenta o resultado. Mantê-lo correto enquanto os documentos mudam é uma operação contínua que ninguém orça e é onde a maioria dos grafos de conhecimento morre, geralmente por volta do oitavo mês.
A calculadora de custo
Os seis itens, e só o primeiro costuma estar no orçamento
O item que decide se o grafo sobrevive: a curadoria. Um erro de extração de 5% parece aceitável até você perceber que ele não se distribui uniformemente ele se concentra nas construções difíceis, que são justamente as informativas: negações, condicionais, mudanças de estado. Em seis meses sem revisão, as perguntas interessantes passam a receber respostas erradas com convicção, alguém percebe, e o grafo inteiro perde a confiança da equipe de uma vez. Reserve tempo de gente desde o primeiro mês, ou não comece.
O caminho inteiro
No fim: grafo não é o próximo degrau natural depois do vetor é uma estrutura diferente, para uma pergunta diferente. A pergunta que decide não é "meu sistema poderia ser melhor?" (sempre poderia) e sim "minhas perguntas atravessam relações ou agregam sobre conjuntos?". Se atravessam, o grafo responde coisas que nenhum top-k alcança, e a etapa 4 mostra isso rodando. Se não atravessam, um grafo é um projeto caro para chegar onde o índice vetorial já chegou e a etapa 7 mostra quanto ele cobra por ano para continuar existindo.