SPECIALIST

多様な専門性を持つNRIデジタル社員のコラム、インタビューやインサイトをご紹介します。

BACK

AWS CodeCatalystとBedrock Blueprintを活用したRAG機能搭載AIチャットアプリケーションの高速開発

徐 家興

1. はじめに

こんにちは、NRIデジタルの徐です。
生成AIの急速な発展により、多くの企業がAIアプリケーションの開発に注力しています。特に、RAG(Retrieval-Augmented Generation)システムを搭載したAIアプリケーションが注目を集めています。しかし、開発環境の構築には多くの時間がかかるのが課題です。

この課題を解決するため、AWSは2024年3月にAmazon CodeCatalystにBedrock GenAIチャットボットブループリントを導入しました。この新機能により、RAGを含むAIチャットアプリケーションの開発が大幅に簡素化されました。

本記事では、このBedrock Blueprintを活用したRAG機能を備えたAIアプリケーションの迅速な開発方法について解説します。開発環境のセットアップから機能の確認まで、具体的な手順を追いながら紹介していきます。

2. Amazon CodeCatalystとは

Amazon CodeCatalystは、AWSが提供するクラウドベースの統合開発環境で、開発からデプロイまでのプロセスを一元化し、効率的なアプリケーション開発を実現するサービスです。
(公式サイト:Explore | Amazon CodeCatalyst

以下の表で、CodeCatalystの主要機能と従来の開発ツール、および関連するAWSサービスを比較します。

CodeCatalyst機能 従来の開発ツール(一部例) 関連するAWSサービス
Issues Jira, GitHub Issues, GitLab Issues
Code GitHub, GitLab, Bitbucket AWS CodeCommit
Pull requests GitHub Pull Requests, GitLab Merge Requests AWS CodeCommit Pull Requests
Dev Environments Visual Studio Code, IntelliJ IDEA, Eclipse AWS Cloud9
CI/CD Jenkins, GitLab CI, CircleCI AWS CodePipeline, CodeBuild
Reports SonarQube AWS CodeBuild レポート
Packages Artifactory, Nexus Repository AWS CodeArtifact
Blueprints Terraform AWS CloudFormation

3. Amazon Bedrockとは

Amazon Bedrockは、種々の高性能な基盤モデル (FM) を提供し、生成 AI アプリケーションの構築に必要な幅広い機能を備えたフルマネージドサービスです。
(公式サイト:基盤モデルによる生成AIアプリケーションの構築 – Amazon Bedrock – AWS )

4. Bedrock Blueprintとは

Bedrock Blueprintは、Amazon CodeCatalystに組み込まれたテンプレートで、生成AIチャットボットの迅速な構築とデプロイを実現できます。このブループリントを使用することで、CodeCatalyst内でプロジェクトの作成、サンプルソースコードの提供、CI/CDワークフローの設定が簡単に行えます。
アーキテクチャ
(参照先:codecatalyst-blueprints/packages/blueprints/gen-ai-chatbot/README.md at main · aws/codecatalyst-blueprints · GitHub )

5. 実装手順

事前準備

1. AWSアカウントにログインしておきます。
2. オレゴンリージョン※1 →Amazon Bedrock → モデルアクセス → Anthropicの5つモデルとEmbed Multilingualのモデルアクセスをリクエスト※2します。
※1:Claude 3 Opusは米国西部 (オレゴン) us-west-2リージョンでのみ使用できるため。(2024/08/26時点)
※2:Amazon Bedrockを初めて利用する際、使用するモデルごとにAWSに使用リクエストを送信する必要があります。通常、この許可は数営業日以内に承認されます。

CodeCatalystの開発環境セットアップ

1. 統合開発サービス ー Amazon CodeCatalyst-AWS ページの「CodeCatalystの使用を開始する。」をクリックします。(AWSコンソールからCodeCatalystを検索して開いてもよい)
2. 「Sign in with AWS Builder ID」※3をクリックします。AWS Builder IDを登録していない場合は「Create an AWS Builder ID」をクリックして登録してください。
※3:AWSの開発環境には、主に2種類のID体系があります。個人利用や法人利用でも組織的に活用しない場合はBuilder IDを使用します。Builder IDは通常、無償で提供されます。一方、法人で組織的に活用する場合には、IAM Identity Center(SSOのこと)が使用されることが多く、こちらは有償で提供されることが一般的です。
3. 今回は事前に登録しておいたAWS Build IDをログインします。
4. 自分のエイリアスの作成画面に、エイリアスを入力してNextをクリックします。
5. スペースの作成画面に、自分のスペース名を入力して、AWS Regionを選択してNextをクリックします。
6. CodeCatalystと紐づけるAWSアカウントIDを入力して、「Go to the AWS console to verify」をクリックします。
7. AWSコンソール画面に自動的に移動したら、「Verfity space」をクリックして、「Account verified」が表示されたら、AWSアカウント承認済みになります。
8. CodeCatalyst画面に戻り、「CodeCatalyst space verfied with AWS account」ができたら、Nextをクリックしてスペース初期化が完了です。

Bedrock Blueprintプロジェクト作成

1. 右上の「Create Project」をクリックします。
2. Start with a blueprint画面のChoose a blueprint欄で「bedrock」を検索して、「LLM Playground」を選択して、Nextをクリックします。自動的に最新バージョン(検証時点は0.4.9)を利用します。
3. プロジェクト名を記入して、他はデフォルトのままで、「Add IAM role」をクリックすると、自動的にAWSコンソール画面に移動します。
4. 「Crate development role」をクリックします。このIAMロールは、CodeCatalystのCI/CD機能を利用する際に、パイプラインからAWSリソースを操作するために作成されます。デフォルトでAdministrator権限が付与されますが、構築リソースによってIAMコンソール画面で権限を絞ることも可能になります。
5. 上記のIAMロールが作成されたら、CodeCatalystの画面に戻り、「AWS account configured」が表示される場合は、「Create project」をクリックします。
6. プロジェクト画面が表示されたら、今回検証用のプロジェクトの作成は完了です。
7. ソースコードのREADME.mdにコードの詳細説明が記載されているため是非ご覧ください。

自動構築

1. 環境構築用のパイプラインを起動するトリガーはデフォルトに設定されているため、プロジェクト作成もしくはmainブランチにマージされると、自動的に環境構築パイプラインが起動されます。 CI/CD → Workflows 画面に移動し、cdk-workflowは自動的に実行されます。cdk-workflowはBedrock blueprintがデフォルトで用意されています。
AWS環境側では、CloudFormationのスタックが自動的に実行されています。トラブルシューティングの際に、CloudFormationのログを確認してもよいです。
2. 各ステージをクリックして、実行中の進捗とログを確認できます。
3. 約40分間でcdk-workflowのすべてのステージ実行は完了です。
4. CDKDeployActionステージをクリックし、Variables画面のFrontendURLの情報をメモしておきます。WEB画面で動作確認の際に利用されます。
5. WEB画面へアクセスする許可IPをWAFのIP setsに設定しておくのはお勧めです。

WEB画面の動作確認

1. Cognitoコンソールでログインユーザを作成します。
a. Cognitoコンソール → 作成されたユーザープール選択 → 「ユーザを作成」をクリックします。
b. メールアドレス、パスワードを入力して「ユーザーを作成」をクリックします。
c. Cognitoのユーザープール画面に戻り、「グループ」タブのAdminをクリックし、先ほど作成したユーザをAdminグループに追加します。
2. ブラウザでメモされているFrontendURLにアクセスし、ユーザ名とパスワードを入力して「サインイン」をクリックします。
3. WEB画面が表示されます。

6. 主な機能及びユースケースの考査

AIチャット機能

ホームページで好きなモデルを選択し、チャット欄に質問内容を入力すると、ChatGPTのように会話履歴が自動的に保存され、会話を続けることができます。また、ファイルのアップロードも可能です。

RAG機能

「ボットコンソール」から「ボットを新規作成」することで、外部のURLやファイルをナレッジベースとして活用できます。このRAG機能を用いて、以下の二つのユースケースで検証を行いました。

  • 外部ファイル活用の例:社内オフィス情報検索ボット

    社内のオフィス情報を含む外部ファイルを活用し、会社オフィスを自動で提案するボットを作成しました。このボットは、インプットされた会社オフィスの情報(ビル名、住所、最寄り駅からの距離など)に基づき、指定された都市で最寄り駅から最も近いオフィスビルを提案することができます。例えば、「市Aで最寄り駅から最も近いオフィスはどこですか?」といった質問に対して、的確な回答を提供します。検証手順は下記の通りです。以下のダミーデータを利用して、会社オフィスを自動に提案するボットを作成します。

    ○アップロードファイル(会社オフィス情報.txt)の内容
    ○「ボットコンソール」→ 「ボットを新規作成」
    ○ボット名(会社のオフィス情報検索君)を入力、上記のダミーデータをtxtファイル(会社オフィス情報.txt)にして添付し、右下の「新規作成」をクリックします。
    ■推論パラメータなども設定可能ですが、今回の検証はデフォルト値を採用します。
    ○「同期完了」になるまで待ちます。10分以上「同期完了」にならない場合は、オレゴンリージョンのECSタスクの実行状況とコンテナのログを確認してトラブルシューティングを行ってください。(執筆者の検証時には異常は発生しませんでした。)
    ○作成したボットをクリックすると、ボット名が付いているChatアプリ画面が表示されます。
    ○「市Aで最寄り駅から最も近いオフィスはどこですか?」と聞いたら、1回目の回答は間違いましたが、再度提示すると、正確な回答が得られました。参照ボタンをクリックすると、インプットした内容も表示されます。
    ○このボットはアプリケーションユーザー間で共有できます。また、スタンドアロンAPIとしても公開可能です。
  • 外部URL活用の例

    指定した会社のニュースを検索できるボットを作成しました。このボットは、インプットされた会社のニュースURLの内容に基づいて、最新ニュースの内容を正確に回答することができます。さらに、参照したドキュメント情報も表示可能です。

CI/CD機能

CodeCatalystのCI/CD機能を利用して、CodeCatalystのコードを修正すると、CI/CDのワークフロー(cdk-workflow)が実行され、構成や機能の変更が自動的に適用されます。ワークフローを自動でトリガーする条件は、ソースステージのトリガーで設定できます。下記の図では、chatbotリポジトリのmainブランチにプッシュされると、cdk-workflowが自動的に起動されます。

7. Bedrock Blueprintにより実現できる機能及び制約の整理

検証時点のバージョン(0.4.9)を調査しています。

機能の一覧

  • 基本的なチャット機能
    ○認証(サインアップ、サインイン)
    ○会話の作成、保存、削除
    ○チャットボットの返信のコピー
    ○コードのシンタックスハイライト
    ○Markdownのレンダリング
    ○ストリーミング応答
    ○IPアドレス制限(デフォルトでは利用不可)
    ○メッセージの編集と再送信
    ○国際化(I18n)
    ○モデルの切り替え(Claude Instant / Claude)
  • カスタマイズされたボット機能
    ○カスタマイズされたボットの作成
    ○カスタマイズされたボットの共有
  • RAG(Retrieval-Augmented Generation)機能
    ○Web(HTML)
    ○テキストデータ(txt, csv, markdownなど)
    ○PDF
    ○Microsoft Officeファイル(pptx, docx, xlsx)
    ○YouTubeのトランスクリプト
  • 管理機能
    ○ユーザーの使用状況を分析するための管理コンソール
  • 対応言語
    ○切替可能な言語:英語、日本語、韓国語、中国語、フランス語、ドイツ語、スペイン語

制限事項の一覧

  • モデルの制限
    ○Blueprintのコードを改修しない限り、Claude 3系列とEmbed Multilingual以外のモデルは対応できない
  • 外部データソースの制限
    ○現時点では、S3からの直接的なファイル読み込みによる学習機能がサポートされていない
  • カスタマイズの複雑さ
    ○デフォルト設定以外の高度なカスタマイズ(例:AWS CDK、Amazon API Gateway、Amazon Cognitoの設定変更)には、より深いAWS知識が必要となる
  • 特定のAWSサービスへの依存
    ○他のクラウドプロバイダーやオンプレミス環境への移植が困難

8. Bedrock Blueprint環境の拡張・変更時の注意点

アーキテクチャの理解

  • 現状:
    Blueprintは複数のAWSサービスを統合した複雑なアーキテクチャを採用しています。
  • 注意点:
    変更を加える前に、全体のアーキテクチャと各コンポーネントの役割を十分に理解する必要があります。
  • 難しい点:
    サービス間の依存関係が複雑で、一部の変更が予期せぬ影響を及ぼす可能性があります。

Infrastructure as Code (IaC)の扱い

  • 現状:
    環境はAWS CDKを使用して定義されています。
  • 注意点:
    変更はCDKコードを通じて行い、直接AWSコンソールから変更を加えることは避けるべきです。
  • 難しい点:
    CDKの深い理解と、TypeScriptやJavaScriptの知識が必要となります。

パフォーマンスとコストの最適化

  • 現状:
    Blueprintは一般的なユースケースに対して最適化されています。
  • 注意点:
    拡張・変更によってパフォーマンスが低下したりコストが増大したりしないよう注意が必要です。
  • 難しい点:
    パフォーマンスとコストのバランスを取りながら新機能を実装することが求められます。

バージョン管理とドキュメンテーション

  • 現状:
    Blueprintには基本的なドキュメント(README.md)が付属しています。
  • 注意点:
    拡張・変更の内容を適切に文書化し、バージョン管理することが重要です。
  • 難しい点:
    継続的な更新と詳細なドキュメンテーションの維持が求められます。

9. 環境削除

・すべてリソースを削除するためのWorkflows(chatbot-DANGER-hard-delete-deployed-resources)を利用します。
・削除手順
a. Code → .codecatalyst/workflows/DANGER-hard-delete-deployed-resources.yamlファイルを開きます。
b. 5行目以降のコメントアウトを解除します。
このYAMLファイルは、環境を完全に削除するためのワークフローを定義しています。デフォルトでは、5行目以降の実際の削除処理を行う部分が # でコメントアウトされています。
これは、誤って削除ワークフローが実行されることを防ぐための安全機構です。
環境を削除する準備が整った場合にのみ、これらのコメントを解除してください。
c. 修正内容をmainブランチに反映させます。
■mainブランチに反映されると、CI/CDのcdk-workflowが自動的に実行されるため、cdk-workflowを停止しておく必要があります。
d. CI/CD → WorkFlows → DANGER-hard-delete-deployed-resources → Actions → runを実行します。
e. すべてのステージが成功するまで待ちます。
f. 執筆者は実行時に、「Waiter StackDeleteComplete failed: Waiter encountered a terminal failure state: For expression “Stacks[].StackStatus”」というエラーが発生しました。具体的な原因は特定できませんが、AWS CloudFormationのコンソール画面には「The following resource(s) failed to delete: [AuthCognitoTrigger*, DdbBucketLogs**]」というエラーが表示されました。
■エラースクリーンショット
■原因・対策調査
  •  エラー原因
    ○削除に失敗しているCustomResourceは、という論理リソース、実態は”CognitoTriggerRegistrationFunctionaxxxxxx….”という名前のLambda関数に関連しています。この関数は、削除時にCloudFormationにレスポンスを返す必要がありますが、USER_POOLが既に削除されているため、エラーが発生しています。
    ○問題のコード箇所:当該Lambda関数は、cdk/custom-resources/cognito-trigger/index.pyリポジトリに実態のリソースがあります。具体的には、Step49より57の以下の箇所に記載があります。
    ----
        elif request_type == 'Delete':
            response = cognito.describe_user_pool(UserPoolId=USER_POOL_ID)
            attr = response['UserPool']
            lambda_config = attr.get('LambdaConfig', {})
    
            update_user_pool_lambda_config(USER_POOL_ID, attr, lambda_config={
                k: v for k, v in lambda_config.items() if k not in triggers.keys()
            })
            cfnresponse.send(event, context, cfnresponse.SUCCESS, None, physical_resource_id)
    ----
        
  •  現在の削除プロセス
    ○.codecatalyst/workflows/DANGER-hard-delete-deployed-resources.yamlの32行目でUSER_POOLを削除します。
    - Run: for USER_POOL in $USER_POOLS; do aws cognito-idp describe-user-pool --user-pool-id $USER_POOL --region $region > /dev/null 2>&1 && aws cognito-idp delete-user-pool --user-pool-id $USER_POOL --region $region || true; done
        
    ○その後、35行目でCloudFormationのリソースを削除します。
     - Run: aws cloudformation wait stack-delete-complete --stack-name $stack_name --region $region
        
■解決策
  •  AWSサポートへの問い合わせ結果
    ○根本的な解決は、将来のバージョンアップで修正される可能性があるとのことです。
    ○このエラーが発生する場合は、下記の二つの方法をお試しください。(2024/08/26時点)
  •  暫定方法①
    ○前述のUSER_POOL削除処理(32行目)を、以下の処理の後、40行目付近に移動してください。
  •  暫定方法②
    ○上記方法①を試しても同様のエラーが発生する場合は、以下のリソースを手動で削除し、再度「DANGER-hard-delete-deployed-resources」を実行します。
    ◆S3コンソールで「ddbbucketlogsb」を検索し、対象バケットを「空にする」にします。
    ◆Lambda関数画面で「CognitoTriggerRegistrati」を検索し、対象関数を削除します。
    ◆CloudWatchロググループで「CognitoTriggerRegistrati」を検索し、対象を削除します。

まとめ

AWS CodeCatalystとBedrock Blueprintを活用することで、RAG機能を持つAIチャットアプリケーションの迅速な開発が可能となります。この統合プラットフォームを使用することで、開発、デプロイ、管理を効率的に一元化し、プロジェクトの作成からデプロイ完了までを1時間以内に実現できます。

このBlueprintは、カスタマーサポートの自動化や社内情報検索システムの構築など、具体的なビジネスシナリオでの活用が期待されます。これにより、企業は迅速にAI技術を導入し、業務効率化やサービス品質の向上を図ることができます。

現時点では、Bedrock BlueprintのRAG機能はS3からの外部ファイル読み込みによる学習をサポートしていませんが、今後のアップデートでこの機能が追加されることが期待されています。