Author: Make.com Service User

  • Amazon Aurora Serverless agora suporta até 384 ACUs

    Novo limite de capacidade para o Aurora Serverless

    A AWS anunciou uma expansão importante no Amazon Aurora Serverless: o serviço agora suporta até 384 Unidades de Capacidade Aurora (ACUs) para a edição compatível com PostgreSQL — um aumento de 50% em relação ao máximo anterior, que era de 256 ACUs.

    Para entender o que isso significa na prática: cada ACU entrega aproximadamente 2 gibibytes (GiB) de memória, acompanhados de CPU e recursos de rede proporcionais. Com o novo limite, um único banco de dados Aurora Serverless pode escalar até 768 GiB de memória. E quando a carga de trabalho termina, o serviço reduz automaticamente a capacidade até zero — você paga apenas pelo que efetivamente consumiu.

    Por que isso importa para aplicações de IA agêntica

    A AWS destaca que essa expansão torna o Aurora Serverless especialmente adequado para aplicações de IA agêntica. Esse tipo de aplicação tem um perfil de uso bastante específico: picos intensos de atividade, longos períodos de ociosidade e padrões de tráfego imprevisíveis. O Aurora Serverless lida com tudo isso de forma automática, ajustando a capacidade conforme a demanda dos agentes — sem intervenção manual e sem desperdício de recursos.

    Como configurar o novo limite de 384 ACUs

    A AWS detalhou os caminhos para aproveitar o novo limite, dependendo do estado atual do seu cluster:

    • Novos clusters: basta selecionar uma versão do engine Aurora PostgreSQL compatível e definir a capacidade máxima como 384 ACUs durante a criação.
    • Clusters existentes na Versão de Plataforma 4: é possível modificar o cluster para atualizar a configuração de capacidade máxima (e a versão do engine, se necessário) sem nenhuma indisponibilidade.
    • Clusters existentes em versões de plataforma mais antigas: é necessário primeiro fazer o upgrade para a Versão de Plataforma 4, por meio de uma ação de manutenção pendente.

    Versões compatíveis e disponibilidade

    O suporte a 384 ACUs está disponível para as seguintes versões do Aurora PostgreSQL, todas rodando na Versão de Plataforma 4:

    • Aurora PostgreSQL 18.4
    • Aurora PostgreSQL 17.10
    • Aurora PostgreSQL 16.14
    • Aurora PostgreSQL 15.18
    • Aurora PostgreSQL 14.23

    Para saber mais sobre como funciona o dimensionamento de capacidade, consulte a documentação oficial sobre capacidade do Aurora Serverless no Guia do Usuário do Amazon Aurora. Detalhes de preços e disponibilidade por região estão disponíveis na página de preços do Amazon Aurora. Para começar, crie ou modifique um banco de dados Aurora Serverless diretamente pelo Console de Gerenciamento da AWS.

    Fonte

    Amazon Aurora serverless now supports up to 384 ACUs (https://aws.amazon.com/about-aws/whats-new/2026/10/aurora-serverless-supports-384-acu/)

  • OpenAI GPT-6.1 Terra está disponível no Amazon Bedrock

    GPT-6.1 Terra chega ao Amazon Bedrock

    A AWS anunciou a disponibilidade geral do OpenAI GPT-6.1 Terra no Amazon Bedrock. O modelo representa uma expansão da família GPT-6, projetado para equilibrar capacidade, velocidade e eficiência de custo em cargas de trabalho do dia a dia.

    O que há de novo nesse modelo

    Como o mais recente integrante da linha Terra, o GPT-6.1 Terra traz avanços importantes em relação ao seu antecessor, o GPT-5.6 Terra. Entre os destaques estão:

    • Raciocínio visual detalhado — capacidade aprimorada de interpretar e analisar imagens com mais precisão;
    • Uso de computador mais preciso — melhor desempenho em tarefas que envolvem interação com interfaces e sistemas;
    • Maior factualidade e escrita natural — respostas mais confiáveis e com linguagem mais fluida, especialmente para fluxos de trabalho complexos.

    Desempenho em benchmarks

    Na avaliação Agents’ Last Exam da OpenAI, o GPT-6.1 Terra obteve um desempenho 15 pontos percentuais acima do GPT-5.6 Terra. Além disso, ficou no mesmo patamar do GPT-6 Astra em termos de qualidade, mas com uma diferença importante: completou tarefas mais de três vezes mais rápido do que o GPT-6 Astra e o GPT-6.1 Sol.

    Custo e capacidades técnicas

    Um dos pontos mais relevantes para equipes que trabalham com escala é o preço. O GPT-6.1 Terra oferece preços de tokens de entrada e saída pelo menos 50% menores do que os do GPT-6.1 Sol e do GPT-5.6 Terra — mantendo desempenho competitivo.

    Em termos de capacidade técnica, o modelo suporta:

    • Janela de contexto de até 1 milhão de tokens de entrada;
    • Aceitação de entradas em texto e imagem.

    Integração com o Amazon Bedrock

    O modelo roda sobre o mecanismo de inferência do Amazon Bedrock, que entrega o desempenho, a segurança e a escala necessários para cargas de trabalho empresariais. É possível utilizá-lo de duas formas:

    • Diretamente pelas APIs do Amazon Bedrock;
    • Configurando o ChatGPT Work e o Codex para utilizarem o modelo via Amazon Bedrock.

    Os controles nativos da AWS permitem proteger as cargas de trabalho, gerenciar acessos e auditar a atividade de invocação dos modelos — o que é especialmente relevante para ambientes corporativos com requisitos de governança.

    Casos de uso

    O GPT-6.1 Terra foi pensado para cenários práticos e variados, como:

    • Elaboração de propostas e documentos;
    • Interpretação de desenhos técnicos;
    • Investigação e análise de bases de código;
    • Construção de agentes que operam em sistemas de negócios.

    Como começar

    O acesso ao GPT-6.1 Terra pode ser feito pelo console do Amazon Bedrock ou de forma programática pelas APIs suportadas. Para detalhes sobre regiões da AWS disponíveis, endpoints, APIs, funcionalidades, perfis de inferência e preços, consulte a documentação do Amazon Bedrock.

    Fonte

    OpenAI GPT-6.1 Terra is now generally available on Amazon Bedrock (https://aws.amazon.com/about-aws/whats-new/2026/10/openai-gpt-6-1-terra-on-amazon-bedrock/)

  • Dia da Marmota para agentes de IA: padrões de cache de prompt para modelos OpenAI no Amazon Bedrock

    O problema: agentes de IA vivem no Dia da Marmota

    No filme Groundhog Day (Feitiço do Tempo), o personagem de Bill Murray acorda todo dia repetindo exatamente o mesmo 2 de fevereiro, do zero, sem carregar nada do que viveu no dia anterior. Agentes de Inteligência Artificial (IA) enfrentam um problema parecido: a cada passo da execução — cada chamada de ferramenta, cada resultado retornado, cada decisão tomada — o modelo precisa receber novamente todo o contexto acumulado da conversa.

    Isso acontece porque Modelos de Linguagem de Grande Escala (LLMs) não têm memória entre requisições. Na virada do turno 20 de uma sessão de trabalho, o modelo relê os turnos 1 a 19 inteiros — e você paga por cada token repetido. A AWS publicou um guia técnico explicando como o prompt caching quebra esse ciclo no Amazon Bedrock, com foco em modelos OpenAI.

    O que um agente envia ao modelo em cada turno

    Antes de entender o cache, vale entender o que compõe uma requisição típica de agente:

    • Lista de ferramentas: as definições de cada função que o agente pode chamar. Muda quando há uma nova versão.
    • Instruções: o prompt de desenvolvedor com regras, persona, políticas e exemplos. Também muda por versão.
    • Histórico: tudo que aconteceu na sessão até agora — tarefa, chamadas de ferramentas e resultados. Cresce a cada turno.
    • Novo turno: o resultado mais recente de uma ferramenta ou a mensagem do usuário.

    Sem cache, o agente reenvia tudo isso ao modelo a cada turno. O prompt caching resolve isso armazenando o estado processado do prompt e reutilizando-o nas requisições seguintes, a uma fração do preço de entrada normal.

    Como o prompt caching funciona por dentro

    Quando o modelo lê um prompt, ele executa uma etapa chamada prefill: processa cada token de entrada e constrói seus vetores internos de chave e valor (KV — Key-Value), que formam o estado de trabalho do modelo antes de gerar qualquer resposta. O prompt caching salva esse estado.

    Quando uma requisição posterior começa com os mesmos tokens de entrada, o serviço carrega o estado salvo em vez de recomputá-lo. Apenas o conteúdo novo é processado.

    O cache pode ser implícito — onde o Amazon Bedrock decide automaticamente onde termina o prefixo reutilizável — ou explícito — onde o código marca esse ponto usando prompt_cache_breakpoint. As duas abordagens podem ser combinadas, e a AWS recomenda isso para cargas de trabalho de agentes.

    Primeiro cache: conteúdo estático

    O primeiro ganho é cachear a parte estática do prompt: ferramentas e instruções que não mudam entre requisições. O prefixo reutilizável precisa ter pelo menos 1.024 tokens para ser elegível. Para conteúdo estático, o modo explícito é o mais indicado — você escolhe exatamente onde o prefixo salvo termina:

    KEY = "support-agent:v7:gpt-6-astra"
    INSTRUCTIONS = "Your full support policies and examples..."  # Rendered context: [provider context][TOOLS][INSTRUCTIONS] | [task]
    # Cache starts at the beginning; the marker below chooses its end.
    resp = client.responses.create(
        model="us.openai.gpt-6-astra",
        store=False,  # Response storage; prompt caching still works.
        include=["reasoning.encrypted_content"],
        prompt_cache_key=KEY,
        prompt_cache_options={"mode": "explicit", "ttl": "30m"},
        tools=TOOLS,  # Rendered before instructions; keep order stable.
        input=[
            {
                "role": "developer",
                "content": [{
                    "type": "input_text",
                    "text": INSTRUCTIONS,  # Save through this whole block, including TOOLS.
                    "prompt_cache_breakpoint": {"mode": "explicit"},
                }],
            },
            # User message is processed but not cached.
            {"role": "user", "content": task},
        ],
    )

    O prompt_cache_key indica ao serviço quais requisições devem compartilhar um cache. Em testes com esse padrão, um prefixo de cerca de 4.000 tokens escreveu 4.120 tokens na primeira requisição e leu esses mesmos 4.120 tokens nas requisições seguintes.

    Um ponto de atenção importante: o prompt caching só funciona quando você passa exatamente o mesmo texto. Instruções e listas de ferramentas precisam ser serializadas da mesma forma sempre. Qualquer conteúdo variável — como data, nome do usuário ou ID de requisição — deve vir após o limite do cache.

    Cache implícito para histórico crescente

    À medida que a conversa cresce com ferramentas e conteúdos diferentes, o modo implícito permite que o serviço acompanhe o histórico automaticamente:

    def ask_with_implicit_cache(history):
        return client.responses.create(
            model="us.openai.gpt-6-astra",
            store=False,
            include=["reasoning.encrypted_content"],
            prompt_cache_key=KEY,
            prompt_cache_options={"mode": "implicit", "ttl": "30m"},
            tools=TOOLS,
            input=history,  # Everything gets cached
        )
    
    history = [
        {"role": "developer", "content": INSTRUCTIONS},
        {"role": "user", "content": task},
    ]
    
    # Automatic endpoint: the end of the user message.
    resp = ask_with_implicit_cache(history)

    Para combinar os dois modos — um ponto de partida compartilhado explícito e um histórico crescente gerenciado implicitamente — basta adicionar o marcador no bloco do desenvolvedor e chamar a função com modo implícito no nível da requisição:

    history = [
        {
            "role": "developer",
            "content": [{
                "type": "input_text",
                "text": INSTRUCTIONS,
                "prompt_cache_breakpoint": {"mode": "explicit"},
            }],
        },
        {"role": "user", "content": task},
    ]
    
    # Still implicit mode, now with an explicit startup save point in the history.
    resp = ask_with_implicit_cache(history)

    Cacheando histórico e resultados de ferramentas

    O loop de execução do agente acumula saídas do modelo e resultados de ferramentas no histórico. Em modo implícito, o Amazon Bedrock pode reutilizar o prefixo inalterado e cachear o conteúdo adicionado até o último resultado de ferramenta:

    import json
    
    # Map tool names to their Python implementations.
    TOOL_HANDLERS = {
        "get_owner": get_owner,
        # Register your other initial tools here.
    }
    
    def execute_function(name, arguments):
        """Run the requested tool and return its result."""
        handler = TOOL_HANDLERS.get(name)
        if handler is None:
            return {"error": f"Unknown tool: {name}"}
        return handler(**arguments)
    
    while True:
        # Preserve all output items, including encrypted reasoning.
        history.extend(resp.output)
        calls = [x for x in resp.output if x.type == "function_call"]
        if not calls:
            break
        for call in calls:
            result = execute_function(call.name, json.loads(call.arguments))
            history.append({
                "type": "function_call_output",
                "call_id": call.call_id,
                "output": json.dumps(result),
            })
        # The last result in this group supplies the automatic endpoint.
        resp = ask_with_implicit_cache(history)

    Para o modo explícito puro, o loop marca o resultado final de cada lote com um prompt_cache_breakpoint, mantendo os marcadores anteriores no histórico. Consulte as regras atuais de lookup para conversas longas na documentação oficial.

    Em testes com seis turnos, o GPT-6 Astra com breakpoints implícitos apresentou cerca de 62% de redução no custo de entrada em comparação com execução sem cache. O modo explícito com rolling breakpoints economizou cerca de 61% no mesmo modelo.

    Quando as ferramentas mudam durante a sessão

    Adicionar, remover ou reordenar definições de ferramentas invalida o prefixo cacheado. Para lidar com isso, a AWS descreve duas abordagens:

    • Ferramentas conhecidas em etapas diferentes: mantenha a lista TOOLS estável e use allowed_tools para limitar o que o modelo pode chamar em cada etapa, sem alterar o catálogo cacheado.
    • Novas ferramentas durante a sessão: os endpoints Amazon Bedrock Runtime e Amazon Bedrock Mantle aceitam um tipo de item de entrada chamado additional_tools para GPT-6 Astra, GPT-6.1 Sol e GPT-5.6 Luna. Para disponibilidade por região da AWS, consulte os modelos suportados por região da AWS no Amazon Bedrock.
    TOOL_HANDLERS["get_due_date"] = get_due_date
    
    NEW_TOOL = {
        "type": "function",
        "name": "get_due_date",
        "description": "Return the due date for a support case.",
        "strict": True,
        "parameters": {
            "type": "object",
            "properties": {"case_id": {"type": "string"}},
            "required": ["case_id"],
            "additionalProperties": False,
        },
    }
    
    history.append({
        "type": "additional_tools",
        "role": "developer",
        "tools": [NEW_TOOL],
    })
    history.append({
        "role": "user",
        "content": "Find the due date for case C-123.",
    })
    
    # Implicit mode saves through this new user message, including NEW_TOOL.
    resp = ask_with_implicit_cache(history)
    d = resp.usage.input_tokens_details
    print("old prefix read", d.cached_tokens, "new write", d.cache_write_tokens)
    # Example output:
    # old prefix read 2048 new write 256

    Subagentes e chamadas paralelas

    Ao delegar tarefas a agentes auxiliares, é possível compartilhar o prefixo cacheado entre eles. A recomendação da AWS é fazer um “aquecimento” (warm-up) antes de disparar os helpers em paralelo:

    shared = {"role": "developer", "content": [{
        "type": "input_text",
        "text": INSTRUCTIONS,
        "prompt_cache_breakpoint": {"mode": "explicit"},
    }]}
    
    warm = client.responses.create(
        model="us.openai.gpt-6-astra",
        store=False,
        tools=TOOLS,
        prompt_cache_key=KEY,
        prompt_cache_options={"mode": "implicit", "ttl": "30m"},
        max_output_tokens=16,
        input=[shared, {"role": "user", "content": "Reply READY."}],
    )
    
    d = warm.usage.input_tokens_details
    if not (d.cache_write_tokens or d.cached_tokens):
        raise RuntimeError("Shared prefix was not cached.")
    
    from concurrent.futures import ThreadPoolExecutor
    
    # helper_tasks contains the task text for each helper.
    helper_inputs = [
        [shared, {"role": "user", "content": task}]
        for task in helper_tasks
    ]
    
    with ThreadPoolExecutor(max_workers=4) as pool:
        helpers = list(pool.map(ask_with_implicit_cache, helper_inputs))

    Para chamadas laterais como sumarizadores ou juízes, basta copiar o histórico completo do agente pai e adicionar a instrução específica do helper:

    from copy import deepcopy
    
    # history is the completed history built by the agent loop above.
    # Copy it so the helper can add instructions without changing the parent.
    helper_history = deepcopy(history)
    helper_history.append({
        "role": "developer",
        "content": "Summarize this conversation in one sentence. Do not call tools.",
    })
    
    summary = ask_with_implicit_cache(helper_history)
    d = summary.usage.input_tokens_details
    print("history read", d.cached_tokens, "write", d.cache_write_tokens)
    print(summary.output_text)
    # Example output (assumed values and conversation):
    # history read 4096 write 32
    # Case C-123 is due on October 31, 2026.

    Pausas, reinícios e chaves de cache

    Prefixos cacheados têm um tempo de vida (TTL — Time to Live) mínimo de 30 minutos, renovado a cada reutilização bem-sucedida. Para novas sessões que precisam reutilizar o mesmo prefixo, a chave de cache deve ser estável. Uma chave específica por sessão isola as entradas de cache mesmo quando os prompts coincidem.

    A AWS recomenda derivar a chave de cache a partir do conteúdo das instruções usando um hash:

    import hashlib
    
    def cache_key(app, model, prompt_version, instructions):
        digest = hashlib.sha256(instructions.encode()).hexdigest()[:12]
        return f"{app}:{prompt_version}:{model}:{digest}"
    
    KEY = cache_key("support-agent", "us.openai.gpt-6-astra", "v7", INSTRUCTIONS)
    
    prefix = {"role": "developer", "content": [{
        "type": "input_text",
        "text": INSTRUCTIONS,
        "prompt_cache_breakpoint": {"mode": "explicit"},
    }]}
    
    for label, question in [
        ("session A", "Explain the refund policy without calling tools."),
        ("session B", "Explain the escalation policy without calling tools."),
    ]:
        # A fresh conversation for each session; the startup prefix matches.
        session_history = [prefix, {"role": "user", "content": question}]
        result = ask_with_implicit_cache(session_history)
        d = result.usage.input_tokens_details
        print(label, "read", d.cached_tokens, "write", d.cache_write_tokens)

    Na primeira execução a frio, a sessão A escreve o prefixo compartilhado. A sessão B pode lê-lo mesmo com uma tarefa diferente. A reutilização do cache exige o mesmo modelo, conta AWS e região.

    O que o prompt caching entrega em números

    Para um agente baseado em GPT-6 Astra com um prefixo inicial de 8.000 tokens e seis turnos adicionando 2.000 tokens cada, os resultados modelados pela AWS foram:

    • Cache estático de uma vez: custo reduzido a US$ 0,50 por sessão.
    • Rolling breakpoints explícitos: redução de 64% no custo de entrada modelado — de US$ 0,87 para US$ 0,32 por sessão.

    Esses são resultados de uma carga de trabalho específica. A AWS recomenda medir os ganhos do seu próprio agente.

    Como verificar se o cache está funcionando

    O campo cached_tokens no uso da resposta indica tokens lidos do cache; cache_write_tokens indica tokens escritos. Para monitoramento em produção no endpoint Amazon Bedrock Runtime, as métricas CacheReadInputTokenCount e CacheWriteInputTokenCount estão disponíveis no Amazon CloudWatch. Para custos, filtre o AWS Cost Explorer pelo Amazon Bedrock e agrupe por tipo de uso — leituras, escritas e entradas não cacheadas aparecem como entradas separadas por modelo.

    Lista de verificação rápida

    • Mantenha o prefixo reutilizável estável: ferramentas e instruções compartilhadas primeiro, histórico e novos turnos depois.
    • Use cache implícito para histórico crescente, marcadores explícitos para prefixos compartilhados, ou ambos.
    • No modo explícito puro, mantenha os marcadores de turnos anteriores para que requisições futuras encontrem os prefixos salvos.
    • Mantenha o catálogo inicial de ferramentas inalterado; use allowed_tools para restringir chamadas e additional_tools para adicionar novas ferramentas.
    • O prefixo cacheável precisa ter pelo menos 1.024 tokens e permanece elegível por pelo menos 30 minutos após a última escrita ou reutilização bem-sucedida.
    • Aqueça o conteúdo compartilhado antes de disparar helpers em paralelo.
    • Use chaves de cache estáveis dentro de cada grupo de compartilhamento.
    • Escritas de cache custam 1,25 vez a taxa normal de entrada; leituras dependem do modelo.

    Conclusão

    Assim como Bill Murray só escapa do Dia da Marmota quando para de repetir os mesmos erros e começa a carregar o que aprendeu de um dia para o outro, agentes de IA saem do ciclo de reprocessamento quando mantêm o início do prompt estável e usam limites de cache automáticos ou explícitos à medida que o histórico cresce.

    A combinação de cache implícito para conversas em evolução e marcadores explícitos para conteúdo compartilhado cobre a maioria dos cenários. Para aplicar esses padrões, a AWS disponibiliza a documentação de prompt caching para modelos OpenAI no Amazon Bedrock e informações sobre disponibilidade de modelos por região e endpoint.

    Fonte

    Groundhog Day for AI agents: Prompt caching patterns for using OpenAI models on Amazon Bedrock (https://aws.amazon.com/blogs/machine-learning/groundhog-day-for-ai-agents-prompt-caching-patterns-for-using-openai-models-on-amazon-bedrock/)

  • Amazon SageMaker Unified Studio adiciona suporte ao modo claro para domínios baseados em IDC

    O que foi anunciado

    A AWS anunciou o suporte ao modo claro (light mode) no Amazon SageMaker Unified Studio para domínios baseados no Centro de Identidade (IDC — Identity Center). Com essa novidade, os usuários podem configurar o tema visual da interface de acordo com a sua preferência, escolhendo entre os modos claro e escuro.

    O que muda na prática

    Antes desta atualização, a personalização visual já estava disponível para domínios baseados em IAM (Gerenciamento de Identidade e Acesso — Identity and Access Management). Agora, a mesma flexibilidade chega também para os domínios baseados em IDC, unificando a experiência de configuração para todos os tipos de domínio suportados pela plataforma.

    O modo claro é especialmente útil em ambientes com muita iluminação, onde interfaces escuras podem dificultar a leitura. Já o modo escuro segue sendo uma opção popular para quem trabalha em ambientes com pouca luz ou prefere reduzir o cansaço visual em sessões longas de desenvolvimento. Juntos, os dois modos oferecem controle total sobre a aparência do ambiente de trabalho, contribuindo também para a acessibilidade.

    Como configurar

    A configuração é simples e pode ser feita diretamente nas preferências do usuário dentro do SageMaker Unified Studio. Basta acessar as configurações do seu perfil e selecionar a opção Customize appearance (Personalizar aparência). A partir daí, é possível escolher entre três opções:

    • Modo escuro (dark mode)
    • Modo claro (light mode)
    • Configuração do dispositivo (device setting): sincroniza automaticamente com o tema do sistema operacional em uso

    Uma vez definida, a preferência fica salva e se mantém consistente entre diferentes navegadores e dispositivos — sem precisar reconfigurar toda vez que trocar de máquina.

    Disponibilidade

    O recurso já está disponível em todas as regiões da AWS onde o Amazon SageMaker Unified Studio está presente. Para saber mais sobre como navegar e personalizar a interface, a AWS disponibiliza o Guia do Usuário do Amazon SageMaker Unified Studio.

    Fonte

    Amazon SageMaker Unified Studio adds light mode support for IDC-based domains (https://aws.amazon.com/about-aws/whats-new/2026/10/smus-light-mode)

  • Ciclo de vida de visão computacional em frotas de câmeras na borda com SageMaker SDK v3

    O problema que aparece depois que o piloto funciona

    Uma câmera, um modelo, uma linha de inspeção — o piloto vai bem. Aí a fábrica pede o mesmo resultado em 40 linhas, cada uma com várias câmeras. E cada câmera enxerga o mundo de um jeito diferente: ângulo distinto, reflexo diferente na superfície de aço inox, iluminação que muda dependendo de qual porta do galpão está aberta.

    Na prática, um único modelo treinado com imagens misturadas de todas as câmeras performa mal o suficiente para que cada câmera acabe precisando do seu próprio modelo ajustado. O problema real deixa de ser “treinar um bom modelo” e passa a ser: treinar, avaliar, versionar e distribuir milhares deles sem intervenção humana em cada um.

    A AWS publicou uma arquitetura de referência que endereça exatamente esse cenário, agora atualizada para o Amazon SageMaker Python SDK v3. O post original de 2023 Build an end-to-end MLOps pipeline for visual quality inspection at the edge é o ponto de partida, e esta versão substitui o SageMaker Edge Manager (descontinuado) pelo SageMaker Neo para otimização de modelos para dispositivos de borda. O código completo está disponível no repositório aws-samples no GitHub.

    Visão geral da solução

    A arquitetura se divide em duas metades: uma camada de orquestração de frota e um pipeline de treinamento por câmera.

    O pipeline de treinamento é parametrizado por câmera e executa 13 etapas. Três etapas iniciais rodam em paralelo: pré-processamento das imagens, busca do modelo de anomalia mais recente aprovado e busca do classificador mais recente aprovado para aquela câmera. A partir daí, dois ramos de treinamento seguem em paralelo:

    • Ramo de anomalia: um autoencoder convolucional pequeno que aprende como é um produto normal e detecta anomalias pelo erro de reconstrução.
    • Ramo de classificação: um ResNet18 ajustado fino para confirmar o tipo de defeito.

    Cada ramo exporta o modelo para o formato ONNX, avalia o artefato exportado contra dados reservados e passa por um gate de qualidade. Se o gate for aprovado, o modelo é compilado com o SageMaker Neo para o hardware-alvo configurado e só então registrado no SageMaker Model Registry. O resultado: todo pacote aprovado já chega ao registry com um artefato compilado e pronto para rodar no dispositivo.

    A camada de orquestração controla o ritmo da frota. Requisições de re-treinamento chegam em uma fila Serviço de Filas Simples da Amazon (Amazon SQS) do tipo FIFO. Uma função AWS Lambda inicia uma execução do Step Functions por requisição. Antes de disparar o pipeline, a execução precisa adquirir um slot via semáforo no DynamoDB — o que garante que uma rajada de 500 requisições não vire 500 pipelines simultâneos. Conclusões são publicadas no Serviço de Notificação Simples da Amazon (Amazon SNS), e falhas operacionais chegam ao mesmo tópico via Amazon EventBridge, com o erro original preservado.

    Definindo o pipeline com o SDK v3

    O SDK v3 reorganizou o SageMaker Python SDK em pacotes modulares. Os imports mostram a nova estrutura:

    from sagemaker.train import ModelTrainer
    from sagemaker.train.configs import InputData, Compute, OutputDataConfig
    from sagemaker.core.training.configs import MetricDefinition
    from sagemaker.serve.model_builder import ModelBuilder
    from sagemaker.mlops.workflow.pipeline import Pipeline
    from sagemaker.mlops.workflow.steps import ProcessingStep, TrainingStep
    from sagemaker.mlops.workflow.model_step import ModelStep
    from sagemaker.mlops.workflow.condition_step import ConditionStep
    from sagemaker.core.workflow.conditions import ConditionGreaterThanOrEqualTo
    from sagemaker.core.workflow.functions import JsonGet

    Instalar sagemaker>=3.0.0,<4 puxa automaticamente os pacotes sagemaker-core, sagemaker-train, sagemaker-serve e sagemaker-mlops. As configurações de treinamento que no v2 ficavam espalhadas nos argumentos do construtor Estimator agora vivem em objetos de configuração tipados passados ao ModelTrainer. Este é o trainer do ramo de anomalia, exatamente como aparece no exemplo:

    anomalib_trainer = ModelTrainer(
        training_image=custom_training_image_uri,
        compute=Compute(
            instance_type=training_instance_type.to_string(),
            instance_count=1,
        ),
        base_job_name="cv-pipeline-anomalib-train",
        sagemaker_session=pipeline_session,
        role=role_arn,
        hyperparameters={
            "program": "train_anomalib.py",
            "model_name": "autoencoder",
            "image_size": "256",
            "num_epochs": "3",
            "batch_size": "16",
            "learning_rate": "0.001",
        },
        input_data_config=anomalib_input_data,
        output_data_config=OutputDataConfig(
            s3_output_path=run_prefix("anomalib-training")
        ),
    ).with_metric_definitions(
        [
            MetricDefinition(
                name="image_auroc",
                regex=r"validation:image_auroc=([0-9]*\.?[0-9]+)",
            ),
        ]
    )

    Dois comportamentos do SDK v3 merecem atenção especial ao usar o pipeline dentro de uma aplicação AWS CDK. Primeiro, o SDK v3 valida o papel de execução do pipeline contra o Gerenciamento de Identidade e Acesso (IAM) em tempo de síntese — não em tempo de execução. Isso significa que uma aplicação CDK não consegue criar o papel e o pipeline no mesmo deploy, porque o papel ainda não existe quando o SDK tenta validá-lo. A solução do exemplo usa um deploy em duas fases controlado por um flag de contexto: a primeira passagem cria o papel, o bucket e o repositório do Registro de Contêineres Elástico da Amazon (Amazon ECR); a segunda sintetiza o pipeline contra o papel já existente. Segundo, o validador de papéis do v3 simula permissões de pull no ECR sem um ARN de recurso específico, então um papel com escopo restrito a um único repositório ECR falha na validação mesmo que funcionasse em runtime — o exemplo usa uma concessão ECR mais ampla por isso.

    Gates de qualidade pensados para dados de defeitos

    Todo modelo treinado é avaliado antes do registro, e a avaliação roda contra o artefato ONNX exportado — não contra o modelo PyTorch em memória. Isso importa: o artefato que passa pelo gate é exatamente o artefato que vai para o dispositivo, então um problema de exportação não consegue escorregar por uma métrica de treinamento saudável.

    O ramo de anomalia exige AUROC de pelo menos 0,8. O ramo de classificação exige dois critérios simultaneamente, e a escolha dessas métricas reflete uma propriedade fundamental dos dados de defeitos: desbalanceamento de classes. No exemplo, cerca de 90% das imagens são de produtos bons — o que é realista para uma linha de produção. Nessa distribuição, acurácia simples não diz nada: um modelo que classifica tudo como "bom" acerta 90% das vezes sem detectar um único defeito.

    A acurácia balanceada corrige isso, mas tem seu próprio ponto cego: um modelo com recall perfeito em peças boas e apenas 20% de recall em defeitos ainda pontua (1,0 + 0,2) / 2 = 0,6. Por isso, o gate exige acurácia balanceada de pelo menos 0,6 e recall de defeitos de pelo menos 0,5, juntos:

    step_check_classifier = ConditionStep(
        name="CheckClassifierQuality",
        conditions=[
            ConditionGreaterThanOrEqualTo(
                left=JsonGet(
                    step_name=step_eval_classifier.name,
                    property_file="evaluation",
                    json_path="balanced_accuracy",
                ),
                right=min_accuracy,
            ),
            ConditionGreaterThanOrEqualTo(
                left=JsonGet(
                    step_name=step_eval_classifier.name,
                    property_file="evaluation",
                    json_path="defect_recall",
                ),
                right=min_defect_recall,
            ),
        ],
        if_steps=[step_compile_classifier, step_register_classifier],
        else_steps=[step_fail_classifier],
        depends_on=[step_eval_classifier],
    )

    O ConditionStep aplica um AND entre as condições — as duas precisam passar. Os limiares são parâmetros do pipeline, ajustáveis por execução sem necessidade de redeploy. Se um gate falha, um FailStep marca a execução como falha e o modelo daquele ramo nunca chega ao registry. Os dois ramos são independentes: se um falha, o outro pode ainda registrar seu modelo. A frota continua servindo o modelo aprovado anteriormente para aquela câmera.

    Compilação para a borda com SageMaker Neo dentro do pipeline

    Após o gate de qualidade, a etapa de compilação com o SageMaker Neo recebe o artefato ONNX aprovado. A invariante é clara: gate → compilação → registro. Um modelo só se torna um pacote aprovado no registry se também compilou com sucesso para o hardware-alvo da frota.

    A etapa de compilação encapsula três detalhes propensos a erros. O Neo exige que o tarball de entrada contenha apenas o arquivo do modelo, mas os jobs de treinamento emitem um model.tar.gz com checkpoint e métricas junto ao ONNX — a etapa reempacota um tarball só com o ONNX antes de enviar. O Neo também exige formas de entrada concretas, enquanto as exportações declaram eixo de batch dinâmico — então o batch size 1 é fixado na requisição de compilação. Por fim, como etapas de pipeline podem sofrer retry, o nome do job de compilação é derivado deterministicamente do ID de execução, evitando jobs órfãos em caso de reprocessamento.

    O target é um parâmetro do pipeline: NeoTargetDevice seleciona um dispositivo nomeado como jetson_xavier ou rasp4b, e o padrão compila para a plataforma NeoTargetOs/NeoTargetArch (LINUX/X86_64 por padrão). O pacote compilado contém o compiled.so otimizado mais o runtime DLR para carregá-lo. A compilação em si não tem custo — você paga pela instância de processamento que a executa e pelo armazenamento S3 dos outputs.

    Modelos por câmera no Model Registry

    Cada ramo registra em seu próprio grupo de pacotes de modelos, e todo pacote carrega o ID da câmera e suas métricas de avaliação como metadados. Do exemplo:

    classifier_model_builder = ModelBuilder(
        s3_model_data_url=classifier_model_data,
        image_uri=custom_training_image_uri,
        sagemaker_session=pipeline_session,
        role_arn=role_arn,
    )
    step_register_classifier = ModelStep(
        name="RegisterClassifierModel",
        depends_on=[step_compile_classifier],
        step_args=classifier_model_builder.register(
            model_package_group_name="sm1k-classifier-model-group",
            approval_status="Approved",
            model_metrics=classifier_metrics,
            customer_metadata_properties={"CameraId": camera_id},
        ),
    )

    A identidade da câmera em customer_metadata_properties é o que transforma dois grupos de pacotes compartilhados em um catálogo de frota. Pacotes de todas as câmeras convivem nos mesmos grupos, e o histórico por câmera é recuperado filtrando pelo metadado. Cada ramo tem uma etapa de busca que percorre os pacotes aprovados do mais recente para o mais antigo até encontrar o modelo mais recente daquela câmera — porque ListModelPackages não filtra por metadados do lado do servidor.

    Na primeira execução de uma câmera, a busca não encontra nada e o treinamento usa inicialização fria (pesos ImageNet para o classificador, inicialização aleatória para o autoencoder). Nas execuções seguintes, o treinamento retoma do modelo anterior daquela câmera — o que torna o re-treinamento incremental, frequente e barato viável em escala de frota.

    Orquestrando o treinamento da frota

    Toda conta AWS tem cotas de serviço para jobs de treinamento simultâneos no SageMaker, e cada execução de pipeline dispara vários jobs. Algo precisa impedir que uma rajada de 500 requisições vire 500 pipelines simultâneos.

    O exemplo usa um semáforo — um contador de slots disponíveis que funciona como um estacionamento com cinco vagas. Antes de a máquina de estados do Step Functions iniciar um pipeline, ela tenta adquirir um slot incrementando atomicamente um contador no DynamoDB, com uma condição que recusa o incremento quando o limite é atingido:

    acquire_semaphore = tasks.DynamoUpdateItem(
        self,
        "AcquireSemaphore",
        table=semaphore_table,
        key={"LockName": tasks.DynamoAttributeValue.from_string("pipeline-concurrency")},
        update_expression="SET ActiveCount = if_not_exists(ActiveCount, :zero) + :one",
        condition_expression="attribute_not_exists(ActiveCount) OR ActiveCount < :limit",
    )

    Se todos os slots estão ocupados, a execução espera e tenta novamente. Quando o pipeline termina, o contador é decrementado para liberar o slot. O ponto-chave do design: a expressão de condição do DynamoDB aplica o limite em uma única operação atômica, eliminando a janela de corrida que existiria se a máquina de estados lesse o contador e depois decidisse. O cap padrão é cinco — baixo o suficiente para que o exemplo funcione em qualquer conta padrão sem solicitar aumento de cotas.

    Implantando e executando o exemplo

    O ponto de partida é um checkout limpo do repositório:

    git clone https://github.com/aws-samples/sample-sagemaker-fleet-cv-pipeline
    cd sample-sagemaker-fleet-cv-pipeline && python3 -m venv .venv && source .venv/bin/activate
    pip install -r requirements.txt
    cdk bootstrap                                        # uma vez por conta/região
    cdk deploy SageMakerCVPipelineStack -c bootstrap=true  # papéis, bucket, ECR
    cdk deploy --all                                     # pipeline + orquestração
    ./scripts/push_ecr_image.sh                          # build e push da imagem de treinamento

    Por padrão, o pipeline gera imagens sintéticas de linha de produção, então é possível validar o sistema completo sem nenhum dataset real. Uma execução completa roda todos os 13 passos, incluindo as duas compilações Neo, em cerca de 15 minutos e custa aproximadamente US$ 0,07 em tempo de computação (instâncias ml.m5.xlarge, região US East Ohio, julho de 2026, sob demanda). Os recursos de orquestração juntos custam bem menos de US$ 0,10 por mês na escala do exemplo.

    Para testar com imagens reais, o repositório inclui um downloader para o dataset BCCD — uma coleção de 364 imagens anotadas de esfregaços de sangue, originalmente publicada no GitHub e também distribuída pela Roboflow como domínio público. O script mapeia a presença de plaquetas para a classe de defeito, opcionalmente divide as imagens por câmera para simular uma frota e faz upload dos tarballs de treinamento para o bucket do pipeline.

    Para limpar o ambiente, pacotes de modelos são criados em tempo de execução do pipeline e o AWS CloudFormation não consegue deletá-los automaticamente. É necessário removê-los com o AWS CLI primeiro e depois destruir as stacks com cdk destroy --all -c bootstrap=true --force. O README lista os comandos exatos.

    Conclusão

    A arquitetura publicada pela AWS resolve o problema que aparece depois que um piloto de visão computacional industrial funciona: escalar de uma câmera para uma frota inteira sem intervenção humana em cada modelo. Os princípios de design transferem para além de visão computacional: avalie e compile o artefato que você vai distribuir (não o modelo em memória), use acurácia balanceada mais recall da classe minoritária em vez de acurácia simples, e faça falhas operacionais notificarem em vez de terminarem silenciosamente.

    Para equipes cujas necessidades são atendidas por opções gerenciadas como o Amazon Lookout for Vision, esse é o caminho mais simples. Este padrão existe para o cenário específico de restrições por câmera em escala de frota que opções gerenciadas não cobrem. O exemplo implanta em minutos, uma execução completa de validação custa cerca de sete centavos de dólar em computação — um ponto de partida de baixo risco para clonar o repositório e testar. Para a migração do SDK v3 em si, a documentação do SageMaker Python SDK é a referência recomendada.

    Fonte

    Fleet-wide computer vision lifecycle at the edge with SageMaker SDK v3 (https://aws.amazon.com/blogs/machine-learning/fleet-wide-computer-vision-lifecycle-at-the-edge-with-sagemaker-sdk-v3/)

  • Recuperação Agêntica com Amazon Bedrock Knowledge Base Gerenciada e CDK

    Quando o RAG tradicional não é suficiente

    A maioria dos sistemas de Geração Aumentada por Recuperação (RAG — Retrieval Augmented Generation) segue o mesmo padrão: uma pergunta é transformada em vetor, os trechos mais próximos são buscados em um índice e entregues ao modelo, que gera a resposta. Uma recuperação, uma geração. Para muitos casos de uso, esse design é perfeitamente adequado.

    O problema aparece em situações específicas: quando a resposta está espalhada por dois corpora distintos, quando a fonte certa depende do tipo de pergunta, ou quando seria necessário consultar o corpus uma segunda vez depois de ver o primeiro resultado. Nesses cenários, uma única recuperação retorna metade do que o modelo precisa — e uma resposta fluente porém incompleta pode ser pior do que nenhuma resposta.

    A recuperação agêntica empresarial resolve esses três problemas colocando um agente de raciocínio no fluxo. Esse agente decide se deve recuperar, qual base de conhecimento do Amazon Bedrock consultar e se é necessário buscar mais informações antes de compor a resposta final.

    O que mudou desde o RAG de ciclo único

    Em agosto de 2024, a AWS publicou o guia Build an end-to-end RAG solution using Knowledge Bases for Amazon Bedrock and the AWS CDK, que implantava o design de ciclo único como uma aplicação CDK: um bucket do Amazon Simple Storage Service (Amazon S3), uma coleção e índice do Amazon OpenSearch Serverless, uma base de conhecimento e uma fonte de dados.

    Desde então, três coisas mudaram de forma significativa:

    • O Amazon Bedrock passou a oferecer uma Knowledge Base Gerenciada (Type: MANAGED), que cuida internamente da ingestão, armazenamento, indexação e recuperação — sem necessidade de provisionar um banco de dados vetorial.
    • O Amazon Bedrock AgentCore fornece a camada agêntica: um Gateway que expõe cada base de conhecimento como uma ferramenta do Protocolo de Contexto de Modelo (MCP — Model Context Protocol), um Runtime que hospeda o agente de raciocínio, e a API AgenticRetrieveStream, que faz reranking interno e retorna uma resposta sintetizada com citações.
    • A observabilidade e avaliação agora são provisionadas junto com a solução, não adicionadas depois. A solução inclui dois dashboards do Amazon CloudWatch com sete camadas de telemetria, mais duas formas de avaliação — sob demanda e contínua.

    Vale destacar: a recuperação agêntica via AgenticRetrieveStream está disponível somente na Knowledge Base Gerenciada. O modelo autogerenciado (DIY), onde o cliente provisiona e opera o próprio banco vetorial, não suporta esse recurso.

    Visão geral da solução

    A solução é uma aplicação AWS CDK em Python que declara quatro stacks. O CDK deriva automaticamente a ordem de implantação a partir das referências entre os constructs — não é necessário um script de deploy manual.

    kb_stack = KnowledgeBasesStack(app, f"{project}-kb", env=env)
    gateway_stack = AgenticGatewayStack(
        app, f"{project}-gateway",
        env=env,
        financial_kb=kb_stack.financial_kb,  # ← a referência cria a dependência
        weather_kb=kb_stack.weather_kb,
    )
    agent_stack = AgentRuntimeStack(
        app, f"{project}-agent",
        env=env,
        gateway=gateway_stack.gateway,
    )
    DashboardsStack(
        app, f"{project}-dashboards",
        env=env,
        financial_kb=kb_stack.financial_kb,
        weather_kb=kb_stack.weather_kb,
        gateway=gateway_stack.gateway,
        agent_runtime=agent_stack.agent_runtime,
    )

    As quatro stacks e o que cada uma cria:

    • -kb: bucket S3, upload dos corpora, duas Knowledge Bases gerenciadas, fontes de dados e ingestão.
    • -gateway: Gateway com AWS IAM e MCP, com targets de AgenticRetrieveStream por Knowledge Base.
    • -agent: repositório no Amazon ECR, build no AWS CodeBuild, agente Strands no Runtime com logs e traces — leva cerca de 8 a 10 minutos pelo build da imagem.
    • -dashboards: dois dashboards de observabilidade no CloudWatch, que se populam conforme o tráfego chega.

    O fluxo de uma pergunta pela solução

    Antes de qualquer pergunta ser feita, cada corpus no S3 é ingerido na sua respectiva Knowledge Base Gerenciada: o Amazon Bedrock analisa, divide em chunks, gera embeddings e indexa automaticamente. Esse processo ocorre uma vez, no deploy.

    A partir daí, cada pergunta segue o seguinte caminho:

    • O usuário envia a pergunta ao agente hospedado no Amazon Bedrock AgentCore Runtime, que auto-instrumenta todo o loop de raciocínio e ação com spans de OpenTelemetry (OTEL).
    • O modelo de raciocínio do agente planeja e roteia entre as bases de conhecimento. Como cada base está exposta como uma ferramenta de recuperação separada, o agente seleciona a ferramenta cujo tópico corresponde à pergunta — financeiro ou meteorológico.
    • A chamada de ferramenta é intermediada pelo AgentCore Gateway via MCP, autorizada pela role IAM da tarefa do agente e assinada com SigV4, que invoca a API AgenticRetrieveStream da Knowledge Base correspondente.
    • O AgenticRetrieveStream decompõe a pergunta em sub-consultas, recupera iterativamente do armazenamento gerenciado pelo Bedrock e sintetiza uma resposta fundamentada com citações, que é transmitida de volta pelo Gateway.
    • O agente verifica se o contexto retornado é suficiente. Se não, ele volta ao loop; se sim, retorna a resposta citada ao usuário.
    • Durante todo o processo, o Runtime emite spans, contagens de tokens e métricas para o CloudWatch e o AWS X-Ray.

    Os datasets da solução

    A solução inclui dois corpora pequenos, no diretório data/ do repositório:

    • Financeiro: um relatório 10-K sintético da empresa fictícia Octank Financial (arquivo octank_financial_10K.pdf, ~198 KB). Trata-se de dados de amostra gerados por modelo, licenciados CC0 — não são dados financeiros reais.
    • Meteorológico: um relatório real e de domínio público do Serviço de Pesquisa do Congresso dos EUA sobre tornados (IF12695, arquivo tornadoes_report.pdf, ~560 KB), disponível em sgp.fas.org/crs/misc/IF12695.pdf.

    Os dois corpora são intencionalmente distintos para que o agente precise rotear cada pergunta para a base de conhecimento correta. Por se tratar de Knowledge Bases Gerenciadas, não é necessário configurar chunking, embedding ou índice — o Amazon Bedrock cuida de tudo automaticamente na ingestão.

    A decisão de usar duas bases separadas, cada uma exposta como uma ferramenta própria no Gateway, é deliberada. Ela torna o roteamento um ato explícito de raciocínio observável: a árvore de spans mostra qual ferramenta foi escolhida para cada pergunta, e as métricas de qualidade de recuperação permanecem separáveis por base de conhecimento. Uma única ferramenta abrangendo ambos os corpora tornaria essa distinção invisível.

    Pré-requisitos e implantação

    Para implantar a solução, são necessários:

    • Uma conta AWS com permissões para Amazon Bedrock, AgentCore (Runtime + Gateway), AWS Identity and Access Management (IAM), CloudWatch, AWS X-Ray, Amazon Elastic Container Registry (Amazon ECR), AWS CodeBuild, Amazon S3, AWS Lambda e AWS CloudFormation.
    • O modelo do agente disponível na conta (padrão: us.anthropic.claude-haiku-4-5-20251001-v1:0).
    • CloudWatch Transaction Search habilitado, para que os spans OTEL cheguem ao grupo aws/spans.
    • Node.js 18+ e o CDK CLI (npm install -g aws-cdk), além de Python 3.13+.
    • A conta e região inicializadas para o CDK (cdk bootstrap), uma vez por conta/região. Docker local não é necessário — a imagem do agente é construída pelo CodeBuild (ARM64).

    Atenção à disponibilidade regional: a Knowledge Base Gerenciada, a recuperação agêntica (AgenticRetrieveStream) e o Amazon Bedrock AgentCore não estão disponíveis em todas as regiões AWS. Antes de implantar, confirme se todos esses recursos estão disponíveis na sua região alvo e ajuste ACCOUNT_REGION no arquivo config.py. O padrão é us-west-2. Consulte a documentação do Amazon Bedrock AgentCore e a lista de serviços regionais da AWS.

    Com os pré-requisitos atendidos, toda a solução é implantada com um único conjunto de comandos:

    git clone https://github.com/aws-samples/amazon-bedrock-samples.git
    cd rag/managed-knowledge-bases/07-IaaC/managed-kb-observability-cdk/
    python3 -m venv .venv && source .venv/bin/activate
    pip install -r requirements.txt
    cdk bootstrap # uma vez por conta/região
    cdk deploy --all

    O terminal reporta cada stack conforme é concluída: bmkb-obs-cdk-kb [1/4], depois gateway [2/4], depois agent [3/4], e finalmente dashboards [4/4]. Essa ordem é derivada automaticamente pelo CDK a partir das referências entre os constructs — não existe script de deploy para manter sincronizado.

    Observabilidade em sete camadas

    A solução inclui dois dashboards no CloudWatch que cobrem sete camadas de telemetria:

    • L1: métricas nativas da Knowledge Base.
    • L2: métricas de ingestão.
    • L3: qualidade da recuperação agêntica (métricas sem ground truth: retrieval_utilization, grounded_coverage e duplicate_rate).
    • L4: métricas do Gateway e MCP (invocações, erros de sistema, erros de usuário, throttles).
    • L5: árvore de spans OTEL no grupo aws/spans.
    • L6: uso de tokens por modelo.
    • L7: scores de avaliação (sob demanda e contínua).

    As camadas 1, 4 e 5 são emitidas automaticamente. As camadas 3, 6 e 7 são publicadas como métricas customizadas pelo notebook de driver.

    Um detalhe importante sobre a camada 5: uma única chamada LLM produz três spans aninhados. Para contar cada chamada LLM apenas uma vez ao agregar tokens, é necessário filtrar pelo span folha do tipo CLIENT:

    fields attributes.gen_ai.request.model as model,
           attributes.gen_ai.usage.input_tokens as in_tok,
           attributes.gen_ai.usage.output_tokens as out_tok
    | filter ispresent(in_tok) and kind = 'CLIENT' and name like /^chat /
    | stats sum(in_tok) as input_tokens, sum(out_tok) as output_tokens, count(*) as llm_calls by model

    Sem esse filtro, a mesma consulta reportaria três vezes mais tokens e três vezes mais chamadas.

    Avaliação sob demanda e contínua

    A qualidade é medida de duas formas, ambas provisionadas pela aplicação:

    • Sob demanda: o notebook de driver chama o AgentCore (LLM-as-judge) sobre os spans de cada sessão, usando avaliadores integrados de Correção (Correctness), Fidelidade (Faithfulness) e Precisão de Seleção de Ferramenta (Tool-Selection Accuracy), publicando os scores no CloudWatch como camada 7.
    • Contínua (online): a stack do agente provisiona um AWS::BedrockAgentCore::OnlineEvaluationConfig que amostra sessões ao vivo e as pontua automaticamente, sem necessidade de executar o notebook. Os resultados chegam no grupo de logs /aws/bedrock-agentcore/evaluations/results/<config-id> e são publicados como métricas no namespace Bedrock-AgentCore/Evaluations, permitindo criar gráficos ou alarmes sem precisar analisar logs.

    Os quatro avaliadores integrados são: Precisão de Seleção de Ferramenta, Fidelidade, Correção e Relevância da Resposta. Na execução de exemplo descrita pela AWS, a avaliação contínua pontuou 1,00 em todos os quatro avaliadores, com cinco traces pontuados por avaliador.

    Atenção ao custo: a solução define SAMPLING_PERCENTAGE = 100 apenas para fins de demonstração, para que todos os resultados apareçam imediatamente. Isso não é uma recomendação para produção. A avaliação online invoca um LLM-as-judge por sessão amostrada, portanto o custo escala com a taxa de amostragem e o volume de tráfego. Para implantações reais, escolha uma porcentagem que se adeque às suas necessidades de monitoramento de qualidade e orçamento. A taxa é configurada em uma única constante, EvalConfig.SAMPLING_PERCENTAGE, no arquivo config.py.

    Limpeza dos recursos

    Para remover a solução e evitar cobranças contínuas (dados armazenados na Knowledge Base, imagem no ECR e avaliação online ativa geram custos enquanto as stacks existem), basta executar:

    cdk destroy --all

    O CDK remove as stacks na ordem inversa de dependência automaticamente: dashboards, depois agent, depois gateway, depois kb. O mesmo grafo de dependências derivado para o deploy é percorrido ao contrário — sem script de teardown para manter sincronizado.

    O que mudou em relação à solução de 2024

    Comparando com a solução de 2024, a mudança principal é de subtração: a nova arquitetura remove infraestrutura em vez de adicionar.

    • Banco vetorial: antes, era necessário provisionar, escalar e pagar por uma coleção OpenSearch Serverless com OCUs. Agora, com Type: MANAGED, o Amazon Bedrock gerencia armazenamento e indexação.
    • Ciclo de vida do índice: antes, um custom resource criava o índice e aguardava ficar pesquisável. Agora, não há nada a criar.
    • Modelo de embedding: antes, o cliente selecionava e concedia acesso ao modelo. Agora, é gerenciado pelo serviço por padrão.
    • Recuperação: antes, uma chamada Retrieve retornava os top-k chunks por similaridade vetorial. Agora, o AgenticRetrieveStream faz reranking interno e retorna uma resposta sintetizada com citações.
    • Telemetria: antes, nenhuma provisionada. Agora, sete camadas e dois dashboards.
    • Avaliação: antes, manual. Agora, sob demanda e contínua, ambas provisionadas.

    A troca é real nos dois sentidos: um único índice respondendo perguntas de ciclo único é mais barato por consulta, mais simples de raciocinar e totalmente suficiente quando um corpus contém a resposta. A arquitetura agêntica é a escolha certa quando esse cenário não se aplica.

    Próximos passos

    A partir dessa base, é possível apontar as fontes de dados para corpora próprios, colocar o agente em uma Nuvem Virtual Privada (VPC — Virtual Private Cloud), ajustar a taxa de amostragem da avaliação online ao orçamento e às políticas da organização, ou adicionar mais bases de conhecimento ao roteador. Para saber mais, consulte a documentação do Amazon Bedrock. A aplicação, o notebook de driver e os utilitários estão disponíveis no repositório GitHub, onde é possível clonar e implantar uma cópia própria com um único comando.

    Fonte

    Build agentic retrieval on a Managed Amazon Bedrock Knowledge Base with CDK (https://aws.amazon.com/blogs/machine-learning/build-agentic-retrieval-on-a-managed-amazon-bedrock-knowledge-base-with-cdk/)

  • Amazon Connect Customer expande testes e simulações para validar resultados de ações em fluxos

    Validação mais profunda nos testes de fluxos do Amazon Connect Customer

    A AWS anunciou uma expansão importante nas funcionalidades de teste e simulação do Amazon Connect Customer, a solução de Inteligência Artificial (IA) agêntica voltada para experiências de atendimento ao cliente em nível empresarial. A novidade permite que equipes de desenvolvimento e operações validem com muito mais precisão o comportamento dos fluxos de atendimento antes de colocá-los em produção.

    O que mudou na prática

    Até então, os testes disponíveis no Amazon Connect Customer confirmavam apenas se uma determinada ação dentro do fluxo havia sido iniciada. Com a atualização, passa a ser possível verificar também os dados retornados quando essa ação é concluída.

    Na prática, isso significa que agora é possível inspecionar resultados como:

    • A resposta devolvida por uma função Lambda;
    • O intent resolvido pelo Amazon Lex;
    • As variáveis definidas por um bloco de CX Agêntico.

    Ou seja, o teste passa a cobrir não só a execução da ação, mas também o conteúdo que ela produz — o que é fundamental para garantir que o fluxo se comporte exatamente como esperado em cada cenário.

    Diagnóstico mais rápido quando algo dá errado

    Outro ganho relevante desta atualização está na experiência de depuração. Quando um teste falha, a plataforma agora aponta diretamente a ação exata que retornou um resultado inesperado, em vez de exigir que o time rastreie o problema de trás para frente a partir de uma etapa downstream.

    Isso reduz significativamente o tempo gasto na investigação de falhas e aumenta a confiança da equipe ao publicar alterações nos fluxos de atendimento — algo crítico em ambientes de produção onde cada interação com o cliente importa.

    Como saber mais e verificar disponibilidade

    Para se aprofundar nessa funcionalidade, a AWS disponibiliza documentação detalhada sobre testes e simulação no guia do administrador do Connect Customer.

    Como nem todas as funcionalidades do Amazon Connect Customer estão disponíveis em todas as regiões da AWS simultaneamente, vale consultar a lista de disponibilidade de recursos do Connect Customer por região para confirmar se essa capacidade já está ativa no ambiente desejado.

    Para uma visão geral completa sobre o Amazon Connect Customer e tudo o que a solução oferece, acesse o site oficial do Amazon Connect Customer.

    Fonte

    Amazon Connect Customer expands testing and simulation to validate flow action outcomes (https://aws.amazon.com/about-aws/whats-new/2026/10/connect-customer-validate-flow-actions/)

  • CloudTroop Weekly #035 — 2026-w43





    CloudTroop Weekly #035 — 2026-w43

    25 de outubro de 2026

    Resumo da Semana

    A semana foi dominada por segurança e IA em produção. O caso PHP2Shell expôs uma realidade incômoda: exploits críticos chegam antes do patch, acelerados por IA. A resposta da AWS veio em múltiplas frentes — WAF para mitigação imediata, GuardDuty com 50+ novas regras e o Continuum automatizando remediação com PRs diretos no seu repositório. No lado de IA, saídas estruturadas no Bedrock e as Training Session APIs do SageMaker reduzem fricção para quem está levando modelos a produção. O CloudWatch Omni chegou a São Paulo, relevante para operações locais em ambientes multi-cloud.

    O que muda na prática

    • SLAs tradicionais de patching estão quebrados: exploits críticos chegam antes do embargo, então mitigação via WAF e detecção em runtime passam a ser camadas obrigatórias, não opcionais.
    • O AWS Continuum fecha o ciclo DevSecOps automaticamente — vulnerabilidades detectadas pelo GuardDuty e Security Hub agora geram PRs de correção diretamente no fluxo do desenvolvedor, reduzindo tempo de remediação sem depender de tickets manuais.
    • Pipelines agênticos com Claude no Bedrock ficam mais confiáveis em produção: saídas JSON garantidas por esquema eliminam código de validação e reduzem falhas silenciosas em integrações.

    Ações da semana

    • Se você opera aplicações PHP na AWS, ative as regras de WAF para CVE-2026-109618/109619 agora e agende o patching para esta sprint — não espere a janela de manutenção regular.
    • Acesse o GuardDuty Runtime Monitoring e revise quais das 50+ novas regras estão habilitadas nos seus workloads EC2, EKS e ECS/Fargate; o custo de configuração é zero e a cobertura MITRE ATT&CK aumenta imediatamente.

    Top 10 da Semana

    1

    Amazon detectou exploração do PHP2Shell antes da divulgação pública

    O caso evidencia que SLAs tradicionais de patching já não são suficientes — exploits críticos chegam antes do embargo terminar, acelerados por IA.

    Para quem: Equipes de segurança, SREs e gestores de risco que definem políticas de resposta a vulnerabilidades críticas.

    Segurança, Ameaças

    2

    AWS Continuum para vulnerabilidades de código agora disponível para todos

    Automatiza descoberta, validação e correção de vulnerabilidades em código com PRs diretos no fluxo do dev, integrando GuardDuty e Security Hub.

    Para quem: Engenheiros de segurança, DevSecOps e líderes de plataforma que buscam reduzir tempo de remediação de vulnerabilidades.

    DevSecOps, Segurança

    3

    Use AWS WAF para mitigar RCE do PHP2Shell (CVE-2026-109618/109619)

    Oferece mitigação imediata via WAF enquanto equipes realizam o patching, com orientações claras sobre os limites dessa proteção.

    Para quem: Engenheiros de segurança e SREs que operam aplicações PHP expostas na AWS e precisam de ação imediata.

    Segurança, WAF

    4

    GuardDuty Runtime Monitoring ganha 50+ novas regras de detecção

    Amplia cobertura de ameaças em EC2, EKS e ECS/Fargate com novos findings mapeados ao MITRE ATT&CK, sem custo adicional de configuração.

    Para quem: Engenheiros de segurança e times de operações que usam GuardDuty para monitorar workloads em containers e instâncias.

    Segurança, Detecção

    5

    SageMaker Training Session APIs: loops customizados sem gerenciar GPUs

    Elimina a barreira de infraestrutura para treinamento customizado de LLMs, com cobrança por token e liberdade algorítmica total.

    Para quem: Engenheiros de ML e pesquisadores que precisam de flexibilidade no loop de treinamento sem operar clusters GPU.

    MLOps, Treinamento

    6

    Saídas estruturadas para Claude no Bedrock eliminam parsing manual

    Respostas JSON garantidas por esquema reduzem código de validação e tornam pipelines agênticos mais confiáveis em produção.

    Para quem: Desenvolvedores que constroem aplicações e agentes com modelos Claude no Bedrock e precisam de outputs previsíveis.

    IA Aplicada, Bedrock

    7

    Boas práticas para integrar IAM Roles Anywhere com sua PKI

    Workloads híbridos e on-premises precisam de credenciais temporárias seguras — este guia cobre os pontos críticos de confiança e rotação.

    Para quem: Arquitetos de segurança e times de identidade que operam ambientes híbridos com acesso a recursos AWS.

    IAM, Segurança

    8

    5 desafios de produção em sistemas multi-agente e como resolvê-los

    Referência arquitetural open source com Strands Agents e Bedrock AgentCore para quem quer ir além do piloto em sistemas multi-agente.

    Para quem: Arquitetos e engenheiros de software que estão levando sistemas multi-agente do protótipo para produção.

    Agentes, Arquitetura

    9

    Amazon CloudWatch Omni chega a São Paulo com IA e multi-cloud

    Observabilidade com IA e suporte multi-cloud agora disponível na região de São Paulo, relevante para operações de empresas brasileiras.

    Para quem: Engenheiros de plataforma e SREs brasileiros que gerenciam ambientes multi-cloud e buscam observabilidade unificada.

    Observabilidade, Operações

    10

    Conecte dados on-premises ao Amazon Quick com PrivateLink sem internet

    Permite adotar IA agêntica em ambientes regulados (HIPAA, PCI-DSS) mantendo dados sensíveis dentro de perímetros de rede controlados.

    Para quem: Arquitetos de nuvem e times de compliance em setores regulados que precisam integrar IA sem expor dados à internet pública.

    Segurança, Rede, Compliance


  • Aprendizado por Reforço Multi-Turno no Amazon SageMaker AI: Guia Prático

    Por que o ajuste fino tradicional não resolve tarefas agênticas

    A maioria das técnicas de ajuste fino de modelos de linguagem foi projetada para melhorar respostas a prompts individuais. Mas tarefas agênticas funcionam de forma diferente: um agente que processa um relatório de despesas ou triagem de um chamado de suporte executa uma sequência de ações, onde cada passo depende do que aconteceu antes.

    O problema é que o ajuste fino supervisionado não tem rótulos para esse tipo de trajetória, e o aprendizado por reforço de turno único não consegue creditar uma decisão tomada três passos antes do resultado final. É exatamente para esse cenário que a AWS desenvolveu o Aprendizado por Reforço Multi-Turno (MTRL, do inglês Multi-Turn Reinforcement Learning) no Amazon SageMaker AI.

    Como o MTRL funciona no SageMaker AI

    No MTRL, o SageMaker AI envia prompts para um agente hospedado no Amazon Bedrock AgentCore — ou em infraestrutura própria, como Amazon EKS, Amazon EC2 ou AWS Fargate, via encaminhador AWS Lambda. O agente chama o modelo de política sendo treinado, age no ambiente por quantos turnos a tarefa exigir, e reporta uma única recompensa ao final do episódio. Não é necessário especificar a trajetória correta — apenas como avaliar o resultado.

    O algoritmo Otimização de Política por Gradiente Relativo de Grupo (GRPO) usa a variação de recompensas entre diferentes tentativas da mesma tarefa para atualizar um adaptador Adaptação de Baixo Posto (LoRA) no modelo de política. O MTRL é serverless: basta escolher o modelo base e o serviço provisiona toda a infraestrutura de treinamento e amostragem.

    O exemplo prático: treinando com o jogo Wordle

    Para demonstrar o pipeline, a AWS usou o Wordle como ambiente de treinamento. No jogo, o jogador tem seis tentativas para adivinhar uma palavra de cinco letras. Após cada tentativa, cada letra recebe uma cor: verde se estiver na posição correta, amarela se estiver na palavra mas em posição errada, e cinza se não estiver na palavra.

    O Wordle é um exemplo didático ideal para o MTRL porque as regras são simples, cada tentativa depende do feedback da anterior e o resultado é avaliado de forma objetiva. Na prática, o mesmo pipeline se aplica a fluxos de trabalho internos que modelos públicos nunca foram treinados para executar.

    No experimento descrito, o MTRL levou o modelo GPT-OSS-20B de uma taxa de resolução de 61% para 84% em palavras não vistas durante o treinamento, com custo de aproximadamente US$ 339 em tokens de treinamento.

    Arquitetura da solução

    O sistema tem duas metades. O SageMaker AI gerencia o job de treinamento e o modelo de política. O AgentCore hospeda o agente, o ambiente do Wordle e a função de recompensa. A cada rollout, o serviço MTRL invoca o runtime do AgentCore com uma linha de treinamento contendo a palavra secreta. Um agente Strands no runtime chama o modelo de política através do endpoint compatível com OpenAI do Job Runtime do SageMaker. O modelo faz até seis tentativas por meio de uma única ferramenta — guess_word — e ao final do jogo o agente retorna uma recompensa.

    Modelos e regiões suportados

    No momento da publicação, o MTRL suporta os seguintes modelos base, cada um treinado com um adaptador LoRA:

    • Amazon Nova 2 Lite — US East (N. Virginia) e US West (Oregon)
    • GPT-OSS-20B — US East (N. Virginia) e US West (Oregon)
    • Gemma 4 31B (instruction-tuned) — US West (Oregon)
    • Qwen 3.6 27B — US West (Oregon)

    A AWS escolheu o GPT-OSS-20B para o exemplo por ter o menor preço por token entre os quatro e por permitir controle do esforço de raciocínio por requisição. Consulte a documentação do MTRL para a lista atualizada.

    Custos do experimento

    O MTRL cobra por milhão de tokens em três dimensões: Prefill (tokens de entrada processados pelo modelo), Sample (tokens gerados, incluindo tokens de raciocínio) e Train (tokens processados no passo de retropropagação que atualiza o adaptador LoRA). A execução de 100 passos consumiu aproximadamente 1,29 bilhão de tokens ao longo de 12 horas e 40 minutos, com o seguinte custo a preços de tabela na região us-east-1:

    • Prefill: 491,6 milhões de tokens × US$ 0,12/M = US$ 58,99
    • Sample: 159,7 milhões de tokens × US$ 0,30/M = US$ 47,92
    • Train: 643,3 milhões de tokens × US$ 0,36/M = US$ 231,59
    • Total: US$ 338,50

    O runtime do AgentCore é cobrado separadamente por vCPU e memória utilizados. Nesse experimento, esse custo foi de aproximadamente US$ 79. Consulte a página de preços do Amazon SageMaker AI para valores atualizados.

    Passo a passo do pipeline

    Pré-requisitos

    Para seguir o tutorial, são necessários Python 3.10 ou superior, uv, Node 20 ou superior e a CLI do AgentCore (npm install -g @aws/agentcore). Veja como começar com o Amazon Bedrock AgentCore para instalação e permissões de Gerenciamento de Identidade e Acesso (IAM). Também são necessários botocore 1.43.37 ou superior, dois papéis IAM, e um bucket do Amazon S3 na mesma região do agente. Veja os pré-requisitos do MTRL para detalhes completos.

    Etapa 1: Criar os papéis IAM

    O MTRL usa dois papéis. O papel do runtime do agente é criado automaticamente pelo comando agentcore deploy e precisa da política gerenciada AmazonSageMakerJobRuntimeAccess. O papel do job de treinamento deve ser criado manualmente e precisa confiar em job.sagemaker.amazonaws.com com as ações sts:AssumeRole e sts:TagSession, além da política AmazonSageMakerJobFullAccess.

    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {"Service": "job.sagemaker.amazonaws.com"},
        "Action": ["sts:AssumeRole", "sts:TagSession"]
      }]
    }

    Atenção: o principal correto é job.sagemaker.amazonaws.com, não sagemaker.amazonaws.com. Com o principal genérico, o CreateJob falha com “Could not assume role”.

    Etapa 2: Implantar o agente no Amazon Bedrock AgentCore

    Clone o repositório de exemplos, configure conta e região em Wordle/agentcore/aws-targets.json e execute:

    git clone https://github.com/aws-samples/sample-multi-turn-rl-wordle
    cd sample-multi-turn-rl-wordle/Wordle
    agentcore validate
    agentcore deploy

    A CLI compila as dependências do agente para a plataforma Linux ARM64 do runtime, cria o papel de execução com a política AmazonSageMakerJobRuntimeAccess e implanta via AWS CloudFormation. Anote o ARN do runtime na saída para usar no job de treinamento.

    O agente é um único arquivo, main.py. Simplificado, seu ponto de entrada tem a seguinte estrutura — para uma tarefa própria, basta alterar o parsing da tarefa, as ferramentas e a recompensa:

    app = BedrockAgentCoreApp()
    
    @app.entrypoint # outermost: starts the HTTP server AgentCore invokes
    @sagemaker_rft_handler # reports the returned reward to SageMaker AI
    def handle_rollout(payload):
        prompt, answer = parse_task(payload["prompt"])
        game = WordleGame(answer)
    
        @tool
        def guess_word(guess: str) -> str:
            """Submit a 5-letter Wordle guess and get feedback."""
            return game.guess(guess)
    
        agent = Agent(model=build_model(), system_prompt=SYSTEM_PROMPT, tools=[guess_word])
        agent(prompt)
        return {"reward": game.final_reward()}

    Importante: o decorator sagemaker_rft_handler não inicia um servidor HTTP por si só. É necessário envolvê-lo com BedrockAgentCoreApp e @app.entrypoint, com o decorator entrypoint mais externo. Sem isso, cada invocação expira após 30 segundos.

    Etapa 3: Verificar o runtime antes de gastar GPU

    Antes de iniciar o treinamento, vale confirmar que toda a cadeia funciona com um payload de teste. O repositório inclui um em Wordle/payload.json. Substitua o ID de conta fictício pelo seu e execute:

    ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
    sed "s/111122223333/$ACCOUNT/" payload.json > /tmp/payload.json
    aws bedrock-agentcore invoke-agent-runtime \
      --agent-runtime-arn  \
      --runtime-session-id smoke-test-$(date +%s)000000000000000 \
      --payload fileb:///tmp/payload.json /dev/stdout

    Nos logs do Amazon CloudWatch do runtime, o agente deve tentar autenticar no endpoint do Job Runtime e receber um erro 400 com “Could not find job” — o que confirma que parsing, autenticação e reporte de erros funcionam corretamente.

    Etapa 4: Preparar o dataset

    O dataset do MTRL não tem respostas-alvo, transcrições nem rótulos. Cada linha é uma tarefa para o agente tentar. As três primeiras linhas do arquivo de treinamento têm esta forma:

    {"prompt": "{\"prompt\": \"Guess the 5-letter word\", \"answer\": \"riser\", \"id\": \"wordle_train_0000\"}"}
    {"prompt": "{\"prompt\": \"Guess the 5-letter word\", \"answer\": \"swoon\", \"id\": \"wordle_train_0001\"}"}
    {"prompt": "{\"prompt\": \"Guess the 5-letter word\", \"answer\": \"dirty\", \"id\": \"wordle_train_0002\"}"}

    O campo answer é usado apenas pelo ambiente e pela função de recompensa — o modelo de política nunca o vê. O script make_dataset.py do repositório gera 640 palavras de treinamento e 128 de validação sem sobreposição, a partir das listas de palavras de código aberto SCOWL. Após gerar, faça upload para o Amazon S3:

    uv run python make_dataset.py
    aws s3 cp training-data.jsonl s3:///wordle-mtrl/train/
    aws s3 cp validation-data.jsonl s3:///wordle-mtrl/validation/

    Etapa 5: Lançar o job de treinamento

    O launcher usa a classe MultiTurnRLTrainer do SDK sagemaker-train. Um app MLflow é obrigatório — se não tiver um, crie com aws sagemaker create-mlflow-app:

    uv run python run_mtrl_training.py \
      --model openai-reasoning-gpt-oss-20b \
      --agent-runtime-arn  \
      --role-arn arn:aws:iam:::role/ \
      --train-dataset s3:///wordle-mtrl/train/training-data.jsonl \
      --val-dataset s3:///wordle-mtrl/validation/validation-data.jsonl \
      --s3-output-path s3:///wordle-mtrl/output/ \
      --mlflow-app-arn arn:aws:sagemaker:::mlflow-app/

    O launcher sobrescreve três hiperparâmetros: sampling_max_tokens para 8192 (o padrão de 4096 fazia o modelo esgotar tokens antes da primeira chamada de ferramenta), max_epochs para 20 e max_steps para 100.

    Atenção: não reimplante o agente enquanto um job estiver em execução. Reimplantar reinicia o runtime, os rollouts em andamento não recebem requisições de amostragem e o serviço falha o job inteiro.

    Etapa 6: Monitorar o treinamento no MLflow

    O serviço registra métricas de recompensa, tokens e turnos a cada passo, além de executar validação a cada val_every passos. A métrica principal a observar é val/reward/pass_at_1 — a fração de palavras de validação resolvidas. No experimento, a recompensa de treinamento subiu para cerca de +0,57 nos primeiros 15 passos e se estabilizou. A taxa de resolução na validação saltou de 2% para 31% nos primeiros 10 passos, depois oscilou entre 35% e 48% — variação esperada com apenas 128 palavras.

    Etapa 7: Avaliar o modelo treinado nas configurações de serviço

    Um job de avaliação (com JobCategory definido como AgentRFTEvaluation) executa os prompts de avaliação pelo mesmo runtime do AgentCore e pela mesma função de recompensa, tanto no modelo base quanto no pacote treinado, registrando eval/reward/pass_at_1 no MLflow. Diferentemente da validação durante o treinamento, aqui é possível definir a temperatura.

    uv run python run_mtrl_eval.py --runs base:1.0 trained:1.0 \
      --model-package-arn  \
      --agent-runtime-arn  \
      --role-arn arn:aws:iam:::role/ \
      --dataset s3:///wordle-mtrl/validation/validation-data.jsonl \
      --s3-output-path s3:///wordle-mtrl/eval/ \
      --mlflow-app-arn arn:aws:sagemaker:::mlflow-app/

    Os resultados mostram que o adaptador adiciona entre 14 e 54 pontos percentuais em todas as configurações testadas. A curva de validação do treinamento reportou 37% no passo 100 (temperatura 0), mas nas configurações de serviço (esforço médio, temperatura 1.0) o modelo treinado resolve 84% das palavras, contra 61% do modelo base. A referência de hiperparâmetros recomenda temperatura 0 para avaliação durante o treinamento por tornar as curvas determinísticas e comparáveis — mas o ideal é sempre avaliar nas mesmas configurações que serão usadas em produção.

    Dica: avalie nas configurações que você vai usar em produção. A curva de treinamento diz que o adaptador termina em 37%. Nas configurações de serviço, ele resolve 84%.

    Etapa 8: Limpeza dos recursos

    # 1. Agent runtime and its execution role. remove all resets the project config;
    # the next deploy sees the empty state and tears down the deployed resources.
    cd sample-multi-turn-rl-wordle/Wordle
    agentcore remove all
    agentcore deploy
    
    # 2. MLflow app
    aws sagemaker delete-mlflow-app --arn arn:aws:sagemaker:::mlflow-app/
    
    # 3. Datasets, job output, and evaluation output
    aws s3 rm s3:///wordle-mtrl/ --recursive

    Como projetar a função de recompensa: lições aprendidas

    A função de recompensa usada no experimento passou por uma revisão importante. A primeira versão somava a pontuação por tentativa de um projeto de referência (wordle-lora-rl) ao longo de todo o jogo. Isso gerou duas inversões problemáticas: um jogo perdido pagava recompensa positiva (cerca de +0,49 em seis turnos de bônus), e resolver na primeira tentativa valia menos do que resolver na terceira.

    A solução foi separar um termo de resultado dominante de um pequeno termo de modelagem limitado:

    reward = outcome + w * clip(shaping, -1, 1), onde w = 0.04 se resolvido, caso contrário 0.15

    O termo de resultado é definido exclusivamente pelo desfecho do jogo:

    • Resolvido na tentativa n: 1,05 + 0,5 × (6 – n) / 5 — de 1,55 na primeira até 1,05 na sexta
    • Seis tentativas sem resolver: -0,5
    • Nunca fez uma tentativa válida: -1,5

    O termo de modelagem soma penalidades por contradizer letras conhecidas, por repetir tentativas e por palavras fora do dicionário, além de bônus por tentar letras novas e reduzir o espaço de possibilidades. Esse valor é limitado a [-1, 1] e escalado pelo peso w, garantindo que nunca mova um jogo para outra faixa de resultado.

    Como a documentação do SageMaker AI orienta: comece com uma recompensa baseada em resultado, adicione modelagem com parcimônia e verifique a recompensa em trajetórias reais.

    Problemas comuns durante o treinamento

    A AWS documentou os principais erros encontrados durante o experimento, em ordem de ocorrência:

    • Tokens de autenticação sob concorrência: criar um token por chamada esgota o provedor de credenciais em 32 rollouts simultâneos. A solução é uma sessão auto-renovável com cache curto e re-autenticação em erros 403.
    • Rollout que nunca chega ao modelo falha o job inteiro: quando todas as chamadas ao modelo falham por autenticação, o serviço encerra o job com “No sampling requests were received”. Retornar um status de erro também causa falha — sempre retorne uma recompensa.
    • Chamadas de ferramenta derivando para texto puro: com taxa de aprendizado muito alta, o modelo passou a escrever chamadas de ferramenta como texto, todos os rollouts receberam a recompensa mínima e o gradiente desapareceu. A solução foi recuperar tentativas de texto bruto com uma pequena penalidade de formatação.
    • Platô de treinamento: a recompensa de treinamento parou de subir após cerca de 15 passos e a validação após 30 passos. Um currículo que inicializa jogos com tentativas anteriores, ou mais rollouts por palavra, seriam os próximos passos a testar.

    Conclusão

    O MTRL no SageMaker AI treina modelos com base no resultado de um episódio completo — o que o torna adequado para tarefas agênticas onde a trajetória correta é desconhecida e apenas o resultado pode ser avaliado. O exemplo usou uma recompensa única por episódio, mas quando passos intermediários também podem ser avaliados, o MTRL aceita uma recompensa por turno via API UpdateReward.

    Um modelo de código aberto com 20 bilhões de parâmetros atingiu 84% de taxa de resolução nas configurações de serviço, partindo de 61%, com cerca de US$ 339 em tokens de treinamento e US$ 79 em uso do runtime do AgentCore. O mesmo pipeline se aplica a procedimentos internos, ferramentas e fluxos de trabalho que modelos públicos nunca foram treinados para executar.

    Para começar, clone o repositório de exemplos, siga os passos descritos e execute o smoke test antes de comprometer tempo de GPU. Para as APIs subjacentes, consulte a documentação do MTRL no SageMaker AI.

    Fonte

    Multi-Turn Reinforcement Learning on Amazon SageMaker AI: A hands-on guide (https://aws.amazon.com/blogs/machine-learning/multi-turn-reinforcement-learning-on-amazon-sagemaker-ai-a-hands-on-guide/)

  • Atualizações Trimestrais do Amazon Corretto — Outubro de 2026

    O que foi anunciado

    Em 22 de outubro de 2026, a AWS divulgou as atualizações trimestrais de segurança e correções críticas para as versões com Suporte de Longo Prazo (LTS — Long-Term Support) do Amazon Corretto, a distribuição gratuita e pronta para produção do OpenJDK mantida pela empresa.

    Versões disponíveis

    As seguintes versões foram liberadas para download a partir desta atualização:

    • Corretto 27.0.1.0.10
    • Corretto 25.0.5.0.9
    • Corretto 21.0.13.0.10
    • Corretto 17.0.21.0.10
    • Corretto 11.0.33.0.9
    • Corretto 8u512

    Todas essas versões recebem patches de segurança e correções críticas como parte do ciclo trimestral de manutenção do Amazon Corretto.

    O que é o Amazon Corretto

    Para quem ainda não conhece, o Amazon Corretto é uma distribuição sem custo, multiplataforma e pronta para ambientes de produção do OpenJDK — a implementação de referência da linguagem Java. A proposta da AWS é oferecer uma alternativa confiável e com suporte de longo prazo para equipes que dependem do Java no dia a dia, sem custos de licenciamento.

    Como obter as atualizações

    Há duas formas principais de acessar as novas versões:

    • Download direto: acesse a página oficial do Corretto e faça o download da versão desejada — Corretto 27, 25, 21, 17, 11 ou 8.
    • Via gerenciador de pacotes no Linux: é possível receber as atualizações diretamente pelo sistema operacional configurando um repositório Apt, Yum ou Apk do Corretto, dependendo da distribuição Linux utilizada.

    Feedback e contribuições

    A AWS deixa aberto o canal de contribuições para a comunidade. Feedbacks sobre o Corretto são bem-vindos via GitHub, onde o projeto é mantido de forma transparente.

    Por que isso importa para times brasileiros

    Manter o ambiente Java atualizado é uma prática essencial de segurança. Atualizações trimestrais como essa corrigem vulnerabilidades conhecidas e garantem que as aplicações continuem operando com o nível de proteção mais recente. Se o seu time utiliza Amazon Corretto em produção, este é o momento de planejar a atualização para as versões mais recentes disponibilizadas neste ciclo.

    Fonte

    Amazon Corretto October 2026 Quarterly Updates (https://aws.amazon.com/about-aws/whats-new/2026/10/amazon-corretto-october-2026-quarterly-updates)