O que é RAG (geração aumentada por recuperação)

RAG é a técnica que busca trechos relevantes nos seus dados e os coloca no prompt do LLM antes de ele responder. Assim a resposta se apoia em informação atual e própria.

Atualizado em 5 min de leitura

Objetivos de aprendizado

Depois de ler este artigo, você vai conseguir:

  • Entender as etapas de um sistema RAG, da indexação à resposta
  • Saber o que é chunking, embedding e recuperação
  • Decidir quando usar RAG, fine-tuning ou só um prompt maior
Nesta página

Um LLM só sabe o que viu no treinamento. Ele não conhece o manual interno da sua empresa, o catálogo que você atualizou ontem nem a documentação do seu produto. Pergunte sobre isso e ele vai admitir que não sabe ou inventar uma resposta com cara de verdade.

RAG (do inglês retrieval-augmented generation, geração aumentada por recuperação) resolve isso sem treinar nada. Antes de perguntar ao modelo, o seu código busca os trechos mais relevantes nos seus próprios dados e os entrega junto com a pergunta. O modelo passa a responder lendo, não lembrando.

Indexação (uma vez)DocumentosChunksEmbeddingsÍndiceConsulta (a cada pergunta)PerguntaembeddingRecuperar1top-k2Aumentar o promptcontexto: chunkcontexto: chunkperguntaGerarLLM3Resposta
O RAG recupera os trechos certos, aumenta o prompt com eles e só então o LLM gera a resposta.

Como funciona um sistema RAG?#

São duas fases. A primeira roda uma vez (e de novo quando os dados mudam); a segunda roda a cada pergunta.

Indexação:

  1. Você junta os documentos (PDFs, páginas, artigos de ajuda, linhas de banco).
  2. Divide cada um em pedaços menores, os chunks.
  3. Gera um embedding de cada chunk com um modelo de embeddings.
  4. Guarda chunk e embedding num índice.

Consulta:

  1. O usuário faz uma pergunta.
  2. Você gera o embedding da pergunta com o mesmo modelo.
  3. Busca no índice os k chunks mais próximos (recuperação).
  4. Monta um prompt com esses chunks como contexto.
  5. Envia o prompt ao LLM, que gera a resposta.

O "aumentada" do nome vem do passo 4: o prompt é aumentado com informação recuperada.

O que são chunks e embeddings?#

Um chunk é um trecho de texto pequeno o bastante para caber no prompt junto com vários outros, e grande o bastante para fazer sentido sozinho. Um parágrafo ou uma seção curta costuma funcionar. Chunks muito pequenos perdem contexto, e chunks muito grandes diluem o assunto e gastam tokens.

Um embedding é uma lista de números que um modelo gera para representar o significado do texto. Textos com significado parecido geram vetores próximos, mesmo sem palavras em comum. É isso que permite achar "como pedir meu dinheiro de volta" quando o documento diz "política de reembolso". Guardar esses vetores e buscar por proximidade é o trabalho de um banco de dados vetorial.

Como é um RAG em código?#

O exemplo abaixo mostra o esqueleto inteiro em Python, sem dependências. Para ficar executável, a recuperação usa sobreposição de palavras em vez de embeddings, e o resultado é o prompt que você enviaria ao LLM.

python
import math
import re
from collections import Counter

DOCS = [
    "Reembolsos são aceitos em até 7 dias após a compra.",
    "O suporte atende de segunda a sexta, das 9h às 18h.",
    "Para trocar a senha, abra Configurações e clique em Segurança.",
]

def tokens(texto):
    return re.findall(r"\w+", texto.lower())

def similaridade(a, b):
    ca, cb = Counter(tokens(a)), Counter(tokens(b))
    prod = sum(ca[t] * cb[t] for t in ca)
    norma = math.sqrt(sum(v * v for v in ca.values())) * math.sqrt(sum(v * v for v in cb.values()))
    return prod / norma if norma else 0.0

def recuperar(pergunta, k=1):
    return sorted(DOCS, key=lambda d: similaridade(pergunta, d), reverse=True)[:k]

def montar_prompt(pergunta):
    contexto = "\n".join(recuperar(pergunta))
    return (
        "Responda usando apenas o contexto abaixo. "
        "Se a resposta não estiver nele, diga que não sabe.\n\n"
        f"Contexto:\n{contexto}\n\nPergunta: {pergunta}"
    )

print(montar_prompt("Em quantos dias posso pedir reembolso?"))

A saída é o prompt com o trecho sobre reembolsos no contexto. Repare que a busca por palavras é frágil: "reembolso" e "reembolsos" são tokens diferentes, e o acerto veio de "em" e "dias". Num sistema real, você troca essa busca por embeddings, que medem a similaridade pelo significado. O resto do fluxo (montar o prompt e chamar o LLM) fica igual.

