GAS(Google Apps Script)でAWS Bedrockを使ってみる
先日、AWS Bedrockの正式リリースが行われました🎉。現在、多数の企業がGoogle Workspaceを導入しているため、GAS(Google Apps Script)が業務プロセスにおいて頻繁に利用されていることでしょう。その中で、GASとAWS Bedrockの連携を希望する声もあるのではないでしょうか。実際、弊社でも「GASからBedrockを活用したい」との意見が出ていましたが、「具体的な利用方法が不明」という課題も浮上していました。それに対応するため、利用方法に関する調査を進めてみました。
前提
既にBedrockのBase modelsを使用することが出来る状態であることを想定しています。設定の変更はAmazon Bedrock Model accessから行えます。また使用するregionはus-west-2(オレゴン)、モデルはClaude v2です。
IAMユーザの作成
まずは、Bedrockを使用することのできるユーザを作成していきます。
まだAWS管理のポリシーは用意されていないので、以下のポリシーを作成してユーザに追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BedrockInvokeModel",
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "arn:aws:bedrock:*::foundation-model/*"
}
]
}
ユーザが作成できたら[セキュリティ認証情報]タブから、アクセスキーを作成ボタンを押して、アクセスキーとシークレットアクセスキーを取得します。ここで取得したキーは後程使いますので、メモ帳にメモをするなり、csvファイルをダウンロードするなりして忘れないようにしてください。
GASプロジェクトの作成
GASプロジェクトを新規に作成します。作成後は左のバーにある設定からスクリプトプロパティの設定を行っていきます。そして、先ほど取得したキーをそれぞれ、「ACCESS_KEY」と「SECRET_ACCESS_KEY」という名前で保存します。
aws-apps-script
AWSが提供しているサービスのAPIを叩く際に必要な認証周りを自前で実装するのは骨が折れるので、いい感じのライブラリを探していた所、[GitHub]aws-apps-scriptのレポジトリを見つけました。
READMEを読んだところ、aws.jsをGASのプロジェクト内に設置し、AWS.init()でアクセスキーとシークレットアクセスキーを設定した後、AWS.request()でAWSのAPIを呼べるようです。request関数に渡す引数は以下のようなものとなっています。
AWS.request(
service,
region,
action,
params={},
method='GET',
payload='',
headers={"Host": GeneratedHost, "X-Amz-Date": GeneratedX-Amz-Date, "X-Amz-Target": action},
uri='/'
)
AWS.request(
'bedrock',
'us-west-2',
'',
{},
'POST',
{
"prompt": "Human: s3について説明して\nAssistant:",
"max_tokens_to_sample": 500,
"temperature": 1,
"top_k": 250,
"top_p": 0.999,
"stop_sequences": ["\n\nHuman:"],
"anthropic_version": "bedrock-2023-05-31"
},
{ 'Content-Type': 'application/json' },
uri='/model/anthropic.claude-v2/invoke'
)
動作確認
最終的な全体のコードは以下の通りです。
const ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('ACCESS_KEY')
const SECRET_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('SECRET_ACCESS_KEY')
function awsBedrockTest() {
AWS.init(ACCESS_KEY, SECRET_ACCESS_KEY)
const body = {
"prompt": "Human: s3について説明して\nAssistant:",
"max_tokens_to_sample": 500,
"temperature": 1,
"top_k": 250,
"top_p": 0.999,
"stop_sequences": ["\n\nHuman:"],
"anthropic_version": "bedrock-2023-05-31"
}
const res = AWS.request(
'bedrock',
'us-west-2',
'',
{},
'POST',
body,
{ 'Content-Type': 'application/json' },
uri='/model/anthropic.claude-v2/invoke'
)
console.log(JSON.parse(res.getContentText())['completion'])
}
Bedrockが正式にリリースされたとのことで、GASからの利用方法を検証してみました。結果として、無事に使えることが確認でき、安心しました。BedrockではFine-tuningしたカスタムモデルも利用可能とのことなので、次にはBedrockでのFine-tuningに挑戦しようと思っています。
また、これまでGASからS3以外のAWSサービスを使った経験がなかったのですが、今回の経験を通じて、GASから各種AWSサービスをどのように利用するかの手がかりが得られて良かったです。