はじめまして!クラウド・インフラ インテグレーション事業部の古川原です。
私は、AWSを活用したクラウド基盤開発部隊の中にある、アプリチームに所属しています。
開発言語は、Ruby on Railsを使用し、webアプリケーションの開発を行なっています。
初めてのブログ投稿になりますが、よろしくお願いします。
さて本題ですが、今回は、Ruby on Railsのwebアプリケーションから、Amazon Bedrock Agentsを呼び出す方法をご紹介します。
今回利用するサービスについて少しだけ触れておきます。
Amazon Bedrockは、主要なAI企業やAmazonが提供する高パフォーマンスな基盤モデル(FM)を、統合APIを通じて利用できるようにするフルマネージドサービスです。 開発者は自分で機械学習モデルを構築・運用することなく、大規模言語モデル(LLM)や画像生成モデルをAPI経由で簡単に呼び出すことができます。
トークン数やリクエスト数に制限がありますが、AWSで生成AIを気軽に検証するには、十分かなと思っています。
※利用可能なFMの一部(例)
・Amazon-Titan
・AI21 Labs-Jamba
・Anthropic-Claude
・DeepSeek-DeepSeek-R1
・Meta-Llama
エージェントは、事前に決められた目的を達成するために、必要なデータを収集しそのデータに基づいて自律的に選択を行う仕組みのことです。
例えば、私が「旅行に行きたい」という目的をエージェントに伝えたときに、旅行の目的地を確認し、飛行機や宿泊施設の予約、観光地の候補などを提案してくれます。
今回使用する、Amazon Bedrock Agentsは、Amazon Bedrock内でこのエージェント機能を利用できるようにする仕組みを持っているサービスです。 アクショングループや、メモリ、ナレッジベースなど様々な活用方法があります。
今回実現したいことは、Ruby on Railsの環境から、AWS SDK for Rubyを使用し、Amazon Bedrock Agentsを呼び出すことです。
Ruby on RailsのwebアプリケーションはEC2上に構築してあります。 また、メモリ機能を使用し、エージェントに会話の履歴を記憶させることで、連続性のある対話を実現します。
今回、Amazon Bedrock AgentsをRailsから呼び出す際に、必要になる知識をまとめてみました。
対話を実現するにはAWS SDK for Rubyが提供するinvoke_agentメソッドを使用してAmazon Bedrock Agentsと対話します。 ほかにも、様々なメソッドが用意されていますが、対話を行うためにはこのメソッドを一つ使用すれば、対話することができます。
※参考:AWS SDK for Ruby Aws::BedrockAgentRuntime::Client
Amazon BedrockをAPI経由で利用するには、AWSの認証情報を設定する必要があります。
この認証により、どのユーザーやアプリケーションがどのリソースにアクセスできるのかを制御することができます。
EC2上でアプリケーションを構築している場合、IAMロールをEC2にアタッチすることで認証を行うことが可能です。 アプリケーションを構築しているEC2に対して、AmazonBedrockFullAccessをアタッチすることで、アクセスが可能になります。
※デフォルトでエージェントごとにIAMロールが作成されるので、権限を狭めたい場合はそちらをアタッチしてください。
IAMユーザでアクセスキーを発行し、credentials等に設定を行い認証を行う方法です。
Railsの環境がEC2上にない場合、この方法で認証を行う必要があります。
今回使用するinvoke_agentメソッドは、リクエスト時に必須のパラメータが3つあります。
呼び出しを行うエージェントを指定します。
AWSコンソール>Amzaon Bedrock>オーケストレーション-エージェントから、使用したいエージェントを開き「エージェントの概要」に記載されていIDがこのagentIdです。
呼び出しを行うエージェントのエイリアスを指定します。
このエイリアスは、必須項目であるため、AWSコンソールから必ずエイリアスを作成してください。
セッションを指定し、対話の履歴を保持するために使用します。
Rails側で値を作成する値で、文字数の制約は下記です。
文字数の制約
・Min:2文字
・Max:100文字
・利用可能な文字パターン:^[0-9a-zA-Z._:-]+$
今回、エージェントの作成方法は割愛しますが、メモリ機能を有効にして作成しています。
・Gemfileに下記を追加
gem 'aws-sdk-bedrockagentruntime'
・bunlde install
bundle install
# app/models/aws/amazon_bedrock.rb
require 'aws-sdk-bedrockagentruntime'
class Aws::AmazonBedrock
class << self
def call_bedrock_agents_test(message, session_id: 'test-user')
# クライアント作成
client = Aws::BedrockAgentRuntime::Client.new(region: 'ap-northeast-1')
# エージェントのID
agent_id = 'DTSCLL2ABA'
# エージェントのエイリアスID
agent_alias_id = 'DTSDIGITAL'
# Amazon Bedrock Agents呼び出し
response = client.invoke_agent(
agent_id: agent_id,
agent_alias_id: agent_alias_id,
session_id: session_id,
input_text: message
)
# レスポンス形成
response_text = response.completion.map do |event|
Rails.logger.debug "event: #{event}"
event.bytes.force_encoding('UTF-8')
end.join
Rails.logger.info "Bedrock Response: #{response_text}"
response_text
rescue Aws::Errors::ServiceError => e
Rails.logger.error "Bedrock AWS Error: #{e.message}"
"エラーが発生しました。再度送信してください。"
rescue StandardError => e
Rails.logger.error "StandardError: #{e.message}"
"エラーが発生しました。再度送信してください。"
end
end
end
rails consoleを使用して動作確認をしてみます。
[1] pry(main)> Aws::AmazonBedrock.call_bedrock_agents_test("私は、ドライブをして
遠出し、美味しいご飯を食べるのが好きです。私に合う旅行先を提案してください。", session_id:
"test-user")
event: {:attribution=>nil, :bytes=>"[FILTERED]", :event_type=>:chunk}
Bedrock Response: - 北海道:広大な自然の中を車で走り回り、新鮮な海の幸や地元の郷土料理を
楽しめます。
- 九州:温泉地や歴史的な街並み、豊かな自然に囲まれ、地元の美味しい料理を堪能できます。
- 瀬戸内海沿岸:島々を巡るドライブや、新鮮な魚介類、瀬戸内の景色を楽しめます。
これらの地域はユーザーの好みに合っているかもしれません。予算や滞在期間など、
他の条件がわかれば、より詳細な提案ができると思います。ご検討ください。
[2] pry(main)> Aws::AmazonBedrock.call_bedrock_agents_test("北海道は良いですね。
どのようなグルメを食べられますか?", session_id: "test-user")
event: {:attribution=>nil, :bytes=>"[FILTERED]", :event_type=>:chunk}
Bedrock Response: 北海道には、以下のようなおすすめのグルメがたくさんあります:
- 新鮮な海鮮料理:北海道は日本有数の漁業地域なので、海の幸が豊富です。特に、海鮮丼、
カニ料理、海鮮鍋などが有名です。
- ジンギスカン:羊肉を使った焼肉料理で、北海道の郷土料理の代表的なものです。ビールとの
相性が抜群です。
- 札幌ラーメン:札幌発祥のラーメンで、豚骨や味噌をベースにした濃厚な味わいが特徴です。
- じゃがいもグルメ:北海道はじゃがいもの生産量が日本一なので、じゃがいもを使ったグルメが
人気です。ポテトコロッケやじゃがバター、じゃがいもグラタンなどがおすすめです。
- スイーツ:北海道産の乳製品を使ったケーキやアイスクリームなどのスイーツも有名です。
このように、新鮮な海の幸や乳製品、野菜を使った北海道ならではのグルメを楽しめると思います。
このように、非常に簡単に生成AIを呼び出し、自然言語で答えてくれることが確認できました。
また、メモリ機能を有効にしているため、前の会話を記憶し回答してくれます。
[3] pry(main)> Aws::AmazonBedrock.call_bedrock_agents_test("おすすめのドライブ先を
教えてください。", session_id: "test-user")
event: {:attribution=>nil, :bytes=>"[FILTERED]", :event_type=>:chunk}
Bedrock Response: 北海道でおすすめのドライブコースは以下のようなものがあります:
- 支笏湖ドライブ:支笏湖は北海道の代表的な湖で、湖畔の景色を楽しめます。湖畔の道路を走る
ドライブは気持ちがよいです。
- 洞爺湖ドライブ:洞爺湖は美しい湖畔の景色と温泉地で知られています。湖畔を一周する
ドライブコースがおすすめです。
- 知床半島ドライブ:知床半島は世界自然遺産に登録されている自然豊かな地域です。海沿いの
ドライブコースから、雄大な自然景観を楽しめます。
- 富良野・美瑛ドライブ:美しい丘陵地帯が広がる富良野と美瑛は、四季折々の絶景を楽しめる
ドライブスポットです。
これらのドライブコースでは、北海道ならではの大自然の景色を堪能できると思います。
ぜひ、お気に入りのコースを見つけてみてください。
北海道という言葉を使用しなくても、前の会話からどこをドライブするかを理解し、北海道のおすすめのドライブコースを提案してくれました。
異なるセッション(session_id)を使用することで、会話する相手を認識させることも可能です。
[4] pry(main)> Aws::AmazonBedrock.call_bedrock_agents_test("おすすめのドライブ先を
教えてください。", session_id: "hoge-user")
event: {:attribution=>nil, :bytes=>"[FILTERED]", :event_type=>:chunk}
Bedrock Response: 日本国内でおすすめのドライブ先としては、以下のようなスポットが人気です:
- 富士山周辺 - 富士山の絶景を楽しめる人気のドライブコース
- 瀬戸内海沿岸 - 島々の美しい景色を楽しめる
- 北海道 - 広大な大自然の中を走るドライブが魅力的
- 九州 - 温泉地や火山、海沿いの景色が楽しめる
これらの地域は季節によって楽しみ方が変わるので、ご希望の旅行時期に合わせてプランを立てるのが
おすすめです。旅行会社やインターネットで詳細な情報を確認するのが良いでしょう
同じ質問をしてみましたが、北海道ではなく、全国の提案をしてきました。
今回は、Ruby on Railsの環境から、Amazon Bedrock Agents呼び出す方法に関して調べてみました。
Amazon Bedrock Agentsを活用することで、非常に簡単に生成AIと対話する機能を作成することが出来ました。
動作確認としては、あまりエージェントらしさを伝えることができませんでしたが、この呼び出し方法を基本として、Amazon Bedrock Agents側でナレッジベースやアクショングループを設定することで、より強力な生成AIを活用することができると思います。
是非、あなたのRailsアプリケーションでも、生成AIの力をぜひ試してみてください!
・https://docs.aws.amazon.com/bedrock/latest/APIReference/welcome.html
・https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/BedrockAgentRuntime.html
・https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_InvokeAgent.html