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
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.
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:
- Você junta os documentos (PDFs, páginas, artigos de ajuda, linhas de banco).
- Divide cada um em pedaços menores, os chunks.
- Gera um embedding de cada chunk com um modelo de embeddings.
- Guarda chunk e embedding num índice.
Consulta:
- O usuário faz uma pergunta.
- Você gera o embedding da pergunta com o mesmo modelo.
- Busca no índice os k chunks mais próximos (recuperação).
- Monta um prompt com esses chunks como contexto.
- 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.
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 URLhttps://api.squarecloud.app/v2/aie use uma chave de API com o escopoai: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
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.
Mais em IA
Ver todos os 13 artigos- Quanto custa um sistema RAG: embeddings, banco e LLMUm RAG tem três custos: embeddings, banco vetorial e LLM. Veja a conta para mil perguntas por dia, com preços hipotéticos, e onde a fatura cresce.
- Como criar um bot do Discord com IACrie um bot do Discord com IA em discord.js: comando /ask, chave de API em variável de ambiente, memória por canal, limites do Discord e como colocar no ar.
- Como hospedar um chatbot com IAUm chatbot com IA é uma API que recebe mensagens, chama um modelo de linguagem e devolve a resposta em streaming. Veja o código e como colocá-lo no ar.
- Quanto custa usar a API de um LLM no seu bot ou appA API de um LLM cobra por token, e a saída custa mais que a entrada. Veja uma conta passo a passo para um bot e como cortar o gasto.