Metadados, filtros e roteamento
Usar metadados para filtrar, isolar tenants e rotear a busca para a fonte certa.
6 min de leitura
Escolha como aprender
— combine como quiserDica: o vídeo é um resumo visual rápido — o áudio e o texto trazem a aula completa.
Busca vetorial sem filtros é como abrir um arquivo de RH para qualquer funcionário da empresa: tecnicamente funciona, mas é um desastre de segurança e qualidade. Metadados são o mecanismo que transforma um índice genérico em um sistema de recuperação preciso, seguro e multi-tenant — e ignorá-los é o erro mais comum que vejo em RAG que 'funciona no notebook mas falha em produção'.
Por que metadados existem no pipeline RAG
Quando você indexa um chunk, você está guardando dois tipos de informação: o conteúdo semântico (capturado pelo embedding) e o contexto do documento (capturado pelos metadados). O embedding responde o que o texto significa. Os metadados respondem de onde veio, quando, para quem e com que permissão.
Exemplos práticos de campos úteis:
| Campo | Exemplo | Uso |
|---|---|---|
| tenant_id | cliente-acme | Isolar dados por cliente |
| doc_type | contrato, faq, manual | Rotear para coleção certa |
| created_at | 2024-11-01 | Filtrar por janela temporal |
| author | juridico@empresa.com | Auditoria e proveniência |
| permission_level | public, internal, confidential | Controle de acesso |
| language | pt-BR | Evitar mistura de idiomas |
| source_uri | s3://bucket/doc.pdf | Citações e rastreabilidade |
Esses campos são anexados no momento da ingestão — junto com o vetor — e ficam armazenados no índice (OpenSearch, Pinecone, pgvector). Na busca, eles viram cláusulas de filtro que reduzem o espaço de busca antes do ranqueamento por similaridade. Isso melhora precisão e velocidade ao mesmo tempo.
Na prática, todo projeto RAG que chega a mim sem metadados estruturados tem o mesmo problema: o modelo responde com documentos de clientes errados, com versões desatualizadas ou com conteúdo que o usuário não deveria ver. Metadados não são uma feature avançada — são o mínimo para qualquer RAG que vai para produção com mais de um cliente, mais de um tipo de documento ou mais de um nível de permissão. Defina o schema de metadados antes de começar a indexar, porque retroativamente é caro.
Fluxo: metadados controlando recuperação e roteamento
Da consulta do usuário até o chunk recuperado: como tenant, permissão e tipo de documento filtram e roteiam a busca.
- Auth / JWT · tenant_id + roles
- Query Router · doc_type → coleção
- Filter Builder · tenant + permission + date
- Busca Vetorial · + filtro de metadados
- Índice: Contratos · tenant_id=acme
- Índice: FAQ · tenant_id=acme
- Índice: Outro Tenant · tenant_id=beta
- LLM (Bedrock) · chunks filtrados
Multi-tenant e controle de acesso: onde segurança encontra recuperação
Multi-tenant em RAG tem dois padrões principais, e a escolha afeta segurança, custo e complexidade operacional:
Índice compartilhado com filtro por tenant_id: todos os clientes no mesmo índice OpenSearch, mas toda query inclui obrigatoriamente filter: { term: { tenant_id: "acme" } }. É mais barato e simples de operar, mas exige disciplina absoluta — uma query sem o filtro vaza dados entre tenants. Use quando o volume por tenant é pequeno e você confia na camada de aplicação.
Índice separado por tenant: cada cliente tem seu próprio índice (ou namespace, no Pinecone). O isolamento é físico — impossível vazar por bug de filtro. Custo maior, mas o modelo de segurança é muito mais robusto. Use quando os dados são sensíveis ou regulados (saúde, financeiro, jurídico).
Além do tenant_id, o controle de acesso por permission_level segue a mesma lógica: o token JWT do usuário carrega seus roles, a camada de aplicação traduz isso em filtros de metadados, e o índice nunca retorna chunks que o usuário não pode ver. Isso não substitui IAM e políticas de bucket no S3 — é uma camada adicional. Na Lição 11 (guardrails) e no Módulo 3 vamos aprofundar o modelo de segurança completo.
Um erro clássico: confiar que o LLM vai 'ignorar' contexto que ele não deveria ver. Ele não ignora. Se o chunk chegou no contexto, o modelo pode usá-lo. O filtro tem que acontecer antes da recuperação.
Roteamento de consulta: enviando a pergunta para o índice certo
Nem toda pergunta deve ir para o mesmo índice. Um sistema com documentos técnicos, FAQs de suporte e contratos jurídicos se beneficia de um router que decide, antes da busca vetorial, qual coleção consultar.
O router pode ser tão simples quanto uma classificação por palavras-chave ou tão sofisticado quanto um LLM pequeno que classifica a intenção da query. Na prática, começo com um classificador leve (regex ou um modelo de classificação de texto) e só subo para LLM se a precisão for insuficiente.
A saída do router é um conjunto de filtros de metadados: { doc_type: "contrato", tenant_id: "acme", created_at: { gte: "2023-01-01" } }. Esses filtros são passados diretamente para a query do OpenSearch ou para o filter do Knowledge Bases.
Um padrão útil é o roteamento por confiança: se o classificador tem alta confiança, vai direto para um índice específico; se a confiança é baixa, faz busca em múltiplos índices e usa reranking (Lição 05) para consolidar. Isso evita respostas vazias quando a query é ambígua.
Detalhe importante: o roteamento não substitui a busca híbrida — ele acontece antes dela. Você roteia para a coleção certa, depois executa busca híbrida + reranking dentro dessa coleção.
Pontos essenciais desta lição
Como implementar metadados e filtros na prática
- 1
Defina o schema de metadados no início da ingestão
Liste todos os campos que você vai precisar para filtrar, rotear e auditar. Documente tipos e valores permitidos. Valide na ingestão — chunks sem tenant_id não entram no índice.
- 2
Extraia metadados na etapa de parsing
Use o S3 object key, tags do objeto, ou um parser de cabeçalho do documento para popular os campos. Para documentos sem metadados explícitos, use um LLM pequeno para classificar doc_type automaticamente.
- 3
Armazene metadados junto com o vetor no índice
No OpenSearch, defina um mapping com os campos de metadados como keyword (para filtros exatos) ou date (para ranges). No Knowledge Bases, use os campos de metadados nativos do S3.
- 4
Construa filtros a partir do contexto do usuário autenticado
Extraia tenant_id e roles do JWT. Construa o objeto de filtro programaticamente — nunca deixe o usuário passar filtros diretamente. Inclua sempre tenant_id como filtro obrigatório.
- 5
Implemente o router antes da busca vetorial
Classifique a intenção da query para determinar doc_type e coleção alvo. Combine a saída do router com os filtros de segurança antes de executar a busca.
Dúvidas frequentes
Posso usar metadados para filtrar por data e garantir respostas sempre atualizadas?
Sim, e é um padrão muito útil. Adicione um filtro created_at >= now() - 12 months para queries que precisam de informação recente. Mas cuidado: documentos históricos válidos podem ser excluídos. Considere combinar com um campo is_current: true para documentos que devem sempre aparecer, independente da data.
O Bedrock Knowledge Bases suporta filtros de metadados?
Sim. O Knowledge Bases permite passar um objeto retrievalConfiguration com filtros de metadados na API de retrieve. Os metadados são definidos no S3 via arquivos .metadata.json junto com cada documento. Na Lição 09 vemos isso em detalhe.
Filtro de metadados substitui criptografia e políticas IAM?
Não. Filtro de metadados é uma camada de aplicação — protege contra recuperação indevida dentro do RAG, mas não protege os dados no armazenamento. Você ainda precisa de S3 bucket policies, KMS, IAM roles e VPC endpoints. Os dois mecanismos são complementares.
Conclusão: metadados são infraestrutura, não detalhe
Metadados bem projetados transformam um RAG frágil em um sistema confiável. Eles são o que separa 'funciona no demo' de 'funciona em produção com dez clientes e dados sensíveis'. Invista tempo no schema antes de indexar, trate filtros de segurança como obrigatórios (não opcionais), e implemente o router como a primeira decisão do pipeline de recuperação. Na próxima lição, vamos além da recuperação passiva e entrar no RAG agêntico — onde o sistema decide dinamicamente quais fontes consultar e em que ordem.
Checagem rápida
1. Filtrar por metadados na recuperação ajuda principalmente a…