【Bedrock / Claude】AWSオンリーでRAGを使った生成AIボットを構築してみた【Kendra】

2023.10.06

はじめに

新規事業部 生成AIチーム 山本です。

ChatGPT(OpenAI API)をはじめとしたAIの言語モデル(Large Language Model:以下、LLM)を使用して、チャットボットを構築するケースが増えています。通常、LLMが学習したときのデータに含まれている内容以外に関する質問には回答ができません。そのため、例えば社内システムに関するチャットボットを作成しようとしても、素のLLMでは質問に対してわからないという回答や異なる知識に基づいた回答が(当然ながら)得られてしまいます。

この問題を解決する方法として、Retrieval Augmented Generation(以下、RAG)という手法がよく使用されます。RAGでは、ユーザからの質問に回答するために必要そうな内容が書かれた文章を検索し、その文章をLLMへの入力(プロンプト)に付け加えて渡すことで、ユーザが欲しい情報に関して回答させることができます。

以前の記事では、新たに考えたRAGの方式でシステムを構築したり、システムを試用した結果の分析について記載しました。

Google Cloud Enterprise SearchとRetrieveReadCompose方式RAGを利用して社内公式情報を全部質問できるようにしてみた | DevelopersIO

RAGを使った社内情報を回答できる生成AIボットで業務効率化してみた | DevelopersIO

今回は、このRAGの構成をAWSのサービスのみで作成してみたので、その構成と生成された回答結果について説明します。

(前回の構成)

Google CloudとOpenAIを組み合わせて、RAGを構成し、Slackから質問できるようにしました。使用したデータや内容、システムの構成や動作については、こちらをご覧ください。

今回作成した構成

以下の図のような構成で作成しました。使用したデータは前回と同じものです。

各役割とAWSのサービスの対応は以下のとおりです。

(インタフェース)

前回と同様、Slackから質問できるようにしました。Slack Appを通して、バックエンド側にイベントやアクションを通知します。

アプリケーション

AWS App Runnerを利用しました。以前の構成でコンテナを利用してアプリケーション部分を動かしていたため、そのまま利用するためにApp Runnerを使用しました。ECRにコンテナをpushし、そこからデプロイする方法で使用しました。内部ではPythonのプログラムを動かし、SlackのBoltライブラリを利用して、Slackのメッセージをやり取りしたり、アクション(ユーザからの評価)のログを残す処理を実行しています。

※ 補足:SlackのBoltはLambda関数に対応した機能を持っているので、アプリケーション部分をLambda関数で構築することも可能だと思います。

データソース

Amazon S3を利用しました。Kendraは様々なサービスに対応したコネクタを持っていますが、Notionから直接読み込むコネクタはまだ用意されていないようでした。なので、Notionからマークダウン形式のテキストファイルとしてエクスポートし、それをS3のバケットにアップロードして、データソースとしました。

※ 補足:コネクタについてはこちらのページをご覧ください。公式のコネクタとして30種類以上、パートナーのコネクタはそれを遥かに上回る数のコネクタが紹介されています。

ドキュメント検索

Amazon Kendraを利用しました。上記のS3バケットをデータソースとして設定し、インポートしました。特に苦労することなく操作でき、インデックスを作成できました。前回と同じく、ユーザの質問をそのままクエリとして検索し、結果の上位10件を取り出しました。

情報抽出・回答生成

Amazon Bedrockを利用しました。以下のように2種類のモデルを利用しました。

  • 情報抽出(Read処理):Claude Instant V1(v1.2)
  • 回答生成(Compose処理):Claude V2(v2)

情報抽出部分もClaude V2にしても良いですが、Claude Instant V1を使うことで回答が始まるまでの時間(レスポンスまでの時間)がかなり短くなり、回答も大きくは変わりませんでした。また、Claude Instant V1の利用料金はV2の約1/6程度で、コストが下がるというメリットもあります。

なので、Read部分はClaude Instant V1を使うのがおすすめです。

(料金については、中村さん記事で詳しく書かれていますので、気になる方はこちらをご覧ください)

他の変更点

各サービスに合わせてプログラムを修正・追加しました。ただ、RAGとしての構成は変わっていません。具体的には、検索部分(Retrieve)・情報抽出部分(Read)・回答生成部分(Compose)という構成であり、データの形式・インタフェースは変更していません。また、少し指示を追加しましたが、プロンプトもほぼ同じままのものを使用しました

結果

体験の様子

前回と同様、Slackのアプリを通して提供しました。ユーザはアプリの「メッセージ」の画面で、質問を送信すると、そのスレッドに返信する形で、回答が返されます。詳しい流れはこちらをご覧ください。

質問と回答のサンプル

質問と回答として偉られた例は、以下のとおりです。

一部、情報が足りず回答ができていなさそうなものがありますが、OpenAIのモデルを使用した場合と同様に、質の良い回答が得られていると思われます。また、思考の過程が書かれていることが多い点や、「と思います」「いただければと思います」「要するに、」など、少し柔らかめの表現が出ている点が、OpenAIの場合と異なる点として挙げられると思われます。

介護サービスの利用費補助について教えてください
―――――――――――――――――――――――――――――――――――――――――
介護サービスの利用費補助について、ドキュメント[5]と[9]に以下のような記載がありました。
 
- 地方自治体の介護保険制度で費用の一部が補助される。[5]
- 65歳以上の高齢者が介護サービスを利用した場合、利用料の一部が補助される。補助額はサービス内容や利用者の年収によって決まる。[9]
 
その他のドキュメントには介護サービスの利用費補助に関する記載はありませんでした。
以上から、介護サービスの利用費の一部は、介護保険制度に基づき補助されることが分かります。

育児休業と出生時育児休業(産後パパ育休)はどう違うのですか?
―――――――――――――――――――――――――――――――――――――――――
育児休業と出生時育児休業(産後パパ育休)の違いは以下の通りです。
  育児休業は、1歳未満の子と同居し、養育している男女社員が取得できる制度です。対象となるのは1歳未満の子どもです。
 
一方、出生時育児休業(産後パパ育休)は、男性社員が新生児の出産後8週間以内に取得できる制度です。対象は新生児の出産時点です。
 
要するに、育児休業は1歳未満の子どもの養育が対象で、男女とも取得できますが、出生時育児休業は新生児の出産を対象とし、男性社員のみが取得できる点が異なります。
 
[1],[4],[5],[6],[7]

客先雛形NDAの約款を法務チェックしたいのですが、どのようにすればよいか教えてもらえますか?
―――――――――――――――――――――――――――――――――――――――――
客先雛形NDAの約款を法務チェックしたい場合は、以下の手順が推奨されています。
 
社内ドキュメント[4]によると、NDAは法務レビューの対象となっています。
 
また、社内ドキュメント[3]では、法務レビューを強く推奨しています。
 
したがって、客先雛形NDAの約款を法務チェックする場合は、法務部門に依頼する必要があります。
 
具体的には、社内ドキュメント[5]に記載されているように、法務部門のチーム「#help-legal」(@help-legal)に相談することをおすすめします。
 
標準的なNDA契約書のひな形は、社内ドキュメント[9]を参考にすると良いでしょう。
 
以上から、客先雛形NDAの約款を法務チェックしたい場合は、法務部門の#help-legalチームに相談することをおすすめします。[3],[4],[5],[9]

結婚した時の申請ってどうやったらいいですか
―――――――――――――――――――――――――――――――――――――――――
結婚した時の申請手順は以下の通りです。
 
結婚休暇は結婚した日から2年以内に5日間連続で取得できます。子の結婚の場合は1日取得できます。
取得期間中はSmartHRに「結婚休暇(1/5)」等のメッセージを入力して申請してください。[1]
 
結婚届は人事部に提出する必要があります。提出時には戸籍謄本等の書類が必要です。詳細は人事部に確認してください。[0]
 
また、結婚に伴う姓名変更がある場合は、社内システムの変更手続きが必要です。担当の上長や人事部に相談してください。[7]
 
Slackの表示名変更は個人で変更できますが、メールアドレスの変更はシステム部門に依頼する必要があります。[3]
 
以上が結婚した時の主な申請手順です。不明な点は人事部に確認してください。

出張の電車代の精算方法を教えて
―――――――――――――――――――――――――――――――――――――――――
出張の電車代は立替精算が可能です。
出張後に各自立替精算または総務へ出張手配依頼を行ってください。[9]
電車代は経費科目「電車代」で申請してください。[1]
ただし、自宅と最寄りのオフィス間の通勤部分は通勤手当として非課税扱いとなるため、その部分の電車代は立替精算できません。
出張先から地方オフィスへの移動など、「自宅⇔最寄りオフィス」以外は全て立替精算可能です。[0]

自分の携帯にMDMを入れる方法を教えてください。
―――――――――――――――――――――――――――――――――――――――――
ご質問の回答に直接関係する情報は見つかりませんでした。
ドキュメント[0]にはMDMの削除についての記載がありますが、インストールの方法については記載がありません。
ドキュメント[3]にはMDMの導入手順が記載されていますが、これは会社全体の導入手順で個人のスマートフォンへの導入手順ではないようです。
ドキュメント[4],[5],[9]にはMDMに関する記載が見当たりません。
以上から、ご質問の「自分の携帯にMDMを入れる方法」に直接答えられる内容は見つかりませんでした。
ご質問の内容に関してより詳細な情報があるドキュメントがある場合は、そちらを参照いただければと思います。
今回は回答に使用できる関連情報が見つからなかったため、参照したドキュメントはありません。
[]

回答までの待ち時間

回答が開始されるまでの時間は5~20秒程度、回答が終了するまで15~40秒程度でした。前回の構成だと、回答が開始されるまでの20~40秒程度、回答が終了するまで30~60秒程度でした(長いとそれ以上かかる場合もありました)ので、処理時間が大きく短縮されたようです。実際自分が使っていても、チャットで回答が出るまで待っても苦にならず、すぐに回答が返ってきたな、という印象を持ちました。

異なる点が複数あるため、どこの要因が時間短縮に効いているかすぐにはわかりませんが、今後分析してどこが効果的だったのか、より速くできる箇所がないか、探っていきたいです。

※ 使用する条件・時間帯などによって、処理時間が変わることが予想されますので、ご注意ください。

今後

精度面

使用したプロンプトは、前回のものをそのまま使っています。なので、Claudeに合わせて改良することで、回答の質が上がる余地がまたまだあると思われます。そのためにも、途中結果を見てどのような処理になっているか分析しようと思っています。

機能面

Kendraの特徴として、S3だけでない、さまざまなドキュメントサービスやデータストアサービスをデータソースとして使用できる点が挙げられます。これを活かして、Slack・Google Drive・Zendesk・Salesforceなどの社内の情報も、横断的に検索できるように機能を追加することを考えています。

構築面

今回はマネジメントコンソール上で手作業で構築しましたが、構築部分はIaCで管理したいところです。すでに構成一部のサービスはCDKで構築できることは確認したので、全体をCDKで構築できるようにしたいところです。

運用面

ログ出力の処理が未実装です。また、データ分析のための集計処理や、ダッシュボード部分として表示する部分の構築し、分析から改善につなげるようにしていきたいです。

まとめ

AWSのサービスのみでRAGの方式を実装し、回答の様子を見てみました。結果、今までと変わらず質の高い回答を得ることができました

また、前回利用したRAGの方式のままでしたが、サービスやモデルに置き換えても質の良い回答が得られました。考案したRAG方式の応用できる幅が広く、より良いサービスやモデルを組み合わせたり、改良したい箇所は自分で実装したりすることで、状況に合わせて最適な構成を提供できそうです。