RubyでAmazon BedrockのClaude 3 Opusを使う

タグ: ruby aws / 公開: 2024-04-27

はじめに

先日Claude 3 OpusがAmazon Bedrockで使用可能になった。

https://aws.amazon.com/jp/blogs/news/anthropics-claude-3-opus-model-on-amazon-bedrock/

JavaScriptやPythonの例ばかりでRubyで完全に動作するコードが見あたらなかったので、RubyのAWS SDKからのOpusの呼び出し方法を書いておく。

前提ソフトウェア

ソフトウェアバージョン備考
Ruby3.3.0-
aws-sdk-bedrockruntime1.7.0-

下準備

Bedrockでは各モデルの利用前にAWSマネジメントコンソールからアクセスをリクエストして承認される必要がある。 その辺はクラメソの記事などを参照。自分でもやってみたところ、すぐ承認された。

https://dev.classmethod.jp/articles/claude-3-opus-bedrock/

Opusを呼び出す

Gemfile

source "https://rubygems.org"

gem "aws-sdk-bedrockruntime"

gem "rexml"
# gem "nokogiri"

# gem "base64"

ポイントは以下のとおり。

  • aws-sdk-bedrockruntime がモデルを実行するためのGem。
    • aws-sdk-bedrock もあるが、こちらはBedrockの構成を管理するAPIのためのGemで別物なことに注意。
  • rexmlnokogiri などいずれかのXMLライブラリが必要。
    • 入れないとAWS SDKの呼び出し時に次のエラーになる。 Unable to find a compatible xml library. Ensure that you have installed or added to your Gemfile one of ox, oga, libxml, nokogiri or rexml (RuntimeError)
  • Ruby3.3だと警告が表示されるので、標準添付ライブラリの base64 もGemの方を入れておくのが良い。
    • warning: base64 was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.4.0. Add base64 to your Gemfile or gemspec. Also contact author of aws-sdk-core-3.193.0 to add base64 into its gemspec.

プロンプトに対して回答を得るスクリプト

require "aws-sdk-bedrockruntime"

bedrock_client = Aws::BedrockRuntime::Client.new(
  region: 'us-west-2', # Opusが提供されているオレゴンリージョンを指定
  http_read_timeout: 600.0 # 応答に時間がかかるとタイムアウトするので600秒に延長しておく
)

prompt = "こんにちは。"

payload = {
  messages: [
    {
      role: "user",
      content: [
        {
          type: "text",
          text: prompt
        }
      ]
    }
  ],
  max_tokens: 1000,
  anthropic_version: "bedrock-2023-05-31"
}

body = payload.to_json

resp = bedrock_client.invoke_model({
  model_id: "anthropic.claude-3-opus-20240229-v1:0",
  content_type: "application/json",
  body:
})

resp #=> #<struct Aws::BedrockRuntime::Types::InvokeModelResponse body=#<StringIO:0x00007ffae6d78ed8>, content_type="application/json">
resp.body #=> #<StringIO:0x00007ffae6d78ed8>

resp_body = resp.body.read

resp_json = JSON.parse(resp_body)
# {"id"=>"msg_bdrk_01JdUa8GaBKC9T9FLnM5mbtj",
#  "type"=>"message",
#  "role"=>"assistant",
#  "content"=>[{"type"=>"text", "text"=>"こんにちは。今日はどんなことでお話ししましょうか?私にできることがあれば、何でも聞いてくださいね。"}],
#  "model"=>"claude-3-opus-20240229",
#  "stop_reason"=>"end_turn",
#  "stop_sequence"=>nil,
#  "usage"=>{"input_tokens"=>13, "output_tokens"=>47}}

puts resp_json["content"][0]["text"]
#=> こんにちは。今日はどんなことでお話ししましょうか?私にできることがあれば、何でも聞いてくださいね。

bodyパラメータとして送っているJSONの形式がClaude 2以前と異っていて、その情報が少なくてハマった。 AnthropicのMessages APIという形式でないといけない。 JSONの形式については以下のAWSユーザーガイドを見ると良い模様。

https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html

古い形式のbodyパラメータでClaude 3を呼ぼうとすると "claude-3-opus-20240229" is not supported on this API. Please use the Messages API instead. (Aws::BedrockRuntime::Errors::ValidationException) といった例外が発生する。

invoke_modelmodel_id として指定できる値についてもAWSユーザーガイドの一覧を参照。 別の値を指定することで他のモデルを呼ぶことができる。 現時点でHaikuやSonnetを含むClaude 3のオンデマンドスループットのIDを抜粋すると以下のようになっていた。

https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html

Anthropic	Claude 3 Sonnet	1.0	anthropic.claude-3-sonnet-20240229-v1:0
Anthropic	Claude 3 Haiku	1.0	anthropic.claude-3-haiku-20240307-v1:0
Anthropic	Claude 3 Opus	1.0	anthropic.claude-3-opus-20240229-v1:0

なおこの例ではシンプルに invoke_model を使っているが、コールバックで応答が得られる invoke_model_with_response_stream もある。 要件によってはこちらを使った方が良いだろう。

invoke_model はOpusの場合、応答が返るまで長時間かかることがあるため http_read_timeout を長く設定しておくと良い。 デフォルトでは60秒応答がないと Net::ReadTimeout となってしまう。

BedrockRuntime::Client の使い方の詳細はAWS SDKのドキュメントを参照。

https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/BedrockRuntime/Client.html

実行する

特別なことはない。 AWSのクレデンシャルが必要で、典型的な実行方法は以下のとおり。

モデルの呼び出しには bedrock:InvokeModel アクションが許可されている必要がある。

# デフォルトのAWSプロファイルやIAMロールの場合は何も指定せず実行
bundle exec ruby sample.rb
 
# 特定のAWSプロファイルxxxを使う場合はAWS_PROFILE環境変数を指定
AWS_PROFILE=xxx bundle exec ruby sample.rb

# アクセスキーを使う場合はAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEY環境変数を指定
AWS_ACCESS_KEY_ID=xxx AWS_SECRET_ACCESS_KEY=xxx bundle exec ruby sample.rb

まとめ

このように、ごく僅かなコーディングで最新の基盤モデルであるOpusをRubyから呼び出すことができた。

日本語が扱える実用的な基盤モデルが追加されたことで、AWS上で動作している既存Railsアプリケーションに生成AIを使った機能を組み込む、といったことも従来より気軽にできるようになるだろう。

生成AIは群雄割拠でAWSにどこまで拘るかは悩ましい状況だが、Bedrockは他のAWSサービスと同じように構成できIAMで権限を管理できる等、インフラや運用の面でもメリットがあるように思える。

この記事をSNSでシェアする
タイトルとURLをコピーする
または投稿画面を開く
Author
Icon
ぺけみさお / xmisao
プログラマ。
Subscription
Recent articles
Related to ruby
Related to aws