Estendendo Meu Blog com Revisão por Amazon Nova

2025-07-05
This post cover image
#aws
#cloud
#genai
#serverless

Este arquivo foi traduzido automaticamente por IA, erros podem ocorrer

Blogging ao longo dos anos realmente se tornou algo que gosto de fazer. Frequentemente, construo algo e então escrevo um post sobre a solução e o que aprendi. Mais de uma vez, foi sobre arquitetura serverless e event-driven. No entanto, há uma coisa que não gosto: como falante não nativo de inglês, tendo a cometer erros ortográficos e gramaticais, e mesmo que eu revise várias vezes, sempre perco alguma coisa.

Eu previamente estendi meu blog com geração de voz usando Amazon Polly e aprendizado gamificado com quizzes automatizados.

Desta vez, é hora de mais uma adição a isso, que também me ajudará e economizará tempo. Esse é um serviço de revisão automatizada usando Amazon Nova.

Meu Problema

Quando escrevo meus posts de blog, foco na solução e na arquitetura, apresentando e mostrando de uma boa maneira. Tenho muito menos foco na ortografia, mesmo tendo uma extensão de verificação ortográfica instalada no VSCode. Então, revisar meus posts leva muito tempo, e para ser honesto, nem sempre sou tão minucioso. Então, o que eu precisava era uma solução automatizada que pudesse:

Manter meu estilo de escrita: Não quero que a revisão mude minha voz ou explicações técnicas. Preservar formatação markdown: Meus posts de blog são escritos em markdown com blocos de código, links e imagens. Integrar perfeitamente: A solução deveria se encaixar em minha solução existente com geração de voz e quiz. Ser custo-efetiva: Executar apenas em certas Pull-requests, e ser serverless e event-driven como a solução de voz e quiz.

Apresentando Amazon Nova

Amazon Nova são os LLMs próprios da Amazon que foram anunciados no re:Invent 2024. Antes do Nova, havia vários modelos Titan, e para ser honesto, Titan não era tão bom. Nova, por outro lado, é realmente bom e é uma opção boa e custo-efetiva. Modelos Nova estão disponíveis através do Amazon Bedrock, como muitos outros modelos, que fornece uma API para acessar vários modelos de linguagem grandes.

O que é Amazon Bedrock?

Amazon Bedrock é um serviço totalmente gerenciado que torna fácil o acesso a muitos modelos fundamentais. Eles estão todos disponíveis através de uma única API e me permite construir grandes soluções de IA generativa de maneira fácil. Bedrock nos oferece:

Escolha de modelos: Acesso a modelos da Amazon, Anthropic, Meta e vários outros, com novos modelos sendo constantemente adicionados. Integração fácil: Serverless e gerenciado, com chamadas de API simples sem gerenciar infraestrutura. Capacidades de fine-tuning: Personalizar modelos com seus próprios dados. Segurança e privacidade de dados: Nossos dados não são usados para treinar nenhum modelo. Agentes Bedrock: Agentes que podem ser usados para construir aplicações que combinam LLMs e APIs para criar soluções poderosas.

Modelos Amazon Nova

Amazon Nova oferece, neste momento, quatro modelos diferentes de compreensão/raciocínio, 2 modelos criativos e 1 modelo de fala.

Os modelos de compreensão podem lidar com diferentes entradas como texto, imagens, vídeo, documentos e código. Todos retornam a resposta em texto. Esses modelos são:

  • Nova Micro: Apenas texto, baixa latência e respostas rápidas com baixo custo.
  • Nova Lite: Modelo multimodal de baixo custo que é super rápido processando texto, imagens e vídeo.
  • Nova Pro: Modelo multimodal muito capaz, por um bom preço, que oferece um ótimo equilíbrio de precisão, velocidade e custo para uma ampla gama de tarefas.
  • Nova Premier: O modelo multimodal mais capaz para tarefas complexas, não disponível em muitas regiões.

Selecionei Nova Pro para minha tarefa pois, para revisar posts de blog, fornece um ótimo equilíbrio de precisão e custo-efetividade. Ele lida com compreensão de contexto, mantém estilo de escrita e faz pequenas correções sem sobre-editar meu conteúdo.

Os modelos criativos são:

  • Amazon Nova Canvas: Um modelo de geração de imagens de alta qualidade.
  • Amazon Nova Reel: Um modelo de geração de vídeo.

Amazon Nova Canvas e Amazon Nova Reel, neste momento, não estão disponíveis em muitas regiões. Você tem que usar us-east-1 (N. Virgínia), eu-west-1 (Irlanda), ou ap-northeast-1 (Tóquio).

O modelo de fala é:

  • Amazon Nova Sonic: Que entrega conversas de voz em tempo real, similares às humanas.

Amazon Nova Sonic está, neste momento, disponível em us-east-1 (N. Virgínia), eu-north-1 (Estocolmo), e ap-northeast-1 (Tóquio) e suporta inglês (US, UK) e espanhol.

Não ter modelos disponíveis em todas as regiões ou mesmo nas mesmas regiões pode se tornar um problema ao construir nossas aplicações.

Inferência Cross-Region

