Estendere il Mio Blog con la Correzione di Bozze di Amazon Nova

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

Questo file è stato tradotto automaticamente dall'IA, potrebbero verificarsi errori

Il blogging nel corso degli anni è davvero diventato qualcosa che mi piace fare. Spesso, costruisco qualcosa e poi scrivo un post sulla soluzione e su quello che ho imparato. Più di una volta, è stato sull'architettura serverless ed event-driven. Tuttavia, c'è una cosa che non mi piace: come parlante non nativo inglese, tendo a fare errori sia ortografici che grammaticali, e anche se rileggo più volte, mi sfugge sempre qualcosa.

Ho precedentemente esteso il mio blog con generazione vocale usando Amazon Polly e apprendimento gamificato con quiz automatizzati.

Questa volta, è tempo di un'altra aggiunta a questo, che mi aiuterà anche e mi farà risparmiare tempo. Quello è un servizio di correzione automatica delle bozze usando Amazon Nova.

Il Mio Problema

Quando scrivo i miei post del blog, mi concentro sulla soluzione e sull'architettura, presentandola e mostrandola in modo efficace. Ho molto meno focus sull'ortografia, anche se ho un'estensione di controllo ortografico installata in VSCode. Quindi, la correzione dei miei post richiede molto tempo, e ad essere onesto, non sono sempre così accurato. Quindi, quello di cui avevo bisogno era una soluzione automatizzata che potesse:

Mantenere il mio stile di scrittura: Non voglio che la correzione cambi la mia voce o le spiegazioni tecniche. Preservare la formattazione markdown: I miei post del blog sono scritti in markdown con blocchi di codice, link e immagini. Integrarsi perfettamente: La soluzione dovrebbe adattarsi alla mia soluzione esistente con generazione vocale e quiz. Essere conveniente: Funzionare solo su certe Pull-request, ed essere serverless ed event-driven proprio come la soluzione vocale e quiz.

Presentando Amazon Nova

Amazon Nova sono gli LLM proprietari di Amazon che sono stati annunciati al re:Invent 2024. Prima di Nova, c'erano diversi modelli Titan, e ad essere onesto, Titan non era così buono. Nova, d'altra parte, è davvero buono ed è un'opzione buona e conveniente. I modelli Nova sono disponibili attraverso Amazon Bedrock, come molti altri modelli, che fornisce un'API per accedere a vari modelli di linguaggio di grandi dimensioni.

Cos'è Amazon Bedrock?

Amazon Bedrock è un servizio completamente gestito che rende facile l'accesso a molti modelli fondazionali. Sono tutti disponibili attraverso una singola API e mi permette di costruire grandi soluzioni di IA generativa in modo facile. Bedrock ci offre:

Scelta di modelli: Accesso a modelli di Amazon, Anthropic, Meta e molti altri, con nuovi modelli che vengono costantemente aggiunti. Integrazione facile: Serverless e gestito, con semplici chiamate API senza gestire l'infrastruttura. Capacità di fine-tuning: Personalizzare i modelli con i tuoi dati. Sicurezza e privacy dei dati: I nostri dati non vengono utilizzati per addestrare alcun modello. Agenti Bedrock: Agenti che possono essere utilizzati per costruire applicazioni che combinano LLM e API per creare soluzioni potenti.

Modelli Amazon Nova

Amazon Nova offre, in questo momento, quattro diversi modelli di comprensione/ragionamento, 2 modelli creativi e 1 modello vocale.

I modelli di comprensione possono gestire diversi input come testo, immagini, video, documenti e codice. Tutti restituiscono la risposta in testo. Questi modelli sono:

  • Nova Micro: Solo testo, bassa latenza e risposte veloci con un costo basso.
  • Nova Lite: Modello multimodale a basso costo che è super veloce nel processare testo, immagini e video.
  • Nova Pro: Modello multimodale molto capace, per un buon prezzo, che offre un grande equilibrio di precisione, velocità e costo per una vasta gamma di compiti.
  • Nova Premier: Il modello multimodale più capace per compiti complessi, non disponibile in molte regioni.

