🍇

【AWS】BedrockのAgentを使ったら1時間弱でRAGを構築できた

2024/05/12に公開

はじめに

こんな感じの社内の規約をソースにしたRAGを、Amazon Bedrockで45分程度で構築しました。

その後Slackとの繋ぎこみまでしたのですが、こちらは私がSlackでChatbotを作るのが初めてだったこともあり、5時間程度かかってしまいました。

この記事では、45分で終わったAmazon Bedrock上でのRAGの構築までを説明します。

作ってみた、きっかけ。

RAGを構築すると結構面倒くさい割に運用費用はかかるし、精度もなかなか上がらないなぁと思っていました。
そんなとき、AWS Bedrockのナレッジベースとエージェントを使うことで、コンソールをポチポチするだけでRAGが作れるらしいと聞いて試してみました。

RAGを作る

Bedrockのモデルを有効化する

AWSのコンソールにアクセスしたら、まずリージョンをバージニア北部(us-east-1)かオレゴン(us-west-2)のどちらかにします。この2つのリージョンだと使えるモデルが多いからです。
世の中の記事を読むとバージニア北部を使っている人が多そうですが、私はオレゴンを使っているので以降この記事ではオレゴンリージョン(us-west-2)前提で解説します。

Bedrockのページにアクセスします。
左のメニューの下の方にあるモデルアクセスを選びます。
「Titan Embeddings G1 - Text」と「Claude 3 Sonnet」を有効化します。

ある程度詳しい人ならSonnetよりOpusのほうが良くない?と思うかもしれませんが、この記事を書いている時点では残念ながらAgentがOpusに対応していませんでした。

S3のbucketを作って、ソースになるファイルを置く

オレゴンリージョンのS3にbucketを作りソースにしたいファイルを放り込みます。
今回は以下のようなファイルを放り込みました。
社員が労働関連の質問をするためのチャットボットを作るという設定です。

  • 厚労省発行の「知って役立つ労働法」(pdf)
  • 労働基準法(pdf)
  • 労働者災害補償保険法(pdf)
  • 自社(NCDC)の就業規則(pdf)
  • 自社(NCDC)のセキュリティ管理規程(docx)
  • 自社(NCDC)のテレワーク利用規約(xlsx)

Bedrockでナレッジベースを作る

Bedrockのコンソールのメニューからナレッジベースを選択して新規作成を押下する

名称やロールを入力して次へを押下します。

ロールはこだわりがなければ「新しいサービスロールを作成して使用」を選択すればいい感じに作ってくれます。

データソース先ほど作成したS3のbucketを選択します

今のところはS3しか選択できないようです。

(どうでもいいけどS3のアイコンが古くないか?)

埋め込みモデルと、ベクトルストアを設定する

埋め込みモデルは、最初に有効化した「Titan Embeddings G1 - Text」を選択します。
ベクトルデータベースは「新しいベクトルストアをクイック作成」でOKです。

作成する

あとは、確認して作成すればOKです。

ナレッジベースをテストする

まだエージェントを作ってないですが、既にこの時点で画面の右の方でRAGっぽいことが出来ます。

エージェントを作る

Bedrockのコンソールのメニューからエージェントを選択して新規作成を押下する

エージェントはナレッジベースのすぐ下にあります。

作成する

とりあえず名前だけ入れれば作れちゃいます。

必要な設定を入れる

作成後に設定を入れていきます。その際に右側でエージェントのテストをしながら設定することができます。
なお、テストする際は、一度保存して準備する必要がありますので注意しましょう。

以下は、設定が必要な項目をざっくりと書いていきます。

  • ロール
    • 初回は「新しいサービスロールを作成して使用」でOK
      • 既存の選択肢にナレッジベースで作ったロールも出てきますが選ばないように注意しましょう。
  • モデル
    • Anthropic -> Claude 3 Sonnet
  • エージェント向けの指示
    • これが一番悩みましたが、とりあえず以下のように入れました。改善の余地がある部分になります。
      保存されているファイルは日本の労働関連に法律の資料およびNCDC株式会社の就業規則です。
      質問者はNCDCの社員です。
      NCDCで働くことについての質問に対して、なるべく分かりやすい日本語で解答をしてください。
      
  • アクショングループ
    • 不要です
  • ナレッジベース
    • 先ほど作成したナレッジベースを選択します。
  • 詳細プロンプト
    • 一旦デフォルトでOK
    • 精度を上げたい時は頑張ってカスタマイズしよう!

保存して終了

全て入力してテストも終わったら、保存して終了しましょう。

エイリアスを作成

エージェントの画面で下の方にあるエイリアスを作成します。
 

エイリアス名をつけて、新しいバージョンを作成して関連付ければOK

RAGを使う

エイリアスを選択するとコンソール上でチャットが出来てRAGとして動きます。

45分で出来たのはここまでです。

アプリに組み込む

AWS SDKにinvoke_agentという関数があります。

https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/bedrock-agent-runtime_example_bedrock-agent-runtime_InvokeAgent_section.html

こちらを呼び出すことで、簡単にRAGアプリを作ることが出来ます。
コレを使ってLambda上にSlackのチャットボットを構築したのですが、それはまた別の機会に記事にしたいと思います。

なおinvoke_agentはCLIからは実行できないので注意が必要です。

感想とか

よかったこと

  • 画面でポチポチするだけでRAGが作れるのは、とても良いです。
  • プロンプトを全てデフォルト設定にしてもそれなりの精度を出してくれるので、ありがたいです。
    • プロンプトの調整は沼なので「とりあえずデフォルトでいいや」と思わせてくれるのは助かる。

あと一歩、出来てほしいこと

  • InvokeAgentをCLIも呼び出せるようにして欲しい。
    • これが一番がっかりポイントでした。CLIから呼び出せれば、AWS Chatbotと連携することで、簡単にSlackから実行できるはずなのです。
    • 対応していれば、Slack連携も含めてノーコードで1時間で作れたのに!
  • InvokeAgentをストリーミングに対応させて欲しい。
    • InvokeAgentのサンプル実装見る限りどう見てもストリーミング前提の作りなのに、現時点では一括でしか応答がこないのですよね。それなりの秒数を待たされるのでチャットアプリにした時に若干ストレスを感じます。
    • boto3のissueにもなっています。
      https://github.com/boto/boto3/issues/3997
  • ナレッジベースのソースをS3以外にも対応して欲しい。
    • OpenSearch Serverless + S3の構成が前提なのですよね。
    • 基本はそれで問題ないのですが、Kendra構成なども簡単に選択できるとより嬉しいかなと思います。
      • 今回スルーしたアクショングループからLambdaを使うことでKendraとの連携できますが、そこでコードを書く労力が必要なら最初からLangChainとか使って自力構築でもいいかなと思ってしまいます。
  • 日本リージョンでも使えるモデルを増やして欲しい。
    • エージェントの構築に限った話しではないですが、Claude3使いたいならアメリカ前提になってしまうのですよねぇ

追記(2024/09/20)

「Slackとの連携がノーコードで出来なかった」と書きましたが、アプデで出来るようになりました。
https://aws.amazon.com/jp/about-aws/whats-new/2024/09/aws-chatbot-amazon-bedrock-agent-microsoft-teams-slack/

連携する記事を書きました(2024/09/26)
https://zenn.dev/ncdc/articles/da0ac239f40651

NCDCエンジニアブログ

Discussion