Étendre Mon Blog avec la Relecture par Amazon Nova

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

Ce fichier a été traduit automatiquement par IA, des erreurs peuvent survenir

Le blogging est vraiment devenu au fil des années quelque chose que j'aime faire. Souvent, je construis quelque chose puis j'écris un post sur la solution et ce que j'ai appris. Plus d'une fois, cela a porté sur l'architecture serverless et event-driven. Cependant, il y a une chose que je n'aime pas : en tant que locuteur non natif anglais, j'ai tendance à faire des erreurs d'orthographe et de grammaire, et même si je relis plusieurs fois, je rate toujours quelque chose.

J'ai précédemment étendu mon blog avec la génération vocale utilisant Amazon Polly et l'apprentissage gamifié avec des quiz automatisés.

Cette fois, il est temps d'une autre addition à cela, qui m'aidera aussi et me fera gagner du temps. C'est un service de relecture automatisée utilisant Amazon Nova.

Mon Problème

Quand j'écris mes posts de blog, je me concentre sur la solution et l'architecture, les présentant et les mettant en valeur de bonne manière. J'ai beaucoup moins de focus sur l'orthographe, même si j'ai une extension de vérification orthographique installée dans VSCode. Ensuite, relire mes posts prend beaucoup de temps, et pour être honnête, je ne suis pas toujours si minutieux. Donc, ce dont j'avais besoin était une solution automatisée qui pourrait :

Maintenir mon style d'écriture : Je ne veux pas que la relecture change ma voix ou mes explications techniques. Préserver le formatage markdown : Mes posts de blog sont écrits en markdown avec des blocs de code, des liens et des images. S'intégrer de manière transparente : La solution devrait s'adapter à ma solution existante avec génération vocale et quiz. Être rentable : Ne fonctionner que sur certaines Pull-requests, et être serverless et event-driven comme la solution vocale et quiz.

Présentation d'Amazon Nova

Amazon Nova sont les LLM propriétaires d'Amazon qui ont été annoncés au re:Invent 2024. Avant Nova, il y avait plusieurs modèles Titan, et pour être honnête, Titan n'était pas si bon. Nova, d'autre part, est vraiment bon et est une option bonne et rentable. Les modèles Nova sont disponibles via Amazon Bedrock, comme beaucoup d'autres modèles, qui fournit une API pour accéder à divers grands modèles de langage.

Qu'est-ce qu'Amazon Bedrock ?

Amazon Bedrock est un service entièrement géré qui facilite l'accès à de nombreux modèles fondamentaux. Ils sont tous disponibles via une seule API et cela me permet de construire de grandes solutions d'IA générative facilement. Bedrock nous offre :

Choix de modèles : Accès aux modèles d'Amazon, Anthropic, Meta et plusieurs autres, avec de nouveaux modèles constamment ajoutés. Intégration facile : Serverless et géré, avec des appels API simples sans gérer l'infrastructure. Capacités de fine-tuning : Personnaliser les modèles avec vos propres données. Sécurité et confidentialité des données : Nos données ne sont pas utilisées pour entraîner aucun modèle. Agents Bedrock : Agents qui peuvent être utilisés pour construire des applications qui combinent LLM et API pour créer des solutions puissantes.

Modèles Amazon Nova

Amazon Nova offre, en ce moment, quatre modèles différents de compréhension/raisonnement, 2 modèles créatifs et 1 modèle vocal.

Les modèles de compréhension peuvent gérer différentes entrées comme texte, images, vidéo, documents et code. Ils sortent tous la réponse en texte. Ces modèles sont :

  • Nova Micro : Texte uniquement, faible latence et réponses rapides avec un coût faible.
  • Nova Lite : Modèle multimodal à faible coût qui est super rapide pour traiter texte, images et vidéo.
  • Nova Pro : Modèle multimodal très capable, pour un bon prix, qui offre un excellent équilibre de précision, vitesse et coût pour une large gamme de tâches.
  • Nova Premier : Le modèle multimodal le plus capable pour les tâches complexes, pas disponible dans beaucoup de régions.

