Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Amazon Bedrock(ClaudeV2)でLambdaのコードを生成してみた

こんにちは、最近久々にソロキャンプをしてきました菅野です。

AWS上で、 ChatGPTのようなテキスト生成AIを利用できるようになるサービス、Amazon Bedrockがリリースされました。
今回はBedrockで、LambdaのPythonコードを生成してもらいます。

利用するモデルは、ChatGPTと同レベルの性能を有しているClaudeV2を利用します。詳細はこちら

Bedrockについて執筆した別記事もあわせてご覧ください。

acro-engineer.hatenablog.com

acro-engineer.hatenablog.com

S3に保存したCSVファイルの平均を求めるLambda関数を作成する

以下のようなcsvをS3からダウンロードし、一分毎、name毎の平均を返却するLambdaを作成してもらいます。

id,name,value,timestamp
1,data_1,5.79,2023-10-25T00:00:00
2,data_3,84.84,2023-10-25T00:00:10
3,data_2,23.88,2023-10-25T00:00:20
4,data_4,56.92,2023-10-25T00:00:30
5,data_4,19.51,2023-10-25T00:00:40
6,data_1,41.2,2023-10-25T00:00:50
7,data_2,26.52,2023-10-25T00:01:00
8,data_1,77.41,2023-10-25T00:01:10
9,data_1,19.05,2023-10-25T00:01:20
10,data_1,5.24,2023-10-25T00:01:30
11,data_1,94.87,2023-10-25T00:01:40
12,data_3,17.43,2023-10-25T00:01:50
13,data_3,22.94,2023-10-25T00:02:00
14,data_4,44.15,2023-10-25T00:02:10
15,data_4,95.46,2023-10-25T00:02:20
16,data_4,16.64,2023-10-25T00:02:30

Lambdaの構成はこのようになります。

それでは早速生成してもらいましょう。 (中略)

import csv
import boto3
from datetime import datetime, timedelta

s3 = boto3.client('s3') 

def lambda_handler(event, context):

  bucket = event['bucket']
  key = event['key']

  obj = s3.get_object(Bucket=bucket, Key=key)
  lines = obj['Body'].read().decode('utf-8').splitlines()  

  reader = csv.reader(lines)
  header = next(reader)

  data = {}
  
  for row in reader:
    name = row[1]
    value = row[2] 
    timestamp = datetime.fromisoformat(row[3])

    if value == 'null':
      continue
    
    value = float(value)

    # 一分ごとの範囲を計算
    start = timestamp.replace(second=0, microsecond=0)
    end = start + timedelta(minutes=1)

    if name not in data:
      data[name] = {}

    # その一分の範囲にある場合はデータを追加 
    if start <= timestamp < end:
      if start not in data[name]:
        data[name][start.strftime('%Y-%m-%dT%H:%M:%S')] = []
      data[name][start.strftime('%Y-%m-%dT%H:%M:%S')].append(value)

  averages = {}
  
  for name, minutes in data.items():
    averages[name] = {}
    for start, values in minutes.items():
      averages[name][start] = sum(values) / len(values)
  
  print(averages)
  
  return averages

lambdaのeventからバケット名とキー名を取得、読み取った内容を計算してくれるLambdaを生成してくれました。
valueがnullの場合早期リターンをするようにして、インデントが深くならないように工夫してくれているのがうれしいポイントですね。
返り値について、日付型をDictのKeyにしているとLambdaの返り値としてシリアライズする際にエラーになる為あらかじめStr型で保存するように手動で修正しています。

Lambdaの実行結果は以下のようになりました。

{
  "data_1": {
    "2023-10-25T00:00:00": 41.2,
    "2023-10-25T00:01:00": 94.87,
    "2023-10-25T00:02:00": 85.45,
    "2023-10-25T00:04:00": 0,
    "2023-10-25T00:05:00": 40.11,
    "2023-10-25T00:06:00": 0,
    "2023-10-25T00:07:00": 49.54,
    "2023-10-25T00:08:00": 95.98,
    "2023-10-25T00:09:00": 81.28,
    "2023-10-25T00:10:00": 19.23,
    "2023-10-25T00:11:00": 2.17,
    "2023-10-25T00:12:00": 63.83,
    "2023-10-25T00:13:00": 22.27,
    "2023-10-25T00:14:00": 28.9,
    "2023-10-25T00:15:00": 37.66,
    "2023-10-25T00:16:00": 93.55,
    "2023-10-25T00:17:00": 84.35,
(以下略)

無事期待通り、user毎、一分毎のValueの平均を求めてくれました。

まとめ

BedrockにてLambda関数を出力してもらいました。
今回の内容では、データの構成だけ修正が必要にはなりましたが、AWSの構成等も理解した上で、ほぼ動作するコードを1回で出力してくれたので、実用に足る結果になっていると感じました。
今後も生成AIで何ができるのか探っていこうと思います。
それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com