Ho selezionato Nova Pro per il mio compito poiché, per la correzione di bozze dei post del blog, fornisce un grande equilibrio di precisione e convenienza. Gestisce la comprensione del contesto, mantiene lo stile di scrittura e fa piccole correzioni senza sovra-editare il mio contenuto.

I modelli creativi sono:

  • Amazon Nova Canvas: Un modello di generazione di immagini di alta qualità.
  • Amazon Nova Reel: Un modello di generazione video.

Amazon Nova Canvas e Amazon Nova Reel, al momento, non sono disponibili in molte regioni. Devi usare us-east-1 (N. Virginia), eu-west-1 (Irlanda), o ap-northeast-1 (Tokyo).

Il modello vocale è:

  • Amazon Nova Sonic: Che fornisce conversazioni vocali in tempo reale simili all'uomo.

Amazon Nova Sonic è, al momento, disponibile in us-east-1 (N. Virginia), eu-north-1 (Stoccolma), e ap-northeast-1 (Tokyo) e supporta inglese (US, UK) e spagnolo.

Non avere modelli disponibili in tutte le regioni o anche nelle stesse regioni può diventare un problema quando costruiamo le nostre applicazioni.

Inferenza Cross-Region

Una cosa che dobbiamo menzionare è la configurazione di inferenza cross-region in Bedrock, che viene fatta tramite modelli di inferenza. Quello che questo fa è che le nostre chiamate vengono automaticamente instradate alla regione con le risorse più disponibili, assicurando che le nostre chiamate possano essere soddisfatte. Quando si utilizzano i modelli Nova fuori da us-east-1 (N. Virginia) e AWS GovCloud (US-West), dobbiamo utilizzare un profilo di inferenza quando chiamiamo l'API Bedrock. Se non lo facciamo, verremo colpiti da un errore che dice che il modello non è disponibile nella regione in modo serverless.

Come esempio, se chiamiamo il eu.amazon.nova-pro-v1:0 da eu-west-1, dove funziona la mia soluzione, la nostra chiamata di inferenza rimarrà all'interno della regione EU e l'inferenza può essere fatta da una delle regioni EU: eu-central-1, eu-north-1, eu-west-1, eu-west-3.

Architettura della Soluzione

Nel post apprendimento gamificato con quiz automatizzati, introduco l'architettura. È costruita su Amazon EventBridge, divisa in più servizi, e funziona come un Pattern Saga.

Immagine che mostra la panoramica della pipeline attuale

Come spiegato nel post sopra, eseguo due cose principali: genero il quiz per l'apprendimento gamificato e uso Polly per generare la voce che legge il mio post del blog. Questa è una combinazione di azioni GitHub che costruiranno la pagina e caricheranno in un bucket di staging in S3. Dopo che il caricamento nel bucket di staging è completo, le azioni GitHub posteranno un evento su un event-bus di EventBridge e qui è dove la mia parte basata su AWS prende il controllo.

La pipeline CI/CD basata su AWS è event-driven e serverless. I servizi primari utilizzati sono StepFunctions, Lambda, ed EventBridge. Il flusso è basato su un pattern saga dove i servizi di dominio passano il controllo postando eventi di dominio sull'event-bus, che sposterà la saga al passo successivo.

Poiché la mia generazione vocale è fatta dai file HTML renderizzati, per la massima precisione, non potevo semplicemente collegare la correzione delle bozze come primo passo in questo Pattern Saga. La soluzione è diventata aggiungere azioni GitHub nella saga. Un giorno potrei allontanarmi dalle Azioni GitHub verso qualcos'altro, ma per ora, sarà parte dell'intera soluzione.

Quindi, aggiungerò la seguente parte, che ora funziona quando la mia Pull-Request viene aperta:

Immagine che mostra la panoramica della pipeline di correzione