J'ai sélectionné Nova Pro pour ma tâche car, pour la relecture de posts de blog, il fournit un excellent équilibre de précision et de rentabilité. Il gère la compréhension du contexte, maintient le style d'écriture et fait de petites corrections sans sur-éditer mon contenu.

Les modèles créatifs sont :

  • Amazon Nova Canvas : Un modèle de génération d'images de haute qualité.
  • Amazon Nova Reel : Un modèle de génération vidéo.

Amazon Nova Canvas et Amazon Nova Reel ne sont, en ce moment, pas disponibles dans beaucoup de régions. Vous devez utiliser us-east-1 (N. Virginie), eu-west-1 (Irlande), ou ap-northeast-1 (Tokyo).

Le modèle vocal est :

  • Amazon Nova Sonic : Qui livre des conversations vocales en temps réel, similaires à celles des humains.

Amazon Nova Sonic est, en ce moment, disponible dans us-east-1 (N. Virginie), eu-north-1 (Stockholm), et ap-northeast-1 (Tokyo) et supporte l'anglais (US, UK) et l'espagnol.

Ne pas avoir de modèles disponibles dans toutes les régions ou même les mêmes régions peut devenir un problème lors de la construction de nos applications.

Inférence Inter-Régionale

Une chose que nous devons mentionner est la configuration d'inférence inter-régionale dans Bedrock, qui se fait via des modèles d'inférence. Ce que cela fait, c'est que nos appels sont automatiquement routés vers la région avec le plus de ressources disponibles, assurant que nos appels puissent être satisfaits. Lors de l'utilisation des modèles Nova en dehors de us-east-1 (N. Virginie) et AWS GovCloud (US-West), nous devons utiliser un profil d'inférence lors de l'appel de l'API Bedrock. Si nous ne le faisons pas, nous serons frappés par une erreur disant que le modèle n'est pas disponible dans la région de manière serverless.

Par exemple, si nous appelons le eu.amazon.nova-pro-v1:0 depuis eu-west-1, où ma solution fonctionne, notre appel d'inférence restera dans la région EU et l'inférence peut être faite depuis une des régions EU : eu-central-1, eu-north-1, eu-west-1, eu-west-3.

Architecture de la Solution

Dans le post apprentissage gamifié avec des quiz automatisés, j'introduis l'architecture. Elle est construite sur Amazon EventBridge, divisée en plusieurs services, et fonctionne comme un Pattern Saga.

Image montrant l'aperçu du pipeline actuel

Comme expliqué dans le post ci-dessus, j'effectue deux choses principales : je génère le quiz pour l'apprentissage gamifié et j'utilise Polly pour générer la voix qui lit mon post de blog. C'est un mélange d'actions GitHub qui construiront la page et téléchargeront vers un bucket de staging dans S3. Après que le téléchargement vers le bucket de staging soit terminé, les actions GitHub posteront un événement sur un event-bus EventBridge et c'est là que ma partie basée sur AWS prend le relais.

Le pipeline CI/CD basé sur AWS est event-driven et serverless. Les services primaires utilisés sont StepFunctions, Lambda, et EventBridge. Le flux est basé sur un pattern saga où les services de domaine passent le relais en postant des événements de domaine sur l'event-bus, qui déplacera la saga vers l'étape suivante.

Comme ma génération vocale est faite à partir des fichiers HTML rendus, pour une précision maximale, je ne pouvais pas simplement brancher la relecture comme une première étape dans ce Pattern Saga. La solution est devenue d'ajouter des actions GitHub dans la saga. Un jour, je pourrais m'éloigner des Actions GitHub vers autre chose, mais pour l'instant, cela fera partie de toute la solution.

Donc, j'ajouterai la partie suivante, qui fonctionne maintenant quand ma Pull-Request est ouverte :

Image montrant l'aperçu du pipeline de relecture

