こんにちは!エンジニアの岩間です。
最近、今話題のAmazon Bedrock APIを実行してTypeScriptのテストコードを出力してみる機会があったので、今回は実行手順とそのサンプルコードをご紹介していきたいと思います。
Amazon Bedrock とは
Amazon Bedrock は、主要な AI スタートアップや Amazon が提供する高パフォーマンスな基盤モデル (FM) を、統合 API を通じて利用できるようにするフルマネージド型サービスです。 さまざまな基盤モデルから選択して、ユースケースに最適なモデルを見つけることができます。
簡単にいうと、AWSが提供する生成AIのサービスのことです。
Bedrock APIを実行するまでの手順
ここからはAmazon Bedrock APIを実行するまでの流れをご紹介します。
モデルアクセスの設定
まずはコンソールでモデルアクセスの設定を行っていきます。
Amazon Bedrock ファンデーションモデルへのアクセスはデフォルトでは許可されていません。基盤モデルにアクセスするには、十分な権限を持つ IAM ユーザーがコンソールからそのモデルへのアクセスをリクエストする必要があります。モデルへのアクセス権が付与されると、そのモデルはそのアカウントのすべてのユーザーが利用できるようになります。
1. AWSコンソールからBedrockのページに移動し、左のサイドメニューから「モデルアクセス」をクリックします。(東京リージョン)
2. 次に「モデルアクセスを管理」ボタンをクリックします。
3. 今回はClaudeを使うので、ユースケースの詳細を送信します。※Anthropic モデルにアクセスするには、ユースケースの詳細を送信する必要があります。
4. 下記の画像のようなポップアップが表示されるので、会社名等の情報を送信します。
5. ユースケースの詳細を送信後、Claudeが選択可能な状態となるので選択し、「変更を保存」ボタンをクリックします。
6. しばらく待つと以下の画像のように「アクセスが付与されました」のステータスになります。これでClaudeモデルへのアクセスが可能となりました!
コーディング
次にコードを書いていきます。
今回はローカルのTypeScriptのコードからAmazon Bedrock APIを実行していきたいと思います。
ローカルで以下のコマンドを実行します。
1 2 3 4 5 6 7 8 |
// ディレクトリ作成 mkdir bedrock-practice && cd bedrock-practice // 初期化 npm init // 各種インストール npm install --save typescript aws-sdk @types/node @aws-sdk/client-bedrock-runtime @aws-sdk/credential-providers ts-node fs // ファイル作成&編集 vi index.ts |
index.tsを以下のように編集します。
Bedrockに渡すプロンプトでは、サンプルのプログラムをもとにテストコードの作成をお願いしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
const { BedrockRuntimeClient, InvokeModelCommand } = require("@aws-sdk/client-bedrock-runtime"); const { fromSSO } = require("@aws-sdk/credential-providers"); const fs = require('fs'); // Bedrock apiを呼び出すための関数 async function callBedrockAPI() { // Client情報を定義 const bedrockClient = new BedrockRuntimeClient({ credentialDefaultProvider: fromSSO({ profile: "sandbox-xxxx", // プロファイル名を指定 }), region: "ap-northeast-1", // リージョンを指定 }); // Bedrockに渡すプロンプトを指定 const prompt = `Human: あなたはTypeScriptプログラムの設計、実装、試験のスペシャリストです。 <inputText></inputText>タグ内のプログラムはTypeScriptプログラムです。 このTypeScriptプログラムを読んで、テストコードを作成してください。 <inputText> ${await readFile('./test.ts')} </inputText>`; // APIのリクエストボディの設定 ドキュメント:https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html#model-parameters-anthropic-claude-messages-request-response const requestBody = { anthropic_version: "bedrock-2023-05-31", // 値は bedrock-2023-05-31 にする必要があります max_tokens: 4096, // 停止する前に生成するトークンの最大数。AnthropicClaudeモデルによって、このパラメーターの最大値は異なります 最大値一覧:https://docs.anthropic.com/claude/docs/models-overview#model-comparison messages: [{ role: "user", content: [{ type: "text", text: prompt }] }], // 入力メッセージ }; // APIのリクエストパラメータを設定 const params = new InvokeModelCommand({ body: JSON.stringify(requestBody), contentType: "application/json", accept: "application/json", modelId: "anthropic.claude-v2:1", // BedrockのモデルIDを指定 モデルID一覧:https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns }); try { // API実行 const result = await bedrockClient.send(params); const decodedResponseBody = new TextDecoder().decode(result.body); const responseBody = JSON.parse(decodedResponseBody); return responseBody; } catch (error) { console.error("Error calling Bedrock API:", error); throw error; } } // ファイルを読み込むための関数 async function readFile(filePath: string) { return new Promise((resolve, reject) => { fs.readFile(filePath, 'utf8', (err: any , data: any) => { if (err) { reject(err); } else { resolve(data); } }); }); } // 非同期関数の呼び出し callBedrockAPI() .then(response => { console.log("Response from Bedrock API:", response); }) .catch(error => { console.error("Error:", error); }); |
クレデンシャルの取得についてですが、社内では、複数のAWS SSO(IAM Identity Center)をAWS CLIに関連付けてAWSにセキュアにログインする運用をしています。
そのためclient情報を定義している箇所(10行目)は、AWS SDK v3 credential providerのfromSSOを利用して使用するプロファイル名を指定しています。
また、同ディレクトリにはBedrockに渡すtest.tsを配置しています。(21行目)
test.tsの内容はWEBからファイルをDLするプログラムとなっています。※ここでは省略
「このプログラム、モデルの学習に使用されるのかな?」とふと思ってドキュメントを読んだところ以下の記述がありました。
Data protection in Amazon Bedrock
Amazon Bedrock doesn’t use your prompts and continuations to train any AWS models or distribute them to third parties.
Amazon Bedrockではプロンプトの情報をAWSのモデルの学習には利用せず、(モデルを提供する)サードパーティに配布しないということがわかりました。
Bedrock API実行
上記手順を実行後、index.tsをローカルで実行してみます。
1 |
npx ts-node index.ts |
結果はこんな感じでした。テストコード作成のポイントとテストコードがちゃんと返ってきています!
まとめ
今回はBedrockにテストコードを書いてもらいましたが、生成AIを利用して開発を効率化できたりするのはとても良いですね。
テクノロジーは日々進化しており、生成AIがソフトウェアテストの大部分を担う日も近づいています。
IDCの予測によれば、2028年までに生成AIベースのツールがソフトウェアテストの70%をカバーするとされており、これにより手動テストの必要性が減り、テストのカバレッジが向上し、ソフトウェアの品質とユーザビリティが向上すると期待されている、とのことで今後も目を離せません。
また、開発効率化という観点で言えば、個人的に以下の記事もとても気になっていたりします。
Amazon Bedrock でプログラム概要資料を生成しよう!!
生成AIを活用しつつ、より良いソフトウェアを開発を目指していきたいです。
ここまでお読みいただきありがとうございました。
- 電子工作で自作した植物の自動水やり機から土壌データをAWS IoT Coreに連携してみた - 2024-09-13
- 【ESP8266 NodeMCU】電子工作で植物の自動水やり機を作ってみた - 2024-08-14
- Amazon Bedrock APIでTypeScriptのテストコードを出力してみた - 2024-05-07
- AWS CDK × CodeBuild × CypressでE2Eテストを自動化&実行動画をS3に保存してみる - 2024-04-16
- AWS ECSでブルーグリーンデプロイメント!~デプロイメントタイプ別の動作比較~ - 2024-04-03