5
0

【Rails】Amazon Bedrockを使用して生成AIと会話してみた

Last updated at Posted at 2023-11-17

どうもこんにちは。今回は前回のAmazon Bedrockの記事に続いての投稿となります。

今回は、最近話題のanthropicClaude2を使用してみたかったのですが、まだ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を使用している感じがあってわかりやすいですね。

以上

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0