0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Slack経由でRAGにコードレビューを依頼するBotを作成 〜 AWS SAM編

Last updated at Posted at 2024-05-07

はじめに

前回の記事では、リーダブルコードの原則に従ったコードレビューを自動化できないものか・・と考えた結果、『RAGにリーダブルコードの原則を取り込ませてコードレビューをしてもらおう!!』という検証をしてみました。

デモ動画.gif

検証環境の構築は AWSマネジメントコンソール を使用していましたが、今回は AWS SAM を使用して、より簡単に環境構築する方法の解説を行います。

使用するリポジトリは以下になります。

事前準備

リージョン切り替え

全ての手順は「東京リージョン」で実施することを前提としているため、AWSのマネジメントコンソールからリージョンを「東京」に変更してから手順を進めてください。

RAG構築_1

Cloud9

ローカルマシンの環境を汚さないために、Cloud9 を使用して環境構築を行います。Cloud9 には、今回の作業に必要な以下のツールが事前にインストールされているため、環境構築がスムーズに行えます。

  • AWS CLI
  • AWS SAM CLI
  • Docker

Cloud9環境の作成

Cloud9コンソールにアクセスして、「環境を作成」をクリックします。

Cloud9環境を構築する_1

名前は sam-deploy として、「新しいEC2インスタンス」を選択します。

Cloud9環境を構築する_2

インスタンスタイプは t2.micro を選択し、プラットフォームは「Amazon Linux 2023」を選択します。

Cloud9環境を構築する_3

「作成」をクリックします。

Cloud9環境を構築する_4

作成した環境を選択し「Cloud9 で開く」を選択すると、Cloud9のコンソールが開きます。本手順でコマンドを実行する際は、Cloud9のコンソールで実行してください。

Cloud9環境を構築する_5

Pythonのインストール

Cloud9では「Python3.9」がデフォルトでインストールされていますが、デプロイするLambdaのランタイムは「Python3.10」にしているため、Cloud9で以下のコマンドを実行して「Python3.10」をインストールして使用できるようにします。

# 必要な開発ツールをインストール
sudo yum -y install bzip2-devel xz-devel

# pyenv を clone して設定
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# .bashrc の変更を適用
source ~/.bashrc

# Python 3.10.14 をインストールして現環境に設定
pyenv install 3.10.14
pyenv global 3.10.14

# python 3.10 の pip が使用されていることを確認
pip --version
# pip 23.0.1 from /home/ec2-user/.pyenv/versions/3.10.14/lib/python3.10/site-packages/pip (python 3.10)

IAMロールの設定

Cloud9ではAMTC(AWS managed temporary credentials)がデフォルトで有効になっており、AMTCで付与された一時クレデンシャルの権限では IAMロールやIAMポリシーに対するアクセス権限が制限されている ため、デプロイ時にエラーが発生してしまいます。

そのため、Cloud9インスタンスのIAMロールに「AdministratorAccess」ポリシーを追加でアタッチすることで、IAMロールやIAMポリシーに対するアクセス権限を付与することにします。

  1. Cloud9画面の右上にある「歯車アイコン」をクリックし、「AWS Settings」の「Credentials」から、「AWS managed temporary credentials」を無効にします。

    Cloud9環境を構築する_6
  2. EC2コンソールに移動して、Cloud9のインスタンスに紐づくIAMロールを選択します。

    「aws-cloud9-sam-deploy〜」という名前のインスタンスがあるので、そのインスタンスを選択し、「セキュリティ」から「IAMロール」を選択します。

    Cloud9環境を構築する_7
  3. IAMロールにポリシーをアタッチします。

    「許可の追加」から「ポリシーをアタッチ」を選択します。

    Cloud9環境を構築する_8

    「AdministratorAccess」ポリシーにチェックを入れて、「許可を追加」をクリックします。

    Cloud9環境を構築する_9

Bedrock

モデルアクセスの有効化

東京リージョンでBedrockを使用するために、モデルアクセスを有効化します。

  1. Bedrockコンソールに移動して「モデルアクセス」を選択します。

    モデルアクセスの有効化_1
  2. Anthropic社のモデルを使用するには「ユースケースの詳細」を提出する必要があるため、「ユースケースの詳細」をクリックします。

    モデルアクセスの有効化_2
  3. ユースケースの詳細を入力して、「送信」をクリックします

    モデルアクセスの有効化_3
  4. 「モデルアクセスを管理」をクリックします

    モデルアクセスの有効化_4
  5. 「Claude」にチェックを入れて、「モデルアクセスをリクエスト」をクリックします。

    モデルアクセスの有効化_5
  6. アクセスが付与されたことを確認します。

    モデルアクセスの有効化_6

Slack

ワークスペースの作成

既存のワークスペースを使用するか、新規でワークスペースを作成してください。
私は RAG というワークスペースを作成しています。

アプリを作成する

  1. Slack API にアクセスして、「Your apps」をクリックします。

    アプリを作成する_1
  2. アプリを作成する

    「Create an App」をクリックします。

    アプリを作成する_2

    「From scratch」を選択する

    アプリを作成する_3

    App Name(アプリ名)は Reviewer と入力し、作成したワークスペースを選択し、「Create App」をクリックします。

    アプリを作成する_4
  3. アプリのBot権限を追加する

    OAuth & Permissions を選択します。

    アプリを作成する_5

    Scopes の 「Add an OAuth Scope」をクリックします。

    アプリを作成する_6

    メンションメッセージを読み取り、レスポンスを返すための権限を追加する

    • app_mentions:read
    • channels:read
    • chat:write
    アプリを作成する_7
  4. ワークスペースにアプリをインストールする

    OAuth & Permissions の OAuth Tokens for Your Workspace にある Install to Workspace をクリックします。

    アプリを作成する_8

    許可するをクリックします。

    アプリを作成する_9

デプロイ

Cloud9で作業するため、Cloud9コンソールにアクセスして、作成した環境を開きます。

プロジェクトのクローン

  1. リポジトリをクローンする

    git clone https://github.com/sakes9/sam-slack-review-rag.git
    
  2. リポジトリに移動する

    cd sam-slack-review-rag
    

環境変数を設定する

Slackの「Bot User OAuth Token」と「Signing Secret」の値を template.yamlEnvironment に設定します。

  1. OAuth & Permissions にある Bot User OAuth Token をメモしておきます。

    環境変数を設定する_1
  2. Basic Information にある Signing Secret をメモしておきます。

    環境変数を設定する_2 環境変数を設定する_3
  3. template.yaml の以下の環境変数にSlackの「Bot User OAuth Token」と「Signing Secret」の値を設定して保存します。

    環境変数を設定する_4
    環境変数
    SLACK_BOT_TOKEN {Bot User OAuth Token の値}
    SLACK_SIGNING_SECRET {Signing Secret の値}
    ReviewReadableCodeFunction:
        Type: AWS::Serverless::Function
        Properties:
        FunctionName: "review-readable-code-function"
        ・・・
        Environment:
            Variables:
            ・・・
            SLACK_BOT_TOKEN: "xoxb-XXXXXXXXXXXXX" # Slack Bot Token
            SLACK_SIGNING_SECRET: "XXXXXXXXXXXXX" # Slack Signing Secret
        ・・・
    

ビルド〜デプロイ

  1. ビルドします

    sam build
    
  2. デプロイします

    S3バケット名はリージョン内で一意である必要があるため、データソース格納バケット名は DataSourceBucketName パラメータに 一意の名前 を指定してデプロイする。

    sam deploy --region ap-northeast-1 \
        --parameter-overrides DataSourceBucketName="readable-code-data-source-{ランダムな文字列}"
    

Kendraのデータソースを同期します

  1. data-sourceフォルダ内のPDFファイルをS3にアップロードします。

    Cloud9で以下のコマンドを実行し、データソース格納バケットにPDFファイルをアップロードします。

    aws s3 cp data-source/[第Ⅰ部][2章]表面上の改善_名前に情報を詰め込む.pdf s3://{データソース格納バケット名}
    
  2. Kendraのデータソースを同期する

    1. Kendraコンソールで readable-code-index インデックスを選択します。

    2. データソースから readable-code-data-source を選択します。

    3. 「Sync now」をクリックして、データソースを同期します。

      データソースの作成_1

      同期完了まで時間がかかるため、しばらく待ちます。

      データソースの作成_2

      同期が完了しました。

      データソースの作成_3

メンション時のイベントを設定する

  1. Slack API から「Event Subscriptions」を選択して、Enable Events を ON にします。

    メンション時のイベントを設定する_1
  2. Lambdaの関数URLをコピーします。

    メンション時のイベントを設定する_2
  3. Request URL にコピーした関数URLを貼り付けます。

    一度目の検証で失敗するが、Retryしたら2回目で成功する(理由はわからない)

    メンション時のイベントを設定する_3

    検証に成功すると Verified にチェックがつきます。

    メンション時のイベントを設定する_4
  4. 「Subscribe to bot events」の Add Bot User Event をクリックします。

    メンション時のイベントを設定する_5
  5. 「app_mention」を追加します。

    メンション時のイベントを設定する_6
  6. 「Save Changes」をクリックします。

    メンション時のイベントを設定する_7

動作検証

コードレビューの提出

  1. Slack にアクセスします

  2. Slack App をインストールしたワークスペースを開きます

  3. チャンネルを作成します
    私は review というプライベートチャンネルを作成しました。

    動作検証_1
  4. Slack Appを招待します

    @Reviewer をメンションして、Slack App を招待します。

    動作検証_2

    「招待する」をクリックします。

    動作検証_3

    Slack App がチャンネルに招待されました。

    動作検証_4

    招待時の初回メッセージに対するレスポンスは無視してください。

    動作検証_5
  5. レビュー依頼を出します

    @Reviewer をメンションして、コードをレビューしてもらうために、以下のメッセージを送信すると、レビューが開始されます。

    @Reviewer
    for (var i = 0; i < clubs.length; i++) {
        for (var j = 0; j < clubs[i].members.length; j++) {
            for (var k = 0; k < clubs[i].members[j].users.length; k++) {
                if (clubs[i].members[j].users[k].id === userId) {
                    console.log(`${clubs[i].members[j].users[k].name} が所属しているクラブは ${clubs[i].name}`);
                }
            }
        }
    }
    
    動作検証_6
  6. レビュー結果が返却されます

    動作検証_7 動作検証_8

スタック削除

注意
動作検証後は、必ずリソースの削除を行ってください。
リソースが残っていると課金が発生します。
特にKendraは高額な課金が発生するため、削除を忘れないようにしてください。

スタックを削除することで、スタックに関連するリソースが削除されます。
以下の手順を実行してスタックを削除します。

  1. S3バケットの中身を空にする

    S3バケットはオブジェクトが存在すると削除できないため、以下のコマンドを実行してスタック削除前にバケットの中身を空にしておく。

    aws s3 rm s3://{データソース格納バケット名} --recursive
    
  2. スタック削除

    以下のコマンドを実行することで、デプロイしたスタックを削除できます。

    sam delete --region ap-northeast-1
    
  3. Cloud9環境の削除

    Cloud9コンソールにアクセスして、作成したCloud9環境とIAMロール(AWSCloud9SSMAccessRole)を削除します。

まとめ

AWS SAM を使用して、Slack経由でコードレビューを依頼するRAG環境を構築する方法について解説しました。前回の記事ではAWSマネジメントコンソールから環境を構築していましたが、手動作業には ヒューマンエラーのリスク が伴い、またAWSリソースが テンプレート化されていない(コード化されていない) ため、作成した環境の 再現性が低くなる といったデメリットがあります。
AWS SAM を利用することで、サーバーレスアプリケーションの構築が簡単になり、異なる環境への迅速なデプロイが可能になります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?