In questa parte, recupero informazioni da GitHub, e chiamo Amazon Nova tramite Amazon Bedrock per fare la mia correzione delle bozze. Quando completato, il servizio aggiunge un nuovo commit al PR con il file markdown aggiornato.

Eseguire le Parti Vocali e Quiz

Ora, ho bisogno di un modo per integrare e avviare i passi Vocali e Quiz, che prima stavo eseguendo quando il PR veniva creato. Invece, ora ho un'Azione GitHub che rileverà il commit di correzione e avvierà quel flusso. Dando una soluzione con due parti distinte.

Immagine che mostra la panoramica completa della pipeline di correzione

Ho ora creato due parti distinte nel flusso. Tutta la logica principale sta funzionando su AWS e l'Azione GitHub costruisce il blog di staging e invoca le diverse parti, inviando diversi eventi a EventBridge.

Approfondimento Tecnico

Facciamo un approfondimento tecnico nella soluzione e nel servizio di correzione delle bozze attuale.

StepFunction

Il cuore di tutto è un orchestratore implementato con StepFunctions. Controllerà i file, eseguirà la correzione delle bozze, e creerà il nuovo commit.

Immagine che mostra la StepFunction

Il lavoro è sostanzialmente svolto da tre funzioni Lambda. La funzione Lambda centrale è quella che esegue la correzione delle bozze effettiva. Le funzioni che controllano il PR e creano un nuovo commit utilizzano entrambe Octokit. Per vedere come funzionano, controlla i miei post precedenti. Mi concentrerò sul correttore effettivo.

Funzione Lambda di Correzione delle Bozze

La funzione inizializzerà tutto, creerà il prompt, e chiamerà Nova e Bedrock, e memorizzerà la versione corretta in S3. Il post originale viene anche mantenuto e il file viene semplicemente rinominato.

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)}),
        }

Ingegneria dei Prompt

Una parte importante che non dovrebbe essere dimenticata è l'ingegneria dei prompt. Il prompt deve essere chiaro e includere istruzioni dettagliate su come l'LLM dovrebbe agire. Ho dovuto iterare il prompt diverse volte per ottenere il risultato di cui avevo bisogno. Il mio prompt include istruzioni specifiche per:

  • Correggere errori ortografici e grammaticali
  • Mantenere la formattazione markdown originale
  • Preservare la terminologia tecnica
  • Mantenere lo stile e il tono di scrittura coerenti
  • Restituire solo il contenuto corretto senza commenti

Alla fine, il seguente prompt mi ha dato il risultato che volevo.

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:

Avviare la Parte Vocale e Quiz

La seconda parte del flusso, generare voce e quiz, funziona quando un nuovo commit con il messaggio di commit "Proofread by Amazon Nova" viene aggiunto alla pull-request. L'azione inizia quando si verifica l'evento synchronize. La prima parte controlla il commit e ottiene l'ultimo messaggio di commit. I passi dopo quello controlleranno quindi il messaggio.

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 '....'

Conclusione

Estendere il mio blog con correzione automatica delle bozze usando Amazon Nova mi ha fatto risparmiare molto tempo. Ora faccio una rapida correzione da solo, poi delego la parte grande ad Amazon Nova. L'estensione si adatta perfettamente al design event-driven che avevo già in atto.

Quindi, con Bedrock e Amazon Nova, insieme a un approccio serverless, ho creato ed esteso la mia soluzione che è:

  • Affidabile: Qualità di correzione coerente per ogni post
  • Conveniente: Modello pay-per-use con costi operativi minimi

Più importante, la correzione automatica delle bozze mi permette di concentrarmi su quello che mi piace di più, creare contenuto tecnico che aiuta altri a imparare sulle tecnologie cloud.

Andando avanti, ho diverse altre idee che miglioreranno il mio blog usando Amazon Nova e AI. Rimanete sintonizzati per più soluzioni divertenti!

Parole Finali

Non dimenticare di seguirmi su LinkedIn e per più contenuti, leggi il resto dei miei Blog.

Come dice Werner! Ora Vai a Costruire!