O problema de conformidade em escala
Imagine um operador de portfólio imobiliário com 50.000 contratos de locação distribuídos por vários estados americanos. Cada estado tem suas próprias leis de locação — limites de multa por atraso, prazos de notificação, tetos para depósito de segurança — e essas leis mudam conforme o calendário legislativo, não conforme a conveniência do operador. Quando uma regulação muda, a equipe de conformidade precisa identificar quais contratos estão fora do padrão.
Em volumes pequenos, um paralegal lê os contratos manualmente. A resposta é confiável porque há um humano por trás dela. A partir de certo volume, isso deixa de ser viável. O trabalho passa para software, e surge um novo problema: o resultado vira um número numa tela que ninguém consegue verificar de forma independente.
Dois requisitos emergem dessa realidade:
- Completude comprovável: afirmar “verificamos todos os 22.910 contratos do Texas” precisa ser verdadeiro e demonstrável. Um registro não avaliado deve ser reportado como não avaliado, nunca omitido silenciosamente.
- Defensibilidade: uma conclusão pode ser contestada meses depois em litígio, auditoria ou fiscalização regulatória. Defendê-la exige saber qual versão de qual regra foi aplicada, a qual trecho de texto, por qual método, em qual data.
Essas duas propriedades são o que distingue esse problema de uma busca corporativa comum. Geração Aumentada por Recuperação (RAG) resolve o problema de acessibilidade, mas não consegue satisfazer nenhuma das duas propriedades: busca por similaridade não tem um limiar que signifique “todos eles”, e uma amostra ranqueada nunca sabe o que excluiu. Text-to-SQL reduz a lacuna, mas carrega um risco estrutural: um predicado alucinado pode silenciosamente reduzir a população avaliada, e o número resultante parece exato mesmo quando o escopo está errado.
O padrão Adjudicated Query
A AWS publicou uma arquitetura de referência que resolve esse dilema com o que chamou de padrão Adjudicated Query. A ideia central é criar uma camada conversacional delimitada sobre um motor de regras determinístico. O modelo de linguagem faz exatamente duas coisas: traduz a pergunta em linguagem natural para uma chamada em um conjunto fixo de operações tipadas, e narra o resultado que retorna. Ele nunca escreve uma consulta, nunca define a população e nunca realiza uma determinação.
Por trás dessa fronteira fica o motor de regras. As regras são dados versionados, não código. O motor conhece operadores de comparação genéricos — maior ou igual, menor ou igual, igual, existe — e não contém nenhuma ramificação nomeando uma jurisdição ou tópico específico. Uma mudança na lei é uma edição em uma linha do livro de regras, não um deploy de código.
Cada varredura de conformidade produz um recibo de completude: um invariante afirmado onde conforme + em violação + ambíguo + ilegível deve ser igual ao total varrido. Esse invariante é calculado antes de qualquer dado ser persistido. Uma execução que não consegue contabilizar sua população nunca é concluída. Não existe caminho pelo qual um registro seja silenciosamente ignorado.
Por que não RAG ou Text-to-SQL?
A comparação entre as abordagens deixa claro o posicionamento do padrão:
- Recuperação semântica (RAG): trabalha com amostras ranqueadas; completude de população é estruturalmente impossível; defensibilidade apenas parcial.
- Consultas geradas (Text-to-SQL): completude alegada, mas não comprovável; risco de redução silenciosa da população; defensibilidade possível se bem modelado.
- Motor de regras + BI (sem chat): completude exata e comprovada; totalmente defensável; mas sem camada conversacional.
- Adjudicated Query: completude exata e comprovada; totalmente defensável; com acesso em linguagem natural.
O padrão Adjudicated Query adiciona acesso em linguagem natural à combinação de motor de regras e Inteligência de Negócios (BI) sem sacrificar a garantia. É a escolha certa quando usuários responsáveis precisam de acesso conversacional e um registro perdido é uma responsabilidade legal, não apenas um inconveniente.
Arquitetura de referência
A arquitetura proposta conecta os componentes da seguinte forma: um analista de conformidade interage com duas superfícies no Amazon Quick — um agente de chat para fazer perguntas e um painel do Amazon QuickSight para navegar pelo conjunto completo de resultados.
O agente de chat primeiro obtém um token OAuth do Amazon Cognito. Em seguida, envia requisições via Protocolo de Contexto de Modelo (MCP) por um Amazon API Gateway HTTP API, que valida o token antes de encaminhar para uma função AWS Lambda. Essa função hospeda o servidor MCP e o motor de regras, lê e escreve no Amazon Aurora Serverless v2 via RDS Data API, e chama o Amazon Bedrock apenas para o caminho exploratório de busca em cláusulas. O painel do Amazon QuickSight lê o mesmo banco Aurora diretamente por uma conexão de Nuvem Virtual Privada (VPC).
Como as duas superfícies leem do mesmo armazenamento, o recibo de completude é uma única fonte de verdade. O agente de chat carrega o recibo de completude e um link para o painel. O painel carrega o volume completo, porque milhares de linhas não cabem numa mensagem de chat.
A superfície de operações delimitada
O servidor MCP expõe exatamente seis ferramentas, cada uma com uma semântica distinta:
- sweep_compliance: varredura exaustiva da população contra as regras vigentes em uma data declarada. Resultado oficial — cada contrato contabilizado em um recibo calculado. Grava os achados.
- simulate_rule_change: uma regra testada com um valor proposto contra a linha de base aprovada. Resultado exploratório — apenas contagens direcionais. Não registra nada.
- explore_clauses: Top K por similaridade semântica dentro de uma população filtrada. Resultado interpretativo — amostra ranqueada. Não responde “quantos”.
- get_finding: cadeia completa de evidências de um único achado. Drill-down em uma determinação específica.
- list_rules: o livro de regras vigente em uma data, com versões, citações e aprovadores. Consulta de referência.
- check_connection: verificação de disponibilidade do transporte, sem tocar em dados.
Essa superfície delimitada elimina o caminho para o risco de redução silenciosa de população presente em consultas geradas. Como o modelo só pode selecionar entre um conjunto fixo de operações cuja lógica de população foi escrita, revisada e testada por pessoas, ele não tem como compor uma população errada.
Componentes principais da arquitetura
- Amazon Quick: interface conversacional e camada de orquestração do agente. Autentica no servidor MCP usando OAuth de dois fatores (2LO) via Amazon Cognito e cuida da descoberta de ferramentas e narração das respostas.
- Amazon Aurora Serverless v2 (Postgres + pgvector): armazena o livro de regras, registros de contratos, status de extração e determinações em um único banco relacional. Colocar tudo em um banco torna o recibo de completude uma contagem SQL — uma forma econômica de tornar a garantia central inspecionável.
- AWS Lambda: hospeda o servidor MCP (JSON-RPC 2.0 sobre HTTP streamável, usando enquadramento Server-Sent Events para respostas) e o motor de regras. Operações delimitadas se traduzem em SQL baseado em conjuntos usando valores de regras vinculados como parâmetros. Nenhuma linguagem natural chega à camada de consulta.
- Amazon API Gateway HTTP API: porta de entrada com autorizador de Token Web JSON (JWT) respaldado pelo Amazon Cognito. Nenhuma rota não autenticada existe.
- Amazon Bedrock: alimenta apenas o caminho exploratório, usando Amazon Titan Text Embeddings V2 (
amazon.titan-embed-text-v2:0) para ranqueamento por similaridade semântica e Anthropic Claude Sonnet 5 para avaliação qualitativa de cláusulas. Não é consultado para determinações oficiais de conformidade. - Amazon QuickSight: conecta-se ao Aurora por uma conexão VPC e renderiza a tabela completa de achados, filtrável por varredura e banda de severidade.
Regras de design não negociáveis
A AWS estabelece um conjunto de princípios que não podem ser violados na implementação desse padrão:
- Regras são dados. Uma mudança na lei é uma edição em linha no livro de regras. O motor não contém ramificações específicas de jurisdição.
- Nenhuma linguagem natural chega ao SQL. Operadores selecionam templates fixos de SQL. Valores de regras são vinculados como parâmetros.
- Determinístico antes da IA. Uma comparação numérica responde à varredura. Nenhum modelo é consultado.
- Filtragem exata para completude; vetores apenas para ranqueamento. Similaridade nunca decide pertencimento à população.
- Recibos são calculados, não escritos à mão. O invariante é afirmado antes de uma varredura ser confirmada.
- Documentos ilegíveis são nomeados, não descartados. Cada contrato cai em exatamente um balde.
- Achados são somente de adição. Não existe UPDATE ou DELETE contra achados na base de código.
Tratando o modelo de sumarização como um renderizador não confiável
Um elemento de design merece atenção especial: as salvaguardas para sobreviver à paráfrase do modelo de chat. Excluir o modelo do caminho de decisão mas colocá-lo de volta no caminho de entrega reintroduz risco no final da cadeia.
Na prática, a AWS observou comportamentos problemáticos: um modelo removeu um prefixo de ressalva; uma tag de citação marcada como ilustrativa foi removida durante a paráfrase, e o modelo apresentou uma citação inventada como estatuto; um modelo extrapolou a partir de uma amostra de 20 linhas e inferiu um intervalo que não existia nos dados.
Três técnicas endereçam isso:
- Formule ressalvas como sufixos entre colchetes que não podem ser removidos, repetidos em vários níveis do payload — não como rótulos iniciais que parecem metadados removíveis.
- Forneça os dados que tornam a resposta honesta a mais fácil. Calcule agregados reais sobre todos os registros e entregue-os ao modelo. Um modelo que tem o número real não precisa adivinhar a partir de uma amostra.
- Repita rótulos de modo em múltiplos níveis estruturais (campo, string, resumo) para que pelo menos um sobreviva à paráfrase.
Como implantar e executar o exemplo
A implementação de referência completa está disponível no repositório de exemplo no GitHub. Ela inclui dados sintéticos (sem dados reais de contratos), geração determinística de corpus e testes de aceitação contra o stack implantado.
Pré-requisitos
- Uma conta AWS com acesso ao Amazon Bedrock habilitado para Amazon Titan Text Embeddings V2 e Anthropic Claude Sonnet 5 na região US East (N. Virginia) —
us-east-1. - AWS CLI v2 com credenciais configuradas (
aws sts get-caller-identitydeve funcionar). - Python 3.12.
- Node.js 24 para o AWS Cloud Development Kit (AWS CDK) CLI.
Passo 1: Clonar o repositório
git clone https://github.com/aws-samples/sample-quick-adjudicated-query.git
cd sample-quick-adjudicated-query
python3 -m venv .venv && .venv/bin/pip install -q -r requirements.txt
Passo 2: Implantar a infraestrutura
eval "$(mise env -s zsh)"
export CDK_DEFAULT_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
npx aws-cdk@2.261.0 bootstrap aws://$CDK_DEFAULT_ACCOUNT/us-east-1
npx aws-cdk@2.261.0 deploy --outputs-file outputs.json
A versão do CDK está fixada em 2.261.0 para corresponder ao requirements.txt. O provisionamento do Aurora leva aproximadamente 11 minutos. O stack implanta: Amazon Cognito (cliente 2LO), Amazon API Gateway com autorizador JWT, AWS Lambda (servidor MCP + motor de regras), Amazon Aurora Serverless v2 e rede do Amazon QuickSight.
Passo 3: Popular dados e verificar
PY=.venv/bin/python
$PY db/migrate.py # schema, livro de regras, views (7 verificações)
$PY gen_corpus.py # corpus determinístico + manifesto
$PY ingest.py # carregar + embeddings (tempo varia por ambiente)
$PY setup_dashboard.py # configuração do QuickSight
$PY acceptance.py # 28 verificações contra o stack ativo
Passo 4: Registrar a integração MCP no Amazon Quick
O Amazon Quick faz um snapshot da lista de ferramentas no momento do registro. Novas ferramentas ou ferramentas renomeadas não são detectadas até que a integração seja excluída e recriada. Implantar apenas a Lambda não é suficiente.
python3 - <<'PY'
import json
o = json.load(open('outputs.json'))['QuickPocStack']
for k in ('McpUrl', 'TokenEndpoint', 'ClientId', 'Scope'):
print('%-14s %s' % (k, o[k]))
PY
Recupere o segredo do cliente do Amazon Cognito (lido a cada vez, nunca gravado em disco) e registre no Amazon Quick em Connectors > Create for your team > Model Context Protocol.
Passo 5: Verificar a integração
$PY show_payload.py check_connection # transporte ativo
$PY acceptance.py # 28/28 verificações
Percorrendo a experiência
Com o stack implantado, é possível executar uma varredura de conformidade diretamente pelo chat do Amazon Quick. Ao perguntar "Which Texas leases violate the late fee cap? Use rules effective 01/01/2026", o Amazon Quick identifica isso como uma varredura de conformidade e seleciona a ferramenta sweep_compliance. A ferramenta executa uma verificação exaustiva contra todos os contratos do Texas na população, aplicando as regras vigentes na data declarada. Nenhum modelo está envolvido na determinação.
A resposta inclui uma amostra dos achados em não conformidade, o recibo de completude como contagens (por exemplo, 10.111 violações, 689 ambíguos e 20 ilegíveis), uma ressalva de dados sintéticos e um link para o painel do QuickSight. Deliberadamente, ela não tenta renderizar todos os registros na mensagem de chat.
Para verificar o recibo de completude, basta checar o invariante: conforme + em violação + ambíguo + ilegível deve ser igual ao total da população varrida. No exemplo, as contagens somam o total de contratos do Texas, confirmando que cada registro caiu em exatamente um balde.
O painel do QuickSight exibe cada achado da varredura — um por par contrato-regra — com a cadeia completa de evidências: ID do contrato, a regra que disparou, o valor extraído e o valor esperado. Cada determinação carrega sua citação de regra, versão e o texto verbatim da cláusula do contrato, então nada precisa ser reconstruído posteriormente.
Considerações de segurança
Como esse padrão é construído para trabalho de conformidade, a segurança faz parte do design, não é um complemento. A implementação de exemplo aplica as seguintes práticas:
- Acesso apenas autenticado: todas as requisições chegam ao servidor MCP por uma HTTP API do Amazon API Gateway protegida por um autorizador JWT respaldado pelo Amazon Cognito. Nenhuma rota não autenticada existe.
- Tratamento de segredos: o segredo do cliente do Amazon Cognito é lido no momento do registro e não é gravado em disco nem commitado no controle de versão.
- Acesso mínimo ao modelo: a função de execução do AWS Lambda concede InvokeModel no Amazon Bedrock apenas para os ARNs específicos dos modelos usados no exemplo, não um wildcard sobre todos os modelos.
- Isolamento de rede para o caminho de dados: o Amazon QuickSight acessa o Amazon Aurora Serverless v2 por uma conexão VPC, não por um endpoint público.
- Sem linguagem natural no caminho de consulta: o motor de regras monta SQL apenas a partir de uma tabela fixa de operador-para-template com valores de regras vinculados como parâmetros — isso é uma propriedade de segurança tanto quanto de correção.
- Achados auditáveis e somente de adição: não existe caminho de UPDATE ou DELETE na base de código, então o registro de conformidade não pode ser silenciosamente alterado após o fato.
Um ponto importante sobre atribuição: o Amazon Quick autentica no servidor MCP máquina-a-máquina via fluxo de credenciais de cliente, então o token identifica a aplicação Amazon Quick, não o indivíduo que fez a pergunta no chat. Para o requisito de "por quem" na defensibilidade, a atribuição fica na camada de auditoria do Amazon Quick. Se você precisar que a atribuição seja registrada diretamente no armazenamento de conformidade, é necessário encaminhar um ID de usuário final do Amazon Quick para a chamada de ferramenta e persistí-lo na linha de varredura.
Quando usar (e quando não usar) esse padrão
O padrão Adjudicated Query se aplica quando: um registro perdido é uma responsabilidade legal em vez de um inconveniente; respostas podem ser contestadas meses depois; a lógica de governança é de propriedade externa e muda em seu próprio calendário; e o conjunto de registros é enumerável. Isso abrange conformidade de contratos, adjudicação de sinistros de seguros, triagem de sanções, controle de exportações, monitoramento de protocolos de ensaios clínicos, inspeção de código de construção, testes de controles de relatórios financeiros e verificação de credenciais.
O padrão é pesado — um motor de regras, uma superfície de ferramentas delimitada e um recibo de completude. Essa maquinaria só vale a pena no problema certo. Evite o padrão em três casos:
- As regras não são realmente determinísticas. O padrão funciona quando a conformidade é uma comparação limpa (taxa menor ou igual a um teto). Quando a decisão é um julgamento genuíno (se uma cláusula é abusiva), forçá-la nesse padrão esconde a subjetividade dentro da autoria de regras e faz o resultado parecer exato quando não é.
- A completude não importa para a pergunta. Se o usuário quer apenas alguns exemplos representativos ou está explorando, o recibo de completude é sobrecarga para uma garantia que não é necessária. RAG é a resposta mais simples e correta para esse tipo de pergunta.
- A própria população é imprecisa. O recibo prova que você cobriu cada registro na população, não que a população é a correta. Se a definição de "todos os contratos do Texas" é em si contestável, a garantia é precisa sobre o denominador errado.
Conclusão
O padrão Adjudicated Query resolve um problema real de conformidade em escala: como oferecer acesso conversacional a verificações de conformidade sem abrir mão das garantias de completude e defensibilidade que esse tipo de trabalho exige. A chave está em manter o modelo de linguagem fora do caminho de decisão — ele traduz perguntas e narra resultados, mas nunca toca nas determinações que produzem a garantia.
Para começar, clone o repositório de exemplo, implante o stack, registre a integração MCP no Amazon Quick e experimente fazer sua primeira pergunta de conformidade.
Fonte
Sweep thousands of leases for compliance using Amazon Quick and the Adjudicated Query pattern (https://aws.amazon.com/blogs/machine-learning/sweep-thousands-of-leases-for-compliance-using-amazon-quick-and-the-adjudicated-query-pattern/)

