Taste of Tech Topics

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

Agents for Amazon Bedrock の作成がより簡単になった!

こんにちは、機械学習チーム YAMALEX の駿です。
YAMALEX は Acroquest 社内で発足した、会社の未来の技術を創る、機械学習がメインテーマのデータサイエンスチームです。 (詳細はリンク先をご覧ください。)

先日Amazon Bedrock(以下、 Bedrock)の新機能が複数発表されましたが、今回は「Agents for Amazon Bedrock」(以下、エージェント)作成に追加されたアップデートを確認します。

以前、当社のブログでエージェントを扱った記事があったので、同じことをやってみて、どれくらい変わったのか確認してみます。

acro-engineer.hatenablog.com

概要

エージェントは生成AIを活用したアプリケーションの作成を助ける仕組みです。
ユーザーは、自然言語を用いてAIアプリで実施したいタスクを入力します。

エージェントは上記のタスクを推論モデルを用いて細分化、複数ステップのタスクに自動で分割し、それぞれの実行結果をまとめ、 最終的なタスクの実行結果をユーザーに返すAIアプリケーションを生成します。

今回のアップデートでエージェントを作成し設定するフローが簡易化され、今まで以上に誰でも簡単にAIアプリケーションを作れるようになりました。

aws.amazon.com

以下、以前の記事と同じアプリケーションを作成していきます。

横に並べて一緒にスクロールしながら読むと、特にLambda関数の定義が簡単になっていることがよくわかると思います。

Bedrock エージェントでEC2インスタンスを作成する

ユーザの入力に基づいてEC2インスタンスを起動するエージェントを作成します。

以下のような構成になります。


構成図

エージェントは次の順番に処理を行います。

  1. [エージェント] ユーザの入力を受け取る(①)
  2. [エージェント] 関数呼び出しが必要か判定(②)
  3. [エージェント] 関数呼び出しに使う引数を抽出(②)
  4. [エージェント] 関数呼び出し(③)
  5. [Lambda] EC2インスタンスを起動(④)
  6. [Lambda] 結果を返却(⑤)
  7. [エージェント] 返り値を元に返答を生成(⑥)
  8. [エージェント] ユーザに返答する(⑥)

us-west-2リージョンでBedrockのサイドメニューから、オーケストレーション > エージェントをクリックし、続けて「エージェントを作成」をクリックします。

エージェント

エージェントを作成

エージェント名入力

まずエージェント名と説明を求めるダイアログが出るので、入力します。

作成の一番最初で細かいところを気にせずに進められるのが良いですね。

エージェント名と説明を入力

エージェントの詳細入力

続いてエージェントの詳細を入力します。

ここでは利用するモデルやエージェント向けの指示(いわゆるシステムプロンプト)を設定できます。

「Additional settings」を開くと細かいエージェントの動きを設定できます。

詳細入力

モデル選択のプルダウンを開くと、先日Bedrockに追加されたClaude 3のモデルも利用可能になっていることが分かります。

今回は迷わず Claude 3 Haiku を選択しました。 性能が高い、早い、安いの三拍子がそろっています。


使えるモデルが増えた

アクショングループの追加

続いてアクショングループとしてLambda関数を指定します。

ここではEC2インスタンスを起動するLambdaを作成し、実行に必要な引数の情報などをエージェントに入力します。

Action group typeは「Define with function details」を選択します。

「Define with API schemas」を選択すると今までと同じくOpenAPIのYAML定義をS3に置いて読み込む従来の指定方法になります。

アクショングループの追加

Define with function details

functionの設定

Action group invocation はお勧めされている「Quick create a new Lambda function」を選択しました。

上記のParameters部などが今までOpenAPI形式でYAMLを記述してS3に保存しないといけなかったところです。
画面をポチポチするだけで設定が完了しました。

すぐに使い始めたい、複雑なことをする予定はないので簡単に始めたいユースケースにマッチします。

(ナレッジベースは今回使わないためスキップします。)

Lambda 作成

Lambdaのコンソールにアクセスします。

アクショングループを作成する際に新しいLambda関数を作る設定にしたため、自動でひな型が作られています。

アクセス権限が設定済みなので、ポリシーステートメントなど難しいことに煩わされることはありません。

Lambdaのひな型が自動で作成されます

アクセス権限も設定済み

ひな型に合わせて、EC2インスタンスを作成するコードを少し修正しています。

import json

import boto3

ec2 = boto3.client("ec2")


def lambda_handler(event, context):
    agent = event["agent"]
    actionGroup = event["actionGroup"]
    function = event["function"]
    parameters = event.get("parameters", [])

    # Execute your business logic here. For more information,
    # refer to: https://docs.aws.amazon.com/bedrock/latest/userguide/agents-lambda.html

    instance_type = next(item for item in parameters if item["name"] == "instance_type")["value"]
    ami_id = next(item for item in param if item["name"]  == "ami_id")["value"]
    
    instances = ec2.run_instances(
        ImageId=ami_id,
        InstanceType=instance_type,
        MinCount=1,
        MaxCount=1,
    )
    
    responseBody =  {
        "TEXT": {
            "body": f"Instance Created: {str(instances)}"
        }
    }

    action_response = {
        "actionGroup": actionGroup,
        "function": function,
        "functionResponse": {
            "responseBody": responseBody
        },
    }

    function_response = {"response": action_response, "messageVersion": event["messageVersion"]}
    print(f"Response: {function_response}")

    return function_response

※ ec2:RunInstances の権限をLambdaの実行ロールに付与する必要はあります。

以上でエージェントの作成が完了です。

作成したエージェントを試してみる

早速作成したエージェントにamazonlinux:2023ベースのインスタンスを作ってもらいましょう。

入力

"ami-0c0d141edc4f470cc" のAMIをベースに、インスタンスタイプを”t2.micro"として、EC2インスタンスを作成してください。

出力

EC2 instance created successfully with the following details:
- AMI ID: ami-0663b059c6536cac8
- Instance Type: t2.micro
- Instance ID: i-xxxx
- Private IP Address: xxx.xxx.xxx.xxx

作成できました

指示通りのAMIとインスタンスタイプで作成してくれました。

EC2のコンソールを確認すると、実際にLambda関数が実行されインスタンスが起動していることが確認できます。

実際に作られたインスタンス

「トレースを表示」を押下してステップの中身を確認することで、下記のようにAMI IDとinstance typeを適切に抽出できていることを確認できます。

(前略)
  "rationale": {
    "text": "To create the EC2 instance based on the user's request, I will need to invoke the CreateEC2::create-ec2 function with the provided AMI ID and instance type.",
    "traceId": "abdfe555-eca2-4670-8ca4-77a7344ff365-0"
  },
  "invocationInput": {
    "actionGroupInvocationInput": {
      "actionGroupName": "CreateEC2",
      "function": "create-ec2",
      "parameters": [
        {
          "name": "ami_id",
          "type": "string",
          "value": "ami-0663b059c6536cac8"
        },
        {
          "name": "instance_type",
          "type": "string",
          "value": "t2.micro"
        }
      ]
    },
    "invocationType": "ACTION_GROUP",
    "traceId": "abdfe555-eca2-4670-8ca4-77a7344ff365-0"
  },
(後略)

まとめ

エージェントの作成がどのように変わったのかを、以前作成したエージェントと同等のものを作成することで確認してきました。

関数定義の指定とLambdaの権限設定が簡単になっている部分が個人的には推しポイントです。

自分でシステムを作ることなく高度なAIアプリケーションを構築できる、エージェントの利点がさらに補強され、より気軽に利用できますね。

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