Uma coisa que precisamos mencionar é a configuração de inferência cross-region no Bedrock, que é feita via modelos de inferência. O que isso faz é que nossas chamadas automaticamente são roteadas para a região com mais recursos disponíveis, garantindo que nossas chamadas possam ser atendidas. Ao usar os modelos Nova fora de us-east-1 (N. Virgínia) e AWS GovCloud (US-West), precisamos usar um perfil de inferência ao chamar a API Bedrock. Se não fizermos isso, seremos atingidos por um erro dizendo que o modelo não está disponível na região de forma serverless.

Como exemplo, se chamarmos o eu.amazon.nova-pro-v1:0 de eu-west-1, onde minha solução roda, nossa chamada de inferência permanecerá dentro da região EU e a inferência pode ser feita de uma das regiões EU: eu-central-1, eu-north-1, eu-west-1, eu-west-3.

Arquitetura da Solução

No post aprendizado gamificado com quizzes automatizados, introduzo a arquitetura. É construída no Amazon EventBridge, dividida em múltiplos serviços, e roda como um Padrão Saga.

Imagem mostrando visão geral da pipeline atual

Como explicado no post acima, executo duas coisas principais: gero o quiz para o aprendizado gamificado e uso Polly para gerar voz que lê meu post de blog. Esta é uma mistura de ações GitHub que construirão a página e farão upload para um bucket de staging no S3. Após o upload para o bucket de staging estar completo, ações GitHub postarão um evento em um event-bus EventBridge e aqui é onde minha parte baseada em AWS assume.

A pipeline CI/CD baseada em AWS é event-driven e serverless. Os serviços primários usados são StepFunctions, Lambda e EventBridge. O fluxo é baseado em um padrão saga onde os serviços de domínio passam adiante postando eventos de domínio no event-bus, que moverá a saga para o próximo passo.

Como minha geração de voz é feita dos arquivos HTML renderizados, para máxima precisão, eu simplesmente não podia conectar a revisão como um primeiro passo neste Padrão Saga. A solução se tornou adicionar ações GitHub na saga. Um dia eu posso me afastar das Ações GitHub para algo mais, mas por agora, será parte de toda a solução.

Então, adicionarei a seguinte parte, que agora roda quando minha Pull-Request é aberta:

Imagem mostrando visão geral da pipeline de revisão

Nesta parte, busco informações do GitHub, e chamo Amazon Nova via Amazon Bedrock para fazer minha revisão. Quando completo, o serviço adiciona um novo commit ao PR com o arquivo markdown atualizado.

Executando as Partes de Voz e Quiz

Agora, preciso de uma maneira de integrar e iniciar os passos de Voz e Quiz, que antes eu estava executando quando o PR era criado. Em vez disso, agora tenho uma Ação GitHub que detectará o commit de revisão e iniciará esse fluxo. Dando uma solução com duas partes distintas.

Imagem mostrando visão geral completa da pipeline de revisão

Agora criei duas partes distintas no fluxo. Toda lógica principal está rodando no AWS e Ação GitHub constrói o blog de staging e invoca as diferentes partes, enviando diferentes eventos para EventBridge.

Mergulho Técnico Profundo

Vamos fazer um mergulho técnico profundo na solução e no serviço de revisão atual.

StepFunction

O coração de tudo é um orquestrador implementado com StepFunctions. Ele fará checkout dos arquivos, executará revisão e criará o novo commit.

Imagem mostrando a StepFunction

O trabalho é basicamente executado por três funções Lambda. A função Lambda central é a que executa a revisão real. As funções que fazem checkout do PR e criam um novo commit ambas usam Octokit. Para ver como essas funcionam, verifique meus posts anteriores. Focarei no revisor real.

Função Lambda de Revisão

A função inicializará tudo, criará o prompt, e chamará Nova e Bedrock, e armazenará a versão revisada no S3. O post original também é mantido e o arquivo é apenas renomeado.

import json
import os
import boto3
from botocore.exceptions import ClientError

