AI code generation via Amazon Bedrock
In het vorige artikel werd verduidelijkt wat Amazon Bedrock exact is en voor welke doeleinden dit product onder andere kan ingezet worden. Nu gaan we dieper in op één voorbeeld van de slechts vele mogelijkheden die Amazon Bedrock biedt, namelijk een code generation project.
Voor deze kleine applicatie wordt er gebruik gemaakt van een API Gateway, Lambda function in Python, Bedrock en een S3 bucket.
Lambda function
Als eerste stap gaan we een Lambda function aanmaken die getriggerd zal worden door een API call, zodra deze een nieuwe request ontvangt om code te genereren. We geven als functienaam code_generation op en we configureren deze Lambda met de Python 3.11 runtime.
Python code
Hierna voegen we onze Python code toe aan de Lambda function, deze code werd hier weggeplukt.
Claude taalmodel
In onze functie maken we gebruik van het Claude taalmodel van Anthropic. Als de we documentatie van dit model verder bekijken in Amazon Bedrock dan zien we dat hier meer informatie staat. Zo ook een voorbeeld van een API request die gebruikt kan worden in een code blok, hier gaan we gebruik van maken.
Lambda Layer
Als we deze code zo zouden uitvoeren dan zullen we echter fouten krijgen omdat de bedrock-runtime client niet herkend wordt vanuit de code. Deze bedrock-runtime komt uit de boto3 Python library, de standaard versie van deze Python library die meegescheept wordt in Lambda is ietwat verouderd en kent de nieuwe Bedrock service nog niet. Daarom zullen we dit omzeilen door een nieuwere boto3 versie in te laden via Lambda Layers.
Op onze local machine voeren we hiervoor de volgende commando’s uit:
~ ❯ mkdir boto3_layer
~ ❯ cd boto3_layer/
~ ❯ mkdir python
~ ❯ python --version
~ ❯ python3 -m venv venv
~ ❯ source venv/bin
~ ❯ source venv/bin/activate
~ ❯ pip install boto3 -t ./python
~ ❯ deactivate
~ ❯ zip -r boto3_layer.zip ./python
De zip file die we gegenereerd hebben kunnen we nu toevoegen aan onze Lambda function. Hiervoor moeten we in de Lambda configuratie klikken op Add a layer. In onderstaand voorbeeld zie je dat ik de layer met de naam boto3_bedrock al toegevoegd had.
Bij het aanmaken van de nieuwe layer kunnen de parameters in onderstaande screenshot overgenomen worden.
S3 bucket
In de code zal je zien dat we het resultaat van onze functie wegschrijven in een S3 bucket. Aangezien dit een test is kunnen we tijdelijk een nieuwe bucket aanmaken, de naam die je hiervoor kiest moet je in de Python code toevoegen bij de variabele s3_bucket.
API Gateway
Nu onze functie klaar is moeten we nog een mogelijkheid voorzien om deze op te roepen. Hiervoor maken we een route aan via de Amazon API Gateway. Tijdens de setup werd hiervoor een nieuwe stage genaamd dev aangemaakt waaronder deze route gepublished werd.
Uitvoering
Nu is het tijd om over te gaan tot het testen van deze kleine applicatie. Via bijvoorbeeld Postman kunnen we nu een call lanceren naar het API endpoint met de nodige payload die door de Lambda function verwerkt zal worden.
Onderstaande screenshot is een voorbeeld van zo’n call. Hierin geven we mee dat de gegenereerde output Python code moet zijn en dat we code willen genereren die een binary search moet implementeren.
De correcte uitvoering van deze function kunnen we verifiëren via de Cloudwatch logs.
En uiteraard vinden we de gegenereerde output, onze Python code, terug in de S3 bucket die we hiervoor aangemaakt hebben. Als je dit bestand opent dan vind je daar de volledige output terug van de code die je gegenereerd hebt.