肌寒い日が続き、ついに我が家でも毛布を引っ張り出してきました、菅野です。
AWS re:Inventが開催され、AWSでは、150件以上の新サービスやアップデートの発表がありました。
Amazon Bedrockにも新機能が発表され、実際のシステムにも導入していきたいというかたも増えているのではないでしょうか?
今回のブログではGAになったAgents for Amazon Bedrockを実際に利用し
EC2インスタンスを作成するエージェントを作ってみます。
aws.amazon.com
Agents for Amazon Bedrockとは
生成AIのアプリケーション作成を助けるシステムです。
ユーザーは、自然言語を用いてAIアプリで実施したいタスクを入力します。
Agents for Amazon Bedrockは上記のタスクを推論モデルを用いて細分化、複数ステップのタスクに自動で分割し、それぞれの実行結果をまとめ、
最終的なタスクの実行結果をユーザーに返すAIアプリケーションを生成します。
GA版となったAgentsでは、それぞれのステップの詳細にアクセスし、どのような推論の流れになっているのかを確認したりできるようになっています。
また、あらかじめ用意していたLambdaをタスクとして定義してAgentsで生成したアプリから呼び出せるようにしたり、KnowledgeBase(ユーザーが定義できる情報元)へアクセスすることも可能なようです。
実際に使ってみた
それでは、さっそくAgentsを使ってAIアプリを作成してみましょう。
今回はLambaを用いてEC2インスタンスを作成するAIエージェントを作成します。
以下のような構成になります。
Amazon Bedrockのサイドメニューから、Orchestration>Agentsをクリックします。
Agentsのページが開いたら、Create Agentをクリックします。
Agentの詳細入力
Agentの詳細入力画面が出てくるのでそれぞれ以下の情報を入力しNextをクリックします。
項目 |
必須 |
入力内容 |
Agent name |
○ |
作成するエージェントの名前 |
Agent description |
|
作成するエージェントの詳細説明 |
User input |
○ |
初回の入力から情報が足りない場合、エージェントがユーザーから追加の入力を求めるか否かの設定 |
Agent resource role |
○ |
Agentが利用するAWSのIAM Roleを自動で生成するかあらかじめ作成したIAM Roleを用いるかを選択 |
KMS key selection |
|
Agentとのやり取りの暗号化に用いるKMS Keyをカスタマイズするか(チェックが空の場合デフォルトKeyが用いられる) |
Idle session timeout |
○ |
ユーザーがAgentに入力をしない状態でどれだけセッションを維持するか |
Tags |
|
生成されるAWSリソースへのタグ |
Agentのモデル情報入力
利用モデルの選択画面が出てくるので、利用するモデルと、Agentに実施してほしいタスクの説明を入力します。
利用するモデルは現在以下が選択可能です。
モデルの開発元 |
モデル名 |
Anthropic |
Claude V1 |
Anthropic |
Claude V2 |
上記以外にもAmazonが開発している、Amazon Titan Express、Anthropicが開発しているClaude V2.1も将来的に選択できるようになる模様です。
実施してほしいタスクの説明は日本語でも入力可能なようです。
今回はClaude V2を利用し、以下を入力してみました。
あなたはEC2インスタンスを作成するエージェントです。
ユーザーの入力をもとに、EC2インスタンスのインスタンスタイプ、AMIを選択し、EC2インスタンスを作成してください。
アクショングループの追加(Optional)
作成するエージェントが独自のビジネスロジックを利用する必要がある場合(例えば、自身が開発したAPIにアクセスする)にはLambdaを経由して
独自のアクションを定義することが可能です。
それぞれ以下の情報を入力します。
項目 |
必須 |
入力内容 |
Enter Action group name |
○ |
作成するアクショングループの名前 |
Description - Optional |
|
作成するアクショングループの詳細説明 |
Select Lambda function |
○ |
利用するLambdaFunctionを選択 |
Select API Schema |
○ |
LambdaFunctionの入出力を定義したOpenAPI形式のymlファイルをS3に配置したものを参照するように設定 |
Select API Schemaに配置したOpenAPI形式のファイルから、利用するLambdaFunctionのIN,OUTをBedrockが読み取り、適切な入力情報の抽出、
アクション実行後の情報取得を行ってくれます。
今回は以下のようなLambda,openapi.yamlを作成し、設定しました。
Lambda
import boto3
import json
def lambda_handler(event, context):
ec2 = boto3.client('ec2')
api_path = event["apiPath"]
response_body = {"application/json": {"body": "api path not found"}}
status_code = 404
if api_path == '/create-ec2':
param = event['requestBody']['content']['application/json']['properties']
instance_type = next(item for item in param 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
)
response_body = {"application/json": {"body": json.dumps('Instance Created: ' + str(instances))}}
status_code = 200
action_response = {
"actionGroup": event["actionGroup"],
"apiPath": event["apiPath"],
"httpMethod": event["httpMethod"],
"httpStatusCode": status_code,
"responseBody": response_body,
}
api_response = {"messageVersion": "1.0", "response": action_response}
return api_response
S3に配置するopenapi.ymlは以下のように作成しました。
openapi.yml
openapi: 3.0.0
info:
title: Create EC2 API
version: 1.0.0
description: API for create EC2
paths:
/create-ec2:
post:
summary: API for create EC2.
description: Create EC2 that posted instance type, ami-id
operationId: send
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
instance_type:
type: string
description: Instance Type
ami_id:
type: string
description: AMI ID for Instance
required:
- instance_type
- ami_id
responses:
'200':
description: EC2 Creation Success
content:
application/json:
schema:
type: object
properties:
body:
type: string
description: Information of Created Instance.
ナレッジベースの追加(Optional)
作成するエージェントが独自定義のナレッジベースを利用する必要がある場合にはこちらで定義を追加することができます。
ナレッジベースはOrchestration>Knowledge baseから作成することができます。
プレビューとエージェントの作成
すべての情報を入力が完了したら、入力内容のプレビュー画面が出てきます。
問題ない場合はCreate Aagentを押下するとエージェントが作成されます。
Lambdaへの実行権限付与
AgentからLambdaを呼び出すための権限設定をLambda側に行う必要があります。
対象のLambdaの設定タブ>アクセス権限>リソースベースのポリシーステートメント から、アクセス権限を追加をクリックします。
AWSのサービスをクリックし、必要事項を記入して保存をクリックします。
項目 |
必須 |
入力内容 |
サービス |
○ |
Otherを選択 |
ポリシーステートメントID |
○ |
ポリシーを一意にするIDを入力 |
プリンシパル |
○ |
bedrock.amazonaws.comと入力 |
ソースARN |
○ |
作成したLambdaのARNを選択 |
アクション |
○ |
lambda:InvokeFunctionを選択 |
作成したエージェントを試してみる
エージェントが作成されると、エージェント画面へ自動で遷移します。
画面右側にテスト用のチャット欄が出てくるので早速試してみましょう。
入力
"ami-0c0d141edc4f470cc" のAMIをベースに、インスタンスタイプを”t2.micro"として、EC2インスタンスを作成してください。
出力
EC2 instance created successfully with the following details: AMI ID: ami-0c0d141edc4f470cc Instance Type: t2.micro
期待したEC2インスタンスが作成されました。
出力結果のShow Traceを押下すると、具体的にどのような推論がされているのかを閲覧することができます。
以下の部分でユーザーの入力内容からEC2作成Actionを実行することが適切であると推論されています。
また、ユーザーの入力文章からインスタンスタイプと、AMI IDを抽出し、入力として設定しています。
(前略)
"rationale": {
"text": "To answer this question, I will:\n\n1. Call the POST::CreateEC2::send function to create an EC2 instance with the provided AMI ID and instance type.\n\nI have double checked and made sure that I have been provided the POST::CreateEC2::send function.",
"traceId": "a2ea9d5f-5322-408e-9485-ca9bc299640e-0"
},
"invocationInput": {
"actionGroupInvocationInput": {
"actionGroupName": "CreateEC2",
"apiPath": "/create-ec2",
"parameters": [],
"requestBody": {
"content": {
"application/json": [
{
"name": "ami_id",
"type": "string",
"value": "ami-0c0d141edc4f470cc"
},
{
"name": "instance_type",
"type": "string",
"value": "t2.micro"
}
]
}
},
"verb": "post"
},
"invocationType": "ACTION_GROUP",
"traceId": "a2ea9d5f-5322-408e-9485-ca9bc299640e-0"
},
(後略)
まとめ
生成AIアプリの作成を手助けしてくれる新サービス、Aagent for Amazon Bedrockを実際に試してみました。
生成AIアプリを作る際に必要なユーザー入力から特定のタスクの分析、分割等を自動でやってくれる為、生成AIアプリに不慣れな人でも作成が容易な点がよかったです。
また、Lambdaを定義しオリジナルのタスクを作成できる点は拡張性が高いように見えました。
今後も生成AIの可能性を模索していきます。
Acroquest Technologyでは、キャリア採用を行っています。
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- Elasticsearch等を使ったデータ収集/分析/可視化
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
www.wantedly.com