はじめに
今年のAWSサミットでもAI系のセッションが非常に多かった印象がありますが、その中でもよく話題に上がるBedrockをとりあえず試してみたいって人に向けての記事になります。
※今回はBedrockの詳細なサービス説明や、生成AIの知識系は話しません(というか、私自身理解できていない)のでご了承ください
今回出てくるもの
- AWS Bedrock:大手AI企業の高性能な基盤モデル(FM)を利用できるフルマネージドサービス
- Claude:Anthropic社が開発した生成AIモデル
- Laravel:PHPのFW
やってみる
では、さっそくですが試してみます!
Claudeを有効化
生成AIモデルは有効化しないと利用できないため、AWSコンソールから有効化していきます
ベースモデル一覧でClaudeを見ると、リクエストをする必要がある旨のメッセージが表示されるので、モデルアクセス
をクリックします
リクエストに必要な情報を入力します。
会社名やウェブサイトのURL、利用用途などを入力して、Next
をクリックします
確認画面が出るので問題なければ、Submit
をクリックするとリクエストが実行されます
数分待つと、アクセスが付与されました
と表示されるはずです。
これで、利用準備は完了です
ローカルからアクセスするためのIAMユーザを作成する
今回はローカル環境からアクセスするので、アクセスキーを発行して利用します
次に権限をアタッチするのですが、今回はインラインポリシーにするのでここでは何もせず、次へ
をクリックします。
ユーザ作成時にインラインポリシー作れなくて不便...
確認画面が出るので、ユーザの作成
をクリックすればIAMユーザの作成が完了です。
次に、インラインポリシーを作成してBedrockへの権限を付与していきます。
許可を追加
からインラインポリシーを作成
をクリックします。
以下のjsonを記載します。
※claudeのver2.1モデルを実行する権限を付与しています
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-v2:1"
}
]
}
アクセスキーに関しては永続的な認証情報なので、特に権限の追加に注意が必要です。
特別な事情がない限り、AWSの最小権限の原則
に則って必要な権限だけ付与しましょう!
任意のポリシー名
を入力して、ポリシーの作成
をクリックしてインラインポリシーの作成は完了です
アクセスキーを発行します
IAMユーザを作成したので、アクセスキーを発行します。
アクセスキーを作成
をクリックします
ユースケースとしてローカルコード
を選択して、次へ
をクリックします
表示にもあるようにローカルからのアクセスには、Identity Centerによる認証が推奨されています。
Identity Centerによる認証をする場合は、こちらのやり方で出来るようです
アクセスキーを作成
をクリックすると、アクセスキーが払い出されます
払い出されたアクセスキーをメモ or CSVファイルをダウンロードして、完了
をクリックします。
この画面でしかシークレットアクセスキーを確認できないので、取得を忘れないようにしましょう
LaravelでBedrockにリクエストしてみる
さぁ、最後にローカルから実行してみましょう。
aws/aws-sdk-php
をcomposer installした状態で以下のコードを実行します。
※Laravelの環境構築については割愛します
use Aws\BedrockRuntime\BedrockRuntimeClient;
// NOTE:https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/php_3_bedrock-runtime_code_examples.html
// NOTE:https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-parameters-anthropic-claude-text-completion.html
try {
$bedrockRuntimeClient = new BedrockRuntimeClient([
'version' => '2023-09-30',
'region' => 'ap-northeast-1',
'credentials' => [
'key' => 'xxx', // 取得したアクセスキー
'secret' => 'xxx', // 取得したシークレットアクセスキー
],
]);
$input = 'AWS Bedrockさん こんにちは。お元気ですか?あなたはどんなサービスなのか詳しく教えてください。'; // ここを任意の内容にしてください
$prompt = "\n\nHuman: {$input}\n\nAssistant:";
$result = $bedrockRuntimeClient->invokeModel([
'contentType' => 'application/json',
'body' => json_encode([
'prompt' => $prompt,
'max_tokens_to_sample' => 1000,
'stop_sequences' => ["\n\nHuman:"],
//'temperature' => 0.1,
//'top_p': float,
//'top_k': float,
]),
'modelId' => 'anthropic.claude-v2:1',
]);
$response_body = json_decode($result['body']);
$completion = $response_body->completion;
return Response::json(['result' => $completion], 200);
} catch (Exception $e) {
var_dump("Error: ({$e->getCode()}) - {$e->getMessage()}\n");;
}
すると、こんな感じで返ってきました。うまく行ったようです
{
"result": " はい、こんにちは。AWS Bedrockと申します。\n\n私はAmazon Web Servicesが提供するサービスの1つで、ベースとなるインフラストラクチャの管理と運用を支援するサービスです。\n\n具体的には以下のような機能を提供しています。\n\n- AWSアカウントの作成と管理\n- アイデンティティやアクセス管理の設定\n- セキュリティ対策の基盤構築\n- コスト管理と利用状況の分析\n- リソースのプロビジョニングと設定の自動化\n\nつまりAWSの基盤となる部分をしっかり整備することで、上位のアプリケーションやワークロードをスムーズに構築・運用できる環境を提供するサービスです。\n\n複雑なインフラの管理から開発者を解放し、アプリそのものの開発に注力できるよう支援します。規模の拡大に合わせてインフラも柔軟に拡張できるのが特徴です。\n\n以上、簡単ではありますがAWS Bedrockの説明でした。ご不明な点があれば遠慮なく質問してください。"
}
おわりに
今回はBedrockを使ってLaravelからClaudeに対して質問を投げてみました。
LaravelからBedrockにリクエストしたい人たちに少しだけ役立てば幸いです