def handler(event, context):
    print("Received event:", json.dumps(event, indent=2))

    try:
        bucket = event.get("S3Bucket")
        key = event.get("Key")

        if not bucket or not key:
            raise ValueError("Both 'bucket' and 'key' must be provided in the event")

        s3_client = boto3.client("s3")
        bedrock_client = boto3.client("bedrock-runtime", region_name="eu-west-1")

        response = s3_client.get_object(Bucket=bucket, Key=key)
        file_content = response["Body"].read().decode("utf-8")

        prompt = f"""You are a professional technical editor and proofreader, expert in AWS and Cloud computing. Please carefully proofread the following markdown blog post for spelling and grammatical errors. 
        Instructions:
        - Fix any spelling mistakes
        - Correct grammatical errors
        - Maintain the original markdown formatting
        - Keep the tone and style consistent
        - Do not change the meaning or structure of the content
        - Return only the corrected markdown text without any additional commentary
        - Do not surround the proofread version with ```markdown

        Here is the markdown content to proofread:
        {file_content}"""

        request_body = {
            "messages": [{"role": "user", "content": [{"text": prompt}]}],
            "inferenceConfig": {
                "temperature": 0.1,
                "topP": 0.9,
                "maxTokens": 10240,
            },
        }

        bedrock_response = bedrock_client.invoke_model(
            modelId="eu.amazon.nova-pro-v1:0",
            body=json.dumps(request_body),
            contentType="application/json",
        )

        response_body = json.loads(bedrock_response["body"].read())
        proofread_content = response_body["output"]["message"]["content"][0]["text"]

        if key.endswith(".md"):
            base_name = key[:-3]
        else:
            base_name = key

        original_backup_key = f"{base_name}-original.md"

        s3_client.copy_object(
            Bucket=bucket,
            CopySource={"Bucket": bucket, "Key": key},
            Key=original_backup_key,
        )

        s3_client.put_object(
            Bucket=bucket,
            Key=key,
            Body=proofread_content.encode("utf-8"),
            ContentType="text/markdown",
        )

        return {
            "statusCode": 200,
            "body": json.dumps(
                {
                    "message": "Proofreading completed successfully",
                    "proofread_length": len(proofread_content),
                }
            ),
        }

    except ClientError as e:
        error_code = e.response["Error"]["Code"]
        error_message = e.response["Error"]["Message"]
        print(f"AWS Client Error ({error_code}): {error_message}")

        return {
            "statusCode": 500,
            "body": json.dumps(
                {
                    "error": "AWS Client Error",
                    "message": error_message,
                }
            ),
        }

    except ValueError as e:
        print(f"Validation Error: {str(e)}")
        return {
            "statusCode": 400,
            "body": json.dumps({"error": "Validation Error", "message": str(e)}),
        }

    except Exception as e:
        print(f"Unexpected error: {str(e)}")
        return {
            "statusCode": 500,
            "body": json.dumps({"error": "Internal Server Error", "message": str(e)}),
        }

Engenharia de Prompt

Uma parte importante que não deveria ser esquecida é engenharia de prompt. O prompt precisa ser claro e incluir instruções detalhadas sobre como o LLM deveria agir. Precisei iterar o prompt várias vezes para obter o resultado que precisava. Meu prompt inclui instruções específicas para:

  • Corrigir erros ortográficos e gramaticais
  • Manter a formatação markdown original
  • Preservar terminologia técnica
  • Manter o estilo e tom de escrita consistentes
  • Retornar apenas o conteúdo corrigido sem comentários

No final, o seguinte prompt me deu o resultado que queria.

You are a professional technical editor and proofreader, expert in AWS and Cloud computing. Please carefully proofread the following markdown blog post for spelling and grammatical errors. 
Instructions:
- Fix any spelling mistakes
- Correct grammatical errors
- Maintain the original markdown formatting
- Keep the tone and style consistent
- Do not change the meaning or structure of the content
- Return only the corrected markdown text without any additional commentary
- Do not surround the proofread version with ```markdown

Here is the markdown content to proofread:

Iniciando Parte de Voz e Quiz

A segunda parte do fluxo, gerar voz e quiz, roda quando um novo commit com a mensagem de commit "Proofread by Amazon Nova" é adicionado ao pull-request. A ação inicia quando o evento synchronize ocorre. A primeira parte verifica o commit e obtém a última mensagem de commit. Os passos depois disso então verificarão a mensagem.

name: Start Polly Voice and Quiz Flow

on:
  pull_request:
    types: [synchronize]
    paths:
      - "**/posts/*.md"

jobs:
  check-commit:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./
    outputs:
      message: $NaN
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: $

      - name: Get last commit message
        id: commit-msg
        run: |
          message=$(git log -1 --pretty=format:"%s" HEAD)
          echo "message=${message}" >> $GITHUB_OUTPUT

  build:
    needs: check-commit
    if: contains(needs.check-commit.outputs.message, 'Proofread by Amazon Nova')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install and Build
        run: |
          npm ci
          npm run build

  deploy:
    needs: build
    runs-on: ubuntu-latest

    permissions:
      id-token: write
      contents: read

    steps:
      - name: Upload build blog to S3
        working-directory: ./
        run: |
          aws s3 sync --delete public/. s3://<My-Staging-Bucket>
          aws events put-events --entries '....'

Conclusão

Estender meu blog com revisão automatizada usando Amazon Nova me economizou muito tempo. Agora faço uma revisão rápida eu mesmo, então delego a parte grande para Amazon Nova. A extensão se encaixa perfeitamente no design event-driven que eu já tinha em vigor.

Então, com Bedrock e Amazon Nova, junto com uma abordagem serverless, criei e estendi minha solução que é:

  • Confiável: Qualidade de revisão consistente para cada post
  • Custo-efetiva: Modelo pay-per-use com custos operacionais mínimos

Mais importante, revisão automatizada me permite focar no que mais gosto, criar conteúdo técnico que ajuda outros a aprender sobre tecnologias cloud.

Indo adiante, tenho várias outras ideias que melhorarão meu blog usando Amazon Nova e IA. Fiquem ligados para mais soluções divertidas!

Palavras Finais

Não esqueça de me seguir no LinkedIn e para mais conteúdo, leia o resto dos meus Blogs.

Como Werner diz! Agora Vá Construir!