Estendendo Meu Blog com Revisão por Amazon Nova

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.
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:
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.
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.
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!