Quando usar RAG e quando não usar?#

RAG funciona bem quando:

  • os dados mudam com frequência (preços, documentação, políticas);
  • os dados são privados e não estão no treinamento do modelo;
  • você precisa citar de onde veio a resposta, porque cada chunk tem origem conhecida;
  • o volume de texto não cabe inteiro no prompt.

RAG é desnecessário quando:

  • todo o conteúdo cabe no prompt: nesse caso basta enviá-lo inteiro;
  • você quer mudar o estilo ou o formato das respostas, que é trabalho para prompt ou fine-tuning;
  • a pergunta exige raciocínio sobre o conjunto todo (como "resuma tudo"), porque a recuperação traz só alguns trechos.

RAG ou fine-tuning?#

O fine-tuning ajusta os pesos do modelo, o que serve para comportamento e estilo. O RAG leva conhecimento ao modelo sem alterá-lo, e atualizar a base é só reindexar os documentos que mudaram. E nada impede usar os dois juntos.

Quais são os limites do RAG?#

  • A recuperação decide a qualidade. Se a busca traz o trecho errado, o modelo responde bem sobre o assunto errado. Quase todo ajuste de RAG é ajuste de recuperação: tamanho do chunk, valor de k, modelo de embeddings.
  • Alucinação não some. O modelo pode ignorar o contexto. Instruções claras no prompt e teste com perguntas reais reduzem o problema.
  • Custo e latência crescem. Cada pergunta gera um embedding e envia mais tokens ao LLM. Veja como isso entra na conta em custo de API de LLM.
  • Dados sensíveis exigem cuidado. O que está no índice pode chegar ao prompt. Controle quem pode recuperar o quê.

Como fazer isso na Square Cloud#

Um sistema RAG é uma aplicação comum: uma API que recebe a pergunta, gera o embedding, consulta o índice e chama o LLM. Na Square Cloud você faz o deploy dessa API em diversos runtimes, como Python e Node.js, num container isolado e sempre ligado, com as chaves dos provedores nas variáveis de ambiente. Veja como publicar em Hospedagem de APIs.

Cada etapa do fluxo fica num lugar:

  • Embeddings: um provedor externo. O runtime Python tem wheels prontas de torch e transformers, mas um modelo local de embeddings não cabe no Hobby de 1 GB.
  • Índice: a plataforma não tem banco vetorial, e o PostgreSQL hospedado é o nativo, sem extensões (nada de pgvector). Use um serviço vetorial externo ou, com poucos milhares de trechos, uma busca em memória na própria aplicação.
  • Documentos e metadados: hospedagem de bancos a partir do Standard (R$ 44,99 por mês); o Hobby (R$ 12,49) não inclui banco.
  • Geração: a partir do Standard, o AI Gateway responde no formato de chat completions da OpenAI, com o modelo cubic. Aponte o SDK da OpenAI para a base URL https://api.squarecloud.app/v2/ai e use uma chave de API com o escopo ai:chat.

O gateway faz só a geração. Os trechos recuperados, o histórico e a pergunta precisam caber na janela de contexto do plano (até 16 mil tokens no Standard, até 24 mil no Pro): escolha o k e o tamanho dos chunks com isso em mente. Ele está em beta, com acesso antecipado sem custo extra, e os limites podem mudar quando o beta acabar. Para um chatbot completo, veja como hospedar um chatbot de IA.

IA

Hospede apps com IA em containers sempre ligados

Saiba mais

Perguntas frequentes

RAG e fine-tuning são a mesma coisa?

Não. O fine-tuning altera os pesos do modelo com novos exemplos. O RAG não mexe no modelo: ele busca informação na hora e a inclui no prompt. Para dados que mudam com frequência, o RAG costuma ser mais simples de manter.

RAG elimina as alucinações?

Não elimina, mas reduz. O modelo ainda pode ignorar o contexto, e a busca pode trazer o trecho errado. Instruir o modelo a responder só com o contexto e a admitir quando não sabe ajuda bastante.

Preciso de um banco de dados vetorial para fazer RAG?

Não é obrigatório. Com poucos milhares de trechos, uma busca em memória resolve. Um banco vetorial dedicado compensa quando o volume e a latência exigem índice.

Quem criou o RAG?

O termo vem do artigo "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks", de Patrick Lewis e coautores, publicado em 2020 e apresentado na NeurIPS 2020.

Próximo artigoQuanto custa criar e manter um chatbot com IAManter um chatbot com IA custa tokens do modelo, hospedagem, banco e, com RAG, contexto extra por mensagem. Veja como fazer a conta por conversa.