Meinen Blog mit Korrekturlesen durch Amazon Nova erweitern

Diese Datei wurde automatisch von KI übersetzt, es können Fehler auftreten
Bloggen ist über die Jahre wirklich zu etwas geworden, was ich gerne mache. Oft baue ich etwas und schreibe dann einen Post über die Lösung und was ich gelernt habe. Mehr als einmal ging es um serverlose und event-driven Architektur. Es gibt jedoch eine Sache, die ich nicht mag: Als Nicht-Muttersprachler neige ich dazu, sowohl Rechtschreib- als auch Grammatikfehler zu machen, und obwohl ich mehrmals Korrektur lese, übersehe ich immer etwas.
Ich habe meinen Blog bereits erweitert mit Sprachgenerierung mit Amazon Polly und gamifiziertem Lernen mit automatisierten Quizzes.
Diesmal ist es Zeit für eine weitere Ergänzung, die mir auch helfen und Zeit sparen wird. Das ist ein automatisierter Korrekturlesedienst mit Amazon Nova.
Mein Problem
Wenn ich meine Blog-Posts schreibe, konzentriere ich mich auf die Lösung und die Architektur, präsentiere und zeige sie auf eine gute Weise. Ich habe viel weniger Fokus auf Rechtschreibung, obwohl ich eine Rechtschreibprüfungserweiterung in VSCode installiert habe. Dann dauert das Korrekturlesen meiner Posts sehr lange, und um ehrlich zu sein, bin ich nicht immer so gründlich. Also brauchte ich eine automatisierte Lösung, die:
Meinen Schreibstil beibehalten: Ich möchte nicht, dass das Korrekturlesen meine Stimme oder technischen Erklärungen verändert. Markdown-Formatierung bewahren: Meine Blog-Posts sind in Markdown mit Code-Blöcken, Links und Bildern geschrieben. Nahtlos integrieren: Die Lösung sollte in meine bestehende Lösung mit Sprach- und Quiz-Generierung passen. Kosteneffektiv sein: Nur bei bestimmten Pull-Requests laufen und serverlos und event-driven sein, genau wie die Sprach- und Quiz-Lösung.
Vorstellung von Amazon Nova
Amazon Nova sind Amazons eigene LLMs, die auf der re:Invent 2024 angekündigt wurden. Vor Nova gab es mehrere Titan-Modelle, und um ehrlich zu sein, Titan war nicht so gut. Nova hingegen ist wirklich gut und ist eine gute, kosteneffiziente Option. Nova-Modelle sind über Amazon Bedrock verfügbar, wie viele andere Modelle, das eine API für den Zugriff auf verschiedene große Sprachmodelle bereitstellt.
Was ist Amazon Bedrock?
Amazon Bedrock ist ein vollständig verwalteter Service, der den Zugang zu vielen Foundation-Modellen einfach macht. Sie sind alle über eine einzige API verfügbar und ermöglichen es mir, großartige generative KI-Lösungen auf einfache Weise zu erstellen. Bedrock bietet uns:
Modellauswahl: Zugang zu Modellen von Amazon, Anthropic, Meta und mehreren anderen, mit neuen Modellen, die ständig hinzugefügt werden. Einfache Integration: Serverlos und verwaltet, mit einfachen API-Aufrufen ohne Infrastrukturverwaltung. Fine-Tuning-Fähigkeiten: Modelle mit eigenen Daten anpassen. Sicherheit und Datenschutz: Unsere Daten werden nicht zum Trainieren von Modellen verwendet. Bedrock-Agenten: Agenten, die verwendet werden können, um Anwendungen zu erstellen, die LLMs und APIs kombinieren, um mächtige Lösungen zu schaffen.
Amazon Nova Modelle
Amazon Nova bietet zu diesem Zeitpunkt vier verschiedene Verstehens-/Reasoning-Modelle, 2 kreative Modelle und 1 Sprachmodell.
Die Verstehensmodelle können verschiedene Eingaben wie Text, Bilder, Video, Dokumente und Code verarbeiten. Alle geben die Antwort in Text aus. Diese Modelle sind:
- Nova Micro: Nur Text, niedrige Latenz und schnelle Antworten mit geringen Kosten.
- Nova Lite: Kostengünstiges multimodales Modell, das super schnell bei der Verarbeitung von Text, Bildern und Videos ist.
- Nova Pro: Sehr fähiges multimodales Modell zu einem guten Preis, das eine großartige Balance aus Genauigkeit, Geschwindigkeit und Kosten für eine breite Palette von Aufgaben bietet.
- Nova Premier: Das fähigste multimodale Modell für komplexe Aufgaben, nicht in vielen Regionen verfügbar.
Ich habe Nova Pro für meine Aufgabe ausgewählt, da es für das Korrekturlesen von Blog-Posts eine großartige Balance aus Genauigkeit und Kosteneffizienz bietet. Es versteht Kontext, behält den Schreibstil bei und macht kleine Korrekturen, ohne meinen Inhalt zu überarbeiten.
Die kreativen Modelle sind:
- Amazon Nova Canvas: Ein hochwertiges Bildgenerierungsmodell.
- Amazon Nova Reel: Ein Videogenerierungsmodell.
Amazon Nova Canvas und Amazon Nova Reel sind derzeit nicht in vielen Regionen verfügbar. Sie müssen us-east-1 (N. Virginia), eu-west-1 (Irland) oder ap-northeast-1 (Tokyo) verwenden.
Das Sprachmodell ist:
- Amazon Nova Sonic: Das Echtzeit-menschenähnliche Sprachgespräche liefert.
Amazon Nova Sonic ist derzeit in us-east-1 (N. Virginia), eu-north-1 (Stockholm) und ap-northeast-1 (Tokyo) verfügbar und unterstützt Englisch (US, UK) und Spanisch.
Wenn Modelle nicht in allen Regionen oder sogar in den gleichen Regionen verfügbar sind, kann das beim Erstellen unserer Anwendungen zu einem Problem werden.
Cross-Region-Inferenz
Eine Sache, die wir erwähnen müssen, ist die Cross-Region-Inferenz-Einrichtung in Bedrock, die über Inferenz-Modelle erfolgt. Was dies bewirkt, ist, dass unsere Aufrufe automatisch zu der Region mit den meisten verfügbaren Ressourcen geleitet werden, wodurch sichergestellt wird, dass unsere Aufrufe erfüllt werden können. Wenn wir die Nova-Modelle außerhalb von us-east-1 (N. Virginia) und AWS GovCloud (US-West) verwenden, müssen wir ein Inferenz-Profil verwenden, wenn wir die Bedrock-API aufrufen. Wenn wir das nicht tun, erhalten wir einen Fehler, der besagt, dass das Modell in der Region nicht serverlos verfügbar ist.
Als Beispiel: Wenn wir eu.amazon.nova-pro-v1:0
von eu-west-1 aus aufrufen, wo meine Lösung läuft, bleibt unser Inferenz-Aufruf innerhalb der EU-Region und die Inferenz kann von einer der EU-Regionen aus durchgeführt werden: eu-central-1, eu-north-1, eu-west-1, eu-west-3.
Lösungsarchitektur
In dem Post gamifiziertes Lernen mit automatisierten Quizzes stelle ich die Architektur vor. Sie ist auf Amazon EventBridge aufgebaut, in mehrere Services aufgeteilt und läuft als Saga-Pattern.
Wie im obigen Post erklärt, führe ich zwei Hauptsachen durch: Ich generiere das Quiz für das gamifizierte Lernen und verwende Polly, um Sprache zu generieren, die meinen Blog-Post vorliest. Dies ist eine Mischung aus GitHub-Actions, die die Seite erstellen und in einen Staging-Bucket in S3 hochladen. Nach dem Upload in den Staging-Bucket senden GitHub-Actions ein Event an einen EventBridge-Event-Bus, und hier übernimmt mein AWS-basierter Teil.
Die AWS-basierte CI/CD-Pipeline ist event-driven und serverlos. Die primären verwendeten Services sind StepFunctions, Lambda und EventBridge. Der Flow basiert auf einem Saga-Pattern, bei dem die Domain-Services übergeben, indem sie Domain-Events auf den Event-Bus posten, was die Saga zum nächsten Schritt bewegt.
Da meine Sprachgenerierung aus den gerenderten HTML-Dateien für höchste Genauigkeit erfolgt, konnte ich das Korrekturlesen nicht einfach als ersten Schritt in diesem Saga-Pattern einbauen. Die Lösung war, GitHub-Actions in die Saga hinzuzufügen. Eines Tages könnte ich von GitHub-Actions zu etwas anderem wechseln, aber vorerst wird es Teil der gesamten Lösung sein.
Also werde ich den folgenden Teil hinzufügen, der jetzt läuft, wenn mein Pull-Request geöffnet wird:
In diesem Teil hole ich Informationen von GitHub und rufe Amazon Nova über Amazon Bedrock auf, um mein Korrekturlesen durchzuführen. Wenn abgeschlossen, fügt der Service einen neuen Commit zum PR mit der aktualisierten Markdown-Datei hinzu.
Ausführen der Sprach- und Quiz-Teile
Jetzt brauche ich einen Weg, um die Sprach- und Quiz-Schritte zu integrieren und zu starten, die ich zuvor ausgeführt habe, als der PR erstellt wurde. Stattdessen habe ich jetzt eine GitHub-Action, die den Korrektur-Commit erkennt und diesen Flow startet. Dies ergibt eine Lösung mit zwei unterschiedlichen Teilen.
Ich habe jetzt zwei unterschiedliche Teile im Flow erstellt. Alle Hauptlogik läuft auf AWS und GitHub-Action erstellt den Staging-Blog und ruft die verschiedenen Teile auf, indem verschiedene Events an EventBridge gesendet werden.
Technischer Deep Dive
Lassen Sie uns einen technischen Deep Dive in die Lösung und den tatsächlichen Korrekturlesedienst machen.
StepFunction
Das Herzstück von allem ist ein Orchestrator, der mit StepFunctions implementiert ist. Er wird die Dateien auschecken, das Korrekturlesen durchführen und den neuen Commit erstellen.
Die Arbeit wird grundsätzlich von drei Lambda-Funktionen ausgeführt. Die zentrale Lambda-Funktion ist diejenige, die das tatsächliche Korrekturlesen durchführt. Die Funktionen, die den PR auschecken und einen neuen Commit erstellen, verwenden beide Octokit. Um zu sehen, wie diese funktionieren, schauen Sie sich meine vorherigen Posts an. Ich werde mich auf den tatsächlichen Korrektor konzentrieren.
Korrekturlese-Lambda-Funktion
Die Funktion wird alles initialisieren, den Prompt erstellen und Nova und Bedrock aufrufen und die korrigierte Version in S3 speichern. Der ursprüngliche Post wird auch behalten und die Datei wird nur umbenannt.
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)}),
}
Prompt Engineering
Ein wichtiger Teil, der nicht vergessen werden sollte, ist Prompt Engineering. Der Prompt muss klar sein und detaillierte Anweisungen enthalten, wie das LLM handeln soll. Ich musste den Prompt mehrmals iterieren, um das Ergebnis zu bekommen, das ich brauchte. Mein Prompt enthält spezifische Anweisungen für:
- Rechtschreib- und Grammatikfehler korrigieren
- Die ursprüngliche Markdown-Formatierung beibehalten
- Technische Terminologie bewahren
- Den Schreibstil und Ton konsistent halten
- Nur den korrigierten Inhalt ohne Kommentare zurückgeben
Am Ende gab mir der folgende Prompt das Ergebnis, das ich wollte.
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:
Starten der Sprach- und Quiz-Teile
Der zweite Teil des Flows, Sprach- und Quiz-Generierung, läuft, wenn ein neuer Commit mit der Commit-Nachricht "Proofread by Amazon Nova" zum Pull-Request hinzugefügt wird. Die Action startet, wenn das synchronize
-Event auftritt. Der erste Teil überprüft den Commit und holt die neueste Commit-Nachricht. Die Schritte danach werden dann die Nachricht überprüfen.
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 '....'
Fazit
Die Erweiterung meines Blogs mit automatisiertem Korrekturlesen mit Amazon Nova hat mir viel Zeit gespart. Ich mache jetzt eine schnelle Korrektur selbst und delegiere dann den großen Teil an Amazon Nova. Die Erweiterung passt perfekt in das event-driven Design, das ich bereits hatte.
Also, mit Bedrock und Amazon Nova, zusammen mit einem serverlosen Ansatz, habe ich meine Lösung erstellt und erweitert, die:
- Zuverlässig ist: Konsistente Korrekturqualität für jeden Post
- Kosteneffektiv ist: Pay-per-Use-Modell mit minimalen Betriebskosten
Am wichtigsten ist, dass automatisiertes Korrekturlesen mir erlaubt, mich auf das zu konzentrieren, was ich am meisten mag: technische Inhalte zu erstellen, die anderen beim Lernen über Cloud-Technologien helfen.
In Zukunft habe ich mehrere andere Ideen, die meinen Blog mit Amazon Nova und KI verbessern werden. Bleiben Sie dran für weitere unterhaltsame Lösungen!
Abschließende Worte
Vergessen Sie nicht, mir auf LinkedIn zu folgen und für mehr Inhalte lesen Sie den Rest meiner Blogs.
Wie Werner sagt! Jetzt geh bauen!