Dans cette partie, je récupère des informations de GitHub, et j'appelle Amazon Nova via Amazon Bedrock pour faire ma relecture. Quand c'est terminé, le service ajoute un nouveau commit au PR avec le fichier markdown mis à jour.

Exécuter les Parties Vocale et Quiz

Maintenant, j'ai besoin d'un moyen d'intégrer et de démarrer les étapes Vocale et Quiz, que j'exécutais avant quand le PR était créé. Au lieu de cela, j'ai maintenant une Action GitHub qui détectera le commit de relecture et démarrera ce flux. Donnant une solution avec deux parties distinctes.

Image montrant l'aperçu complet du pipeline de relecture

J'ai maintenant créé deux parties distinctes dans le flux. Toute la logique principale fonctionne sur AWS et l'Action GitHub construit le blog de staging et invoque les différentes parties, en envoyant différents événements à EventBridge.

Plongée Technique Profonde

Faisons une plongée technique profonde dans la solution et le service de relecture actuel.

StepFunction

Le cœur de tout est un orchestrateur implémenté avec StepFunctions. Il vérifiera les fichiers, effectuera la relecture, et créera le nouveau commit.

Image montrant la StepFunction

Le travail est essentiellement effectué par trois fonctions Lambda. La fonction Lambda centrale est celle qui effectue la relecture réelle. Les fonctions qui vérifient le PR et créent un nouveau commit utilisent toutes deux Octokit. Pour voir comment celles-ci fonctionnent, consultez mes posts précédents. Je me concentrerai sur le correcteur réel.

Fonction Lambda de Relecture

La fonction initialisera tout, créera le prompt, et appellera Nova et Bedrock, et stockera la version relue dans S3. Le post original est aussi conservé et le fichier est juste renommé.

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

Ingénierie de Prompt

Une partie importante qui ne devrait pas être oubliée est l'ingénierie de prompt. Le prompt doit être clair et inclure des instructions détaillées sur comment le LLM devrait agir. J'ai dû itérer le prompt plusieurs fois pour obtenir le résultat dont j'avais besoin. Mon prompt inclut des instructions spécifiques pour :

  • Corriger les erreurs d'orthographe et de grammaire
  • Maintenir le formatage markdown original
  • Préserver la terminologie technique
  • Garder le style et le ton d'écriture cohérents
  • Retourner seulement le contenu corrigé sans commentaire

À la fin, le prompt suivant m'a donné le résultat que je voulais.

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:

Démarrer la Partie Vocale et Quiz

La deuxième partie du flux, générer la voix et le quiz, fonctionne quand un nouveau commit avec le message de commit "Proofread by Amazon Nova" est ajouté à la pull-request. L'action démarre quand l'événement synchronize se produit. La première partie vérifie le commit et obtient le dernier message de commit. Les étapes après cela vérifieront alors le message.

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

Conclusion

Étendre mon blog avec une relecture automatisée utilisant Amazon Nova m'a fait économiser beaucoup de temps. Je fais maintenant une relecture rapide moi-même, puis je délègue la grande partie à Amazon Nova. L'extension s'adapte parfaitement au design event-driven que j'avais déjà en place.

Donc, avec Bedrock et Amazon Nova, avec une approche serverless, j'ai créé et étendu ma solution qui est :

  • Fiable : Qualité de relecture cohérente pour chaque post
  • Rentable : Modèle de paiement à l'utilisation avec des coûts opérationnels minimaux

Plus important encore, la relecture automatisée me permet de me concentrer sur ce que j'aime le plus, créer du contenu technique qui aide les autres à apprendre sur les technologies cloud.

En avançant, j'ai plusieurs autres idées qui amélioreront mon blog en utilisant Amazon Nova et l'IA. Restez à l'écoute pour plus de solutions amusantes !

Mots Finaux

N'oubliez pas de me suivre sur LinkedIn et pour plus de contenu, lisez le reste de mes Blogs.

Comme dit Werner ! Maintenant Va Construire !