どうもこんにちは。今回は前回のAmazon Bedrockの記事に続いての投稿となります。
今回は、最近話題のanthropic
のClaude2
を使用してみたかったのですが、まだAWS東京リージョンでは使用ができなかったので、Claude Instant
というモデルを使用しました。(バージニア北部かオレゴンリージョンならもう使用できるようですね。)
今回の記事ではBedrockとは何者なのかという説明は省略して、早速実装手順を説明していきます。
実装
0. AWSコンソール上で必要な設定を行う
この時に、自分のアカウントのアクセスキーとシークレットアクセスキーを入手しておいてください。
1. Gemで必要なライブラリを追加する
Gemfileに以下を記述します。
gem 'aws-sdk-bedrockruntime'
2. bundle install
ターミナルでbundle install
をします。
$ bundle install
3. 処理を書く
コメントを送信する処理に入れ込みます。
先に自分が実装したコードを示します。
comment = 'おはようございます。私はお腹が空きました。'
access_key = 'XXXXXXXXXXXXX' # 事前に取得したアクセスキー
secret_access_key = 'YYYYYYYYYYYYYYYYYY' # 事前に取得したシークレットアクセスキー
# Bedrockインスタンスを作成
credentials = Aws::Credentials.new(access_key, secret_access_key)
bedrock_client = Aws::BedrockRuntime::Client.new(region: 'ap-northeast-1', credentials: credentials)
# Bedrockに送信するためのプロンプトのBodyを作成
body_data = {
"prompt": "\n\nHuman: #{comment}\n\nAssistant:",
"max_tokens_to_sample": 300,
"temperature": 0.5,
"top_k": 250,
"top_p": 1,
"stop_sequences": [
"\n\nHuman:"
],
"anthropic_version": "bedrock-2023-05-31"
}
# 指定の形式に載せてリクエストを投げてレスポンスを受け取る
response = bedrock_client.invoke_model({
accept: "*/*",
content_type: "application/json",
body: body_data.to_json,
model_id: "anthropic.claude-instant-v1",
})
# レスポンスを出力
string_io_object = response.body
string_io_object.rewind
string_io_object.each_line do |line|
puts line
end
まず、Aws::BedrockRuntime::Client.new
でBedrockのインスタンスを作成します。
次に、以下の形式でリクエストを投げられるようにコードを書きます。
{
"modelId": "anthropic.claude-instant-v1",
"contentType": "application/json",
"accept": "*/*",
"body": {
"prompt": "\n\nHuman: ここにコメントを入れます\n\nAssistant:",
"max_tokens_to_sample": 300,
"temperature": 0.5,
"top_k": 250,
"top_p": 1,
"stop_sequences": [
"\n\nHuman:"
],
"anthropic_version": "bedrock-2023-05-31"
}
}
ただ、このままBodyのところにJSON形式のままで入力すると、「"expected params[:body] to be a String or IO like object that supports read, rewind, and size, got class Hash instead."
」とエラーが出て怒られてしまうので、bodyの値はto_json
メソッドでString
型に直してからリクエストを投げるようにした方が良いです。
次に、invoke_model
メソッドでリクエストを投げます。response変数でBedrockから返ってきたデータを格納します。
response = bedrock_client.invoke_model({
accept: "*/*",
content_type: "application/json",
body: body_data.to_json,
model_id: "anthropic.claude-instant-v1",
})
次にレスポンスを見たいわけですが、response.bodyの中身はStringIO
クラスになっているのでちょっと工夫が必要です。
string_io_object = response.body
string_io_object.rewind
string_io_object.each_line do |line|
puts line
end
上記コードのように、StringIOクラスのメソッドを使用して中身を出力します。
4. 処理結果
そうすると以下のような結果が出ました。
{"completion":" はい、お腹が空いたのは大変だと思います。朝食は体にとって大切な食事なので、できるだけ早く食べることをおすすめします。美味しい朝食を楽しみにしてください!"}
「お腹が空いた」ことに対してこんなに丁寧に返事されるとは思いませんでした笑
まとめ
今回もrailsでAmazon Bedrockを使用する方法をまとめました。
前回のAmazon Titan Embeddingsモデルよりも生成AIを使用している感じがあってわかりやすいですね。
以上