Há uma tentação contemporânea de tratar “RAG” como uma palavra mágica.
Coloca-se um PDF num balde, conecta-se um modelo de linguagem, e — supostamente — nasce inteligência contextual.

Na prática, o que nasce é outra coisa: uma cadeia de decisões técnicas.
E cada decisão altera o que você chama de “resposta correta”.

Este texto é um tutorial completo para montar um RAG (Retrieval-Augmented Generation) ou um CAG (Context-Augmented Generation) usando o n8n.

Não é um guia performático.
É um guia reproduzível.


1. Antes de começar: RAG vs CAG

RAG — Retrieval-Augmented Generation

Você:

  1. Divide documentos em chunks
  2. Gera embeddings
  3. Armazena em um banco vetorial
  4. Recupera os vetores mais próximos da pergunta
  5. Injeta no prompt

É estatística vetorial aplicada à linguagem.

CAG — Context-Augmented Generation

Você:

  • Não usa busca vetorial.
  • Injeta contexto estruturado (SQL, APIs, dados vivos).
  • A resposta depende de estado atual do sistema.

RAG é memória indexada.
CAG é contexto vivo.

Você pode (e talvez deva) usar ambos.


2. Arquitetura Geral no n8n

Um fluxo mínimo de RAG no n8n tem dois workflows:

Workflow A — Ingestão

Documento → Chunk → Embedding → Vector DB

Workflow B — Pergunta

Pergunta → Embedding → Busca vetorial → Prompt → LLM → Resposta


3. Stack Recomendada (Reproduzível)

Você pode usar:

  • n8n (self-hosted ou cloud)
  • Banco vetorial:
    • Supabase (pgvector)
    • Pinecone
    • Qdrant
    • Weaviate
  • LLM:
    • OpenAI
    • Anthropic
    • Groq
  • Embeddings:
    • text-embedding-3-large (OpenAI)
    • alternatives open-source

4. Workflow 1 — Ingestão de Documentos

Passo 1 — Entrada do Documento

Node:

  • Read Binary File
    ou
  • Webhook (upload)

Passo 2 — Extração de Texto

Use:

  • PDF Extract
    ou
  • Function Node com pdf-parse

Passo 3 — Chunking

Chunking é onde a maioria erra.

No Function Node:

const text = $json.text;
const chunkSize = 800;
const overlap = 150;

let chunks = [];
for (let i = 0; i < text.length; i += chunkSize - overlap) {
  chunks.push({
    content: text.slice(i, i + chunkSize)
  });
}

return chunks.map(c => ({ json: c }));

Premissas:

  • 800 caracteres ~ 150-200 tokens
  • Overlap evita perda de contexto

Limitação:
Chunk mal definido gera busca ruim.


Passo 4 — Gerar Embeddings

Node:

  • OpenAI → Create Embedding

Entrada:

{{$json.content}}

Saída:
Vetor numérico (ex: 1536 dimensões)


Passo 5 — Armazenar no Banco Vetorial

Exemplo usando Supabase (pgvector):

Tabela:

CREATE TABLE documentos (
  id bigserial PRIMARY KEY,
  content text,
  embedding vector(1536)
);

Inserção via node PostgreSQL:

INSERT INTO documentos (content, embedding)
VALUES ($1, $2);

5. Workflow 2 — Pergunta e Resposta

Agora o fluxo interessante.


Passo 1 — Receber Pergunta

Node:

  • Webhook
    ou
  • Telegram
    ou
  • HTTP

Passo 2 — Embedding da Pergunta

Mesmo modelo usado na ingestão.

Consistência é obrigatória.


Passo 3 — Busca Vetorial

Query exemplo (pgvector):

SELECT content
FROM documentos
ORDER BY embedding <-> $1
LIMIT 5;

Isso retorna os 5 trechos mais próximos.


Passo 4 — Construção do Prompt

Aqui mora a diferença entre “funciona” e “parece inteligente”.

Function Node:

const context = items.map(i => i.json.content).join("nn");

return [{
  json: {
    prompt: `
Você deve responder APENAS com base no contexto abaixo.

Contexto:
${context}

Pergunta:
{{$json.question}}

Se não houver informação suficiente, diga que não sabe.
`
  }
}];

Passo 5 — Chamada ao LLM

Node:

  • OpenAI Chat
    ou
  • Anthropic

Entrada:

{{$json.prompt}}

Saída:
Resposta contextualizada.


6. CAG no n8n (quando RAG não basta)

Imagine que você quer responder:

“Qual foi o faturamento ontem?”

Isso não está num PDF.
Está num banco.

Fluxo CAG:

Pergunta → Parser → SQL → Resultado → Prompt → LLM

Você pode:

  1. Usar um LLM para gerar SQL
  2. Executar SQL
  3. Passar resultado como contexto

Arquitetura:

Pergunta
→ Classificador (é pergunta de base?)
→ Se sim: roda SQL
→ Injeta no prompt

Isso é CAG.


7. Problemas Comuns

1. Chunk grande demais

→ embedding diluído

2. Pouco overlap

→ contexto quebrado

3. Misturar modelo de embedding

→ incompatibilidade vetorial

4. Não limitar temperatura

→ alucinação mesmo com contexto


8. Métricas que você deveria medir

Pouca gente mede. Deveria.

  • Recall (se o trecho correto está nos top 5)
  • Tempo de resposta
  • Custo por query
  • Taxa de “não sei”

Sem métrica, é só teatro.


9. Arquitetura Final Recomendada

Se for projeto sério:

  • Banco vetorial dedicado
  • Logs de consultas
  • Versionamento de embeddings
  • Avaliação automática de respostas

10. Conclusão

RAG não é inteligência.
É organização estatística da memória.

CAG não é magia.
É integração de contexto.

O n8n é apenas o orquestrador — um palco silencioso onde os nós executam seu papel sem aplauso.

O que define qualidade não é o modelo.
É a disciplina na construção do pipeline.

E talvez o ponto mais importante:

RAG ruim parece impressionante nas primeiras cinco perguntas.
RAG bom continua funcionando na pergunta cinquenta.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *