はじめに
こんにちは、SAIG/MLOpsチームでアルバイトをしている小川です。
AWSを用いた生成AIアプリケーションの実装として、Generative AI Use Cases JP (略称:GenU)についての検証を行いました。
検証内容
生成AIを簡単に素早く使いたいという要望を実現するために検証を行いました。GenUにはCloudFormationを用いて実装する方法と、CDKを用いて実装する方法があり、これらの違いは以下のようになっています。
- CloudFormationは数クリックで簡単に構築しユースケースを体験したい方向け
- CDKはソースコードを確認してカスタマイズしたい方向け
本検証ではどれぐらい簡単に構築できるかが知りたいため、CloudFormationでの実装を選択しました。検証した内容は以下の通りです。
- GenUを用いるとどれだけ簡単に生成AIチャットアプリケーションを実装できるのか
- カスタマイズなし(CloudFormationのテンプレートから作成)で、どのような機能の実装が可能か
- カスタマイズをすれば(CDKを用いて作成)、どのような機能の実装が可能か
これらについて、生成 AI 体験ワークショップを参考にGenUの実装に取り組みました。
GenUについての詳しい情報は以下のリンクに記載されています。
- 社内知識を活用した生成 AI チャットボットを構築したい | AWS
- aws-samples/generative-ai-use-cases-jp: すぐに業務活用できるビジネスユースケース集付きの安全な生成AIアプリ実装
- 生成AIユースケースを考え倒すためのGenerative AI Use Cases JP (GenU)の魅力と使い方 - Speaker Deck
アプリケーションのアーキテクチャ
アプリケーションのアーキテクチャは下の画像のようになっていて、点線で囲まれている部分はオプションです。
- フロントエンドはReactが使われており、Amazon CloudFront、AmazonS3によって配信
- バックエンドはAmazon API Gateway、AWS Lambdaを使用し、サーバーレスのアーキテクチャ
- Amazon Cognitoによる認証機能がある
- 基本部分はフルサーバーレスのため従量課金となり、小さく始めやすいという利点がある
- 点線部分のRAG機能、検索エージェント機能、セキュリティ機能、モニタリング機能はオプションとしてデプロイすることが可能
![arch.drawio.png](/images/20250207a/arch.drawio.png)
▲ GitHub - aws-samples/generative-ai-use-cases-jp: すぐに業務活用できるビジネスユースケース集付きの安全な生成AIアプリ実装より引用
CloudFormationを用いた際のアーキテクチャ
CloudFormationを使用して構築し、RAGを有効化すると、上図のデフォルトの構成に加えて、点線部分のAWS WAF、RAGチャット機能(Amazon Kendra、S3)が追加でデプロイされます。
実装手順
アプリケーションの実装のための手順は以下のようになっています。
- モデルの有効化
- WAF (Web Application Firewall)の作成
- アプリケーションの作成
- RAG用データの追加
以下、順番に手順を説明していきます。
モデルの有効化
まずは、Bedrockのモデルを有効化する必要があります。すでに有効化している場合はこの手順は不要です。
- Amazon Bedrock でテキスト生成モデル (Anthropic Claude 3/3.5)、テキスト埋め込みモデル (Amazon Titan Text Embeddings V2)、画像生成モデル (Stable Diffusion XL) を有効化
- 2024/12/18現在、東京リージョンでは画像生成モデルが有効化できなかったため、バージニア北部リージョン(us-east-1)で有効化
![コメント_2024-10-30_143519.png](/images/20250207a/コメント_2024-10-30_143519.png)
WAFの作成
WAFを作成の手順に従って作成しました。
- このリンクを押すと、WAFのスタック作成画面に遷移
- WAFの作成は、バージニア北部リージョンで実施
- 作成画面のデフォルトでは全てのIPアドレスからのアクセスが許可されているので注意
- IPV6の部分は空欄でも作成可能
- S3へのアクセスやポリシー作成が必要になるため、その権限を持つIAMロールを追加
![コメント_2024-10-22_174121.png](/images/20250207a/コメント_2024-10-22_174121.png)
- スタックの作成を押すと、WAFが作成される
アプリケーションの作成
アプリの作成の手順に従って作成しました。
- このリンクを押すとアプリケーションのスタック作成画面に遷移
- WAFと同様に全てのIPアドレスからのアクセスが許可されているので注意する
- 以下の画像のように設定し、WAFと同様のロールをつけて作成
- ImageGenerationModelIds, ModelIdsはサポートしている基盤モデルに記載されているものから自分が有効化したものを選ぶ
- ModelRegionはモデルを有効化したリージョン(us-east-1)を入力
- RAGを有効化するときはRagEnabledをTrueにする
![コメント_2024-10-23_163437.png](/images/20250207a/コメント_2024-10-23_163437.png)
- スタックの作成を押すと、アプリケーションが作成される
RAG用データの追加
- S3へのファイルアップロード
- KendraとS3の連携
という手順で行われます。
S3へのファイルアップロード
S3へのアップロードの手順に従って作業を進めました。このリンクにわかりやすい手順が紹介されているため、詳細な手順に関しては省略します。作成したアプリケーションには、Amazon Kendraと連携するためのgenerativeaiusecasesstack-ragdatasourcebucketからはじまるS3バケットが含まれます。このバケットの中のdocs/
というフォルダにデータを追加することで、RAGチャットが使用可能になります。例えば社内文書を活用したRAGを実装したい場合、docs/
以下に社内ドキュメントをアップロードすることで実装可能です。デフォルトでBedrockのドキュメントのpdfがdocs/
配下に置かれています。
KendraとS3の連携
Amazon Kendraに移動し、KendraとS3の連携の手順に従って作業を進めました。このリンクにわかりやすい手順が紹介されているため、詳細な手順に関しては省略します。Kendraには、generative-ai-use-cases-index という名前の Kendra インデックスが作成されており、先ほどのS3のデータソースと連携されています。現時点では先ほどアップロードしたオブジェクトはKendraインデックスと同期していないため、同期させる必要があります。Sync nowというボタンを押すことで同期が可能です。また、今回のように手動で同期させるのではなく、スケジュールを設定することで同期を自動化することもできます。
実装したアプリ画面
CloudFormationで、RAGを有効化して実装した際の画面
![コメント_2024-10-23_170544.png](/images/20250207a/コメント_2024-10-23_170544.png)
![コメント_2024-10-23_170425.png](/images/20250207a/コメント_2024-10-23_170425.png)
チャット(テキストのみ入力/画像とテキストを入力)
![コメント_2024-10-23_170932.png](/images/20250207a/コメント_2024-10-23_170932.png)
![コメント_2024-10-23_170845.png](/images/20250207a/コメント_2024-10-23_170845.png)
RAG
サンプルとして提供されていたBedrockのドキュメントと、勤怠システムのドキュメントについての質問をすると、その内容と参照したpdfのページも出力してくれます。
![コメント_2024-10-23_173604.png](/images/20250207a/コメント_2024-10-23_173604.png)
![コメント_2024-10-23_173626.png](/images/20250207a/コメント_2024-10-23_173626.png)
翻訳
![コメント_2024-10-23_174033.png](/images/20250207a/コメント_2024-10-23_174033.png)
校正
![コメント_2024-10-23_174055.png](/images/20250207a/コメント_2024-10-23_174055.png)
その他の機能、課題
ほかにも機能があり、アプリケーションの確認で、どのような機能が実装されているか詳しく紹介されています。
しかし、CloudFormationで作成したアプリケーションはCDKを用いて作成したアプリケーションのバージョンより古いという欠点があります(2024/12/18現在)。
そのため、AgentチャットというAPIと連携して様々なタスクを行う機能など、一部実装できない機能があります。Web検索の結果を用いたチャットはAgentチャット機能を用いて実装するため、CloudFormationを用いた場合はその実装をすることはできません。
また、このアプリケーションのリポジトリを確認すると継続的なアップデートが行われています。そのため、今後新しい機能が実装されることを考えると、CDKを用いて実装した方がより多くの機能を実装できます。
CDKを使う場合の構築手順
CDKを使う場合のデプロイ手順がリポジトリで紹介されています。リポジトリをクローンした後、cdk.jsonの値を変更し、デフォルトではデプロイされないリソースを有効化することで、カスタマイズが可能です。npmコマンドのインストールなどの環境構築が必要なため、CloudFormationよりは手間がかかるというデメリットもあります。
機能一覧
ここでは、CloudFormationを用いてGenUを構築してみる中でできること、できないことについて整理します。
CloudFormationで構築したアプリケーションでできること
- 認証機能
- チャット機能(マルチモーダル)
- チャット履歴保存
- RAG(文書)
- 文章生成
- 要約
- 校正
- 翻訳
- Webコンテンツ抽出
- 画像生成機能
CDKを用いるとできるが、CloudFormationで構築したアプリケーションでできないこと
- Agentチャット(Web検索を用いたRAGチャット)
- UI、ロゴの変更
- ユースケースの追加
- その他、リポジトリに追加されていく新機能の実装
以下のリンクで、Agentチャットについて詳しく紹介されています。検索エージェントに関しては、GenUがデフォルトで用意していますが、自作のエージェントの導入も可能で、Code Interpreter 機能を有効にしたエージェントも紹介されています。
https://catalog.workshops.aws/generative-ai-use-cases-jp/ja-JP/agents-for-amazon-bedrock
- Agentチャット(Web検索を用いたRAG)
![code-interpreter-demo-from-file.png](/images/20250207a/code-interpreter-demo-from-file.png)
▲ Code Interpreter 機能を有効にしたエージェントより引用
- UI、ロゴの変更
- フロントエンドのコードを変更すれば自由に編集可能
- ユースケースの追加
- SQL生成のユースケースを追加
- サイドバーにユースケースとして追加する際にフロントエンドのコードの変更も必要
コスト
RAGチャットを有効化しないときのコストの試算では、月額合計料金:39.63 (USD)となっています。(詳細は以下のリンク)
RAGチャット(Kendra)を有効化するときのコストの試算では、月額合計料金:941.99 (USD)となっています。(詳細は以下のリンク)
RAGチャット(Knowledge Bases)を有効化するときのコストの試算では、月額合計料金:285.69 (USD)となっています。(詳細は以下のリンク)
まとめ
今回はGenUについて、CloudFormationでの構築がどれぐらい簡単に行えるのかに重点を置いて検証を行いました。検証を通して、CloudFormationを用いると数クリックで以下の機能を持つ生成AIチャットアプリケーションが簡単に構築できることがわかりました。
機能一覧
- 認証機能
- チャット機能(マルチモーダル)
- チャット履歴保存
- RAG(文書)
- 文章生成
- 要約
- 校正
- 翻訳
- Webコンテンツ抽出
- 画像生成機能
しかし、 CloudFormationを用いた場合は最新のリポジトリが反映されていないというデメリットがありました。また、今回はCDKを用いた場合の検証は行っていませんが、以下のようなメリット、デメリットがあると考えられます。
CDKを用いた場合のメリット
- 最新のリポジトリが反映されている
- 2024/12/18現在、GenUのリポジトリは日々更新されており、新機能の実装が今後も期待される
CDKを用いた場合のデメリット
- デプロイ手順がCloudFormationよりは手間がかかる
構築してみた感想
今回は生成 AI 体験ワークショップを参考にGenUをCloudFormationを用いて構築しました。数クリックで豊富な機能を持つチャットアプリケーションを構築できたため、非常に便利だと感じました。基本部分がサーバーレスのため、試しやすいということも魅力だと思います。また、Streaming Responseも実装されているため、ChatGPTやClaudeなどの他のチャットアプリケーションと比較しても使いづらさを感じませんでした。実際に複数の企業での活用事例があり、導入することで業務効率化も期待できると思いました。
感想
今回、9か月間SAIG/MLOpsチームでアルバイトをさせていただきました。その間、主にチャットアプリケーションに関する業務を行ってきました。業務を通して、AIだけでなくそれを支えるインフラ技術の重要性について学ぶことができました。また、大学ではあまり触れないクラウドサービスを用いた構築検証など、非常に貴重な体験となりました。アルバイトで取り組む内容に関しても、社員の方々には自分の興味を考慮してタスクを割り当てていただき、楽しく業務に取り組むことができました。大学でAIの研究をしており、その応用に興味のあった自分にとっては非常に学びのある環境で働くことができました。また、技術以外に関しても、リモートで働いていたため、現状や質問したいことなどをうまく言語化する能力も身についたと思います。技術面に加えて、ソフトスキルに関しても非常に学びのある時間を過ごさせていただきました。ありがとうございました。