LoginSignup
1
4

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

Last updated at Posted at 2024-05-06

はじめに

プログラミングを書き始めた頃は独りよがりなコードを書いていました。当然「可読性の高いコード」とは遥かに遠いコードを書いていました。
ただ、チームプロジェクトに飛び込んだ瞬間、状況は一変し自分のコードが他人の目に触れる現実と、読みづらいコードに悶絶する日々。この経験は誰しもがあるのではないかと思います。

では、可読性の高いコードを書くにはどうすれば良いのか?
を考え始めた時に出会ったのが リーダブルコード でした。
リーダブルコードは、コードを読みやすくするための原則を提唱しています。

この原則を守り、プロジェクト全体で共有することで、コードの可読性を向上させることができます。

が、現実はそう甘くありません。規約が完璧に反映されているコードレビューが実施されないプロジェクトも多いでしょう。
政治的な問題納期の関係 もあり、一度実装されたコードの変更が難しいこともあります。

そこで、今回は「リーダブルコード」の原則を準拠したコードレビューをRAGによって自動化するツールを作成してみることにしました。

作ってみたもの

Slack経由でRAGにコードレビューをしてもらいます。
@Reviewer とメンションすることで、コードレビューを依頼することができます。

デモ動画.gif

構成図

構成図

リーダブルコードとは

RAGの環境構築に入る前に、リーダブルコードについて軽く概要を紹介したいと思います。

リーダブルコード、それはまさにその名の通り「読みやすいコード」を意味します。しかし、ここで言う「読みやすい」とは単に面白いわけではなく、基本を守りつつ他の人にも理解しやすいコードを指します。このアプローチの根底にあるのは、「コードは理解しやすくなければならない」という原則になります。

では、「理解しやすいコード」とはどんな特徴を持つのでしょうか?

  1. 変更が容易:他の人、または未来のあなたが見たときに、「これは何だったんだろう?」と頭を抱えることなく、簡単に修正や改善ができる。
  2. 可読性が高い:バグが潜んでいても見つけやすい。清潔で整理された部屋で物を探すようなイメージ。

このようなコードを書くことは、チームにとってのみならず、未来のあなた自身にとっても大きな恩恵をもたらします。継続的に改善し、磨きをかけることで、コードは時を経てもその価値を保ち続けます。

と、私の解釈を交えつつ説明してみました。

コードレビューについて

リーダブルコードの原則の数々の中から、今回は「第Ⅰ部 表面上の改善 第2章 名前に情報を詰め込む」に焦点を当ててコードレビューをしてもらおうと思います。
この章では、変数名がいかに重要であるか、そしてそれにどのように情報を詰め込むかが解説されています。

以下にこの章の原則をまとめたPDFファイルを作成しましたので、これをデータソースとして使用します。

[第Ⅰ部][2章]表面上の改善_名前に情報を詰め込む.pdf

この原則を実践するには、変数名が適切な情報を含んでいるかを確認することが重要です。
そのための方法として、ペアプログラミング人によるコードレビュー が挙げられますが、
これらは知識の共有を促し、プロジェクトにおける属人化を防ぎますが、人の目によるチェックには限界 があります。

そこで登場するのが、静的解析ツールの活用です。
特にJavaScriptで人気のある ESLint は、カスタムルールを設定することで、変数名の命名規約や長さをチェックするのに役立ちます。
しかし、変数名の内容自体の精査には限界 があるため、さらに進んだ技術が求められます。

これらの問題を解決するために、AIを利用したコードレビュー が注目されています。
Code Rabbit のようなコードレビューAIを導入することで、従来の人力レビューの限界を超え、コーディング規約に基づく自動的なチェックが可能になります。
そして RAG(Retrieval-Augmented Generation) を活用すれば、リーダブルコードの原則をデータソースとして取り込み、より精密なレビューを実施することができそうです。

RAGにコーディング規約を読み込ませ、原則に違反があるかどうかをAIがチェックし、その結果をさらにLLM(大規模言語モデル)が分析する。
この一連の流れを 「Slack経由でRAGにコードレビューを依頼してみよう」 と思い実装してみました。

RAG構築

では、実際にRAGを構築していきます。

「AWS SAM」でRAGを構築するために以下のリポジトリを作成しましたが、今回は AWSマネジメントコンソールから手動で構築 する手順を説明します。

「AWS SAM」での構築方法については、以下の記事で説明しています。

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

alt text

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

S3

Kendraのデータソースとして使用するS3バケットを作成します。

S3バケットを作成する

  1. S3コンソールに移動して「バケットを作成」をクリックします。

    バケットの作成_01
  2. バケット名を入力します。

    バケット名はリージョン内で一意である必要があるため、 data-source-bucket-{ランダムな文字列} という形式でバケット名を入力しています。

    バケットの作成_02
  3. その他の項目はデフォルトのまま「バケットを作成」をクリックします。

    バケットの作成_03

S3バケットにファイルをアップロードする

  1. 以下のリンクからPDFファイルをダウンロードします。

    [第Ⅰ部][2章]表面上の改善_名前に情報を詰め込む.pdf

    ダウンロードアイコンをクリックしてPDFファイルをダウンロードします。

    ファイルのアップロード_1
  2. 作成したバケットを選択します。

    ファイルのアップロード_2
  3. 「アップロード」をクリックします。

    ファイルのアップロード_3
  4. PDFファイルを画面にドラッグ&ドロップして、アップロード対象のファイルに追加します。

    ファイルのアップロード_4
  5. 「アップロード」をクリックします。

    ファイルのアップロード_5
  6. アップロードが完了したら、「閉じる」をクリックします。

    ファイルのアップロード_6

Amazon Kendra

RAGの検索エンジンとして使用するKendraを作成します。
Kendraを使用するには「インデックス」と「データソース」を作成する必要があります。

インデックスの作成

  1. Kendraコンソールに移動します。

  2. 「Create an index(インデックスの作成)」をクリックします。

    インデックスの作成_1
  3. Index name(インデックス名)を入力します。

    インデックス名は readable-code-index と入力します。

    インデックスの作成_2
  4. IAM role(IAMロール)を選択します。
    IAMロールは推奨設定で新規作成するため「Create a new role(Recommended)」を選択します。
    IAMロール名は AmazonKendra-ap-northeast-1-readable-code-index-role と入力し、「Next」をクリックします。

    インデックスの作成_3
  5. アクセスコントロールの設定はデフォルトのまま「Next」をクリックします。

    インデックスの作成_4
  6. エディションは「Developer edition」を選択して、「Next」をクリックします。

    インデックスの作成_5
  7. 確認画面で「Create」をクリックして、インデックスを作成します。

    インデックスの作成_6

    30秒後に自動でKendraのホーム画面に戻ります。

    インデックスの作成_7

    インデックスの作成には最大30分かかるため、しばらく待ちます。

    インデックスの作成_8

    作成が完了すると、インデックスが Active になります。

    インデックスの作成_9

データソースの作成

  1. 作成したインデックスを選択し、「Add data source(データソースの追加)」をクリックします。

    データソースの作成_1
  2. Amazon S3 connector の「Add connector」をクリックします。

    データソースの作成_2
  3. Data source name(データソース名)を入力します。

    データソース名には readable-code-data-source と入力します。

    データソースの作成_3
  4. ドキュメントのデフォルト言語は「Japanese(ja)」を選択します。

    データソースの作成_4
  5. IAMロールを選択します。

    IAMロールは推奨設定で新規作成するため「Create a new role(Recommended)」を選択します。
    IAMロール名は AmazonKendra-readable-code-data-source-role と入力し、「Next」をクリックします。

    データソースの作成_5
  6. 同期するデータソースの設定を行います。

    Browse S3 からデータソース用に作成したS3バケットを選択します。

    データソースの作成_6
  7. 手動でデータソースの同期を行うため、Frequency(頻度)は「On demand」を選択します。

    データソースの作成_7
  8. Set field mappings - optional はデフォルトのまま「Next」をクリックします。

    データソースの作成_8 データソースの作成_9
  9. Review and create で「Add data source」をクリックします。

    データソースの作成_10 データソースの作成_11

    30秒後に自動でKendraのホーム画面に戻ります。

    データソースの作成_12

    データソースの作成に成功しました。

    データソースの作成_13
  10. データソースを同期するために、「Sync now」をクリックします。

    データソースの作成_14

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

    データソースの作成_15

    同期が完了しました。

    データソースの作成_16

Bedrock

RAGのLLMとして、東京リージョンのBedrockにあるAnthropic社の Claude を使用します。BedrockのLLMを使用するには モデルアクセスを有効化 する必要があります。
現在、東京リージョンで利用可能なClaudeのバージョンはv2.1となっています。

モデルアクセスの有効化

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

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

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

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

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

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

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

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

Lambda

Slack経由でRAGにコードレビューを依頼するLambda関数を作成します。

IAMロールを作成する

  1. IAMコンソールに移動して「ロールの作成」をクリックします。

    IAMロールを作成する_1
  2. エンティティは「AWSのサービス」を選択します。

    IAMロールを作成する_2
  3. ユースケースは「Lambda」を選択します。

    IAMロールを作成する_3
  4. 許可を追加します。

    追加するポリシーは以下の通りです。

    • BedrockFullAccess: Bedrockの全ての機能にアクセスするためのポリシー
    • AmazonKendraFullAccess: Amazon Kendraの全ての機能にアクセスするためのポリシー
    • LambdaBasicExecutionRole: Lambda関数を実行するためのポリシー
  5. ロール名を入力します。

    ロール名は review-readable-code-function-role と入力します。

    IAMロールを作成する_4
  6. 「ロールの作成」をクリックします。

    IAMロールを作成する_5

Lambda関数を作成する

  1. Lambdaコンソールに移動して「関数の作成」をクリックします。

    Lambda関数を作成する_1
  2. 関数の基本的な情報を入力します。

    • 関数名: review-readable-code-function
    • ランタイム: Python 3.10
    • アーキテクチャ: x86_64
    Lambda関数を作成する_2

    先ほど作成したIAMロールを選択します。

    Lambda関数を作成する_3
  3. 関数URLを有効化します。

    • 関数 URL を有効化: チェックを入れる
    • 認証タイプ: NONE
    Lambda関数を作成する_4
  4. 「関数の作成」をクリックします。

    Lambda関数を作成する_5
  5. タイムアウトを変更する

    デフォルトのタイムアウトは「3秒」となっており、処理完了までの時間が足りないため、タイムアウトを「3分」に変更します。

    設定 → 一般設定 の「編集」をクリックします。

    Lambda関数を作成する_6

    タイムアウトを「3分」に変更し、「保存」をクリックします。

    Lambda関数を作成する_7

レイヤーを作成する

Lambda関数からLangChainなどのライブラリを使用するには、レイヤーを作成してライブラリを追加する必要があります。

以下の記事を参考にして、使用するライブラリをレイヤー化してLambda関数に追加する手順を説明します。

レイヤーにライブラリをアップロードするには、ライブラリをまとめたZipファイルを「直接レイヤーにアップロード」するか、または「S3バケットを介してアップロード」する必要があります。

直接アップロード」する場合、ファイルサイズは「50MB以下」でなければなりません。今回のライブラリが50MBを超えているため、「S3バケットを介してアップロード」する方法を選択します。

Zipファイルの作成環境によっては、Lambdaでレイヤーを使用する際にエラーが発生することがあるため、環境起因のエラーを防ぐ目的で Cloud9環境 でZipファイルを作成します。

  1. ライブラリをまとめたZipファイルを置くためのS3バケットを作成する

    S3コンソールにアクセスして、「バケットを作成」をクリックします。

    レイヤーを作成する_1

    バケット名は lambda-layer-modules-{ランダムな文字列} と入力します。

    レイヤーを作成する_2

    その他の項目はデフォルトのまま「バケットを作成」をクリックします。

    レイヤーを作成する_3
  2. Cloud9環境を構築する

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

    レイヤーを作成する_4

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

    レイヤーを作成する_5

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

    レイヤーを作成する_6

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

    レイヤーを作成する_7
  3. Zipファイルを作成する

    作成した環境を選択し、「Cloud9 で開く」を選択します。

    レイヤーを作成する_8

    Cloud9のターミナルにて、以下のコマンドを実行して pip を使えるようにします。

    # ライブラリを保管するディレクトリを作成
    mkdir tmp-python
    cd tmp-python
    
    # zip 化に必要なツールをインストール
    sudo yum -y install bzip2-devel xz-devel
    
    # pyenv を clone
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    
    # pyenv の PATH を通す
    vi ~/.bashrc
    
    # vi でファイルが開かれるので、 I key で INSERT mode に変更。以下を追記する
    export PATH="$HOME/.pyenv/bin:$PATH"
    eval "$(pyenv init -)"
    # 完了したら、ESC key で INSERT mode を終了
    # :wq! で保存して終了
    
    # .bashrc の変更を現在のターミナルに適用する
    source ~/.bashrc
    
    # Python 3.10.14 を Install
    pyenv install 3.10.14
    
    # pyenv で現環境に設定
    pyenv global 3.10.14
    python -V
    

    以下のコマンドを実行して、ライブラリをインストールします。

    pip install --upgrade pip
    mkdir python
    pip install langchain==0.1.16 langchain-community==0.0.36 langchain_aws==0.1.2 slack_bolt==1.18.1 -t ./python
    

    以下のコマンドを実行して、Zipファイルを作成します。

    zip -r python.zip python/
    

    以下のコマンドを実行して、先ほど作成したS3バケットにZipファイルをアップロードします。

    aws s3 cp python.zip s3://{バケット名}
    

    注意
    アップロードが完了したら、Cloud9は削除します。
    リソースが残っていると課金が発生します。
    :

  4. レイヤーを作成する

    Lambdaコンソールに移動し、レイヤーから「レイヤーの作成」をクリックする。

    レイヤーを作成する_9

    レイヤーの名前は Layers を入力する。

    レイヤーを作成する_10

    「Amazon S3 からファイルをアップロードする」を選択します。

    レイヤーを作成する_11_1

    S3バケットからアップロードしたZipファイルを選択し、「URLをコピー」をクリックします。

    レイヤーを作成する_11_2

    「Amazon S3 からファイルをアップロードする」にコピーしたURLを貼り付けます。

    レイヤーを作成する_11_3

    アーキテクチャは「x86_64」を選択し、ランタイムは「Python 3.10」を選択します。

    レイヤーを作成する_12

    「作成」をクリックすると、レイヤーが作成されます。

    レイヤーを作成する_13

    レイヤーが作成されました。

    レイヤーを作成する_14

コードを実装する

  1. 関数にレイヤーを関連付けます

    Lambdaコンソールに移動し、作成したLambda関数の「レイヤー」から「レイヤーの追加」をクリックします。

    コードを実装する_1

    「カスタムレイヤー」を選択し、作成したレイヤーを選択して、「追加」をクリックします。

    コードを実装する_2
  2. 以下のコードをコピペして、Lambda関数に貼り付けて、「Deploy」をクリックします。

    https://github.com/sakes9/sam-slack-review-rag/blob/main/src/app.py

    コードを実装する_3
  3. 環境変数を設定します。

    Kendraコンソールに移動し、作成したインデックスのIDをコピーします。

    コードを実装する_4

    Lambdaコンソールに戻り、環境変数の「編集」をクリックします。

    コードを実装する_5

    「環境変数の追加」をクリックします。

    コードを実装する_6

    環境変数を追加して、「保存」をクリックします。

    キー
    KENDRA_INDEX_ID {KendraのインデックスID}
    コードを実装する_7

Slack

Slack経由でRAGにコードレビューを依頼するために、Slackアプリを作成します。

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

Lambda環境変数にSlackアプリの情報を設定

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

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

    環境変数にSlackのトークンを設定_2 環境変数にSlackのトークンを設定_3
  3. Lambdaの環境変数に以下のキーと値を設定します。

    キー
    SLACK_BOT_TOKEN {Bot User OAuth Token}
    SLACK_SIGNING_SECRET {Signing Secret}
    環境変数にSlackのトークンを設定_4

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

  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は高額な課金が発生するため、削除を忘れないようにしてください。

まとめ

RAGを活用してSlack経由でコードレビューを依頼する方法を以前紹介しました。

今回の検証では期待通りの結果が得られたり、期待している結果とは少しズレた回答が得られたり、コードレビューの精度としてはまだまだ改善がありそうな感想です。おそらっく使用しているデータソースの質が十分でないことが原因だと思うので、実用的に使いたい場合は、データソースをさらに充実させることで、より高精度な結果が期待できると思います。

次回は、AWS SAMを使用してRAG環境を構築する手順についてご紹介したいと思います。

参考資料

1
4
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
1
4