見出し画像

生成 AI (Azure OpenAI Service × Genie AI × PR-Agent) をセキュアに利用してコーディングやレビューを支援する

はじめに

こんにちは、NRIデジタルの倉澤です。
普段は NRI デジタル公式ホームページの TECH BLOG で React をはじめとしたモダンフロントエンド領域の技術記事を執筆することが多いのですが、本日は note の TECH BLOG 出張所にて生成 AI のコラムを投稿したいと思います。

生成 AI が世に登場してから様々なシーンでの利活用が進んでいると思います。私も生成 AI にはいつもお世話になっています。現在進行系で AI コーディングや AI レビューを実プロジェクトへどのように導入しているのか、実体験を交えて生成 AI を使ったコーディングとレビュー方法を説明していきたいと思います。

Azure OpenAI Service で GPT-4 モデルをオプトアウトして使う

生成 AI は OpenAI 社の Chat GPT が有名ですね。OpenAI 社は GPT モデルの API も提供しておりチャット UI だけじゃなくシステムから生成 AI を利用することが出来ます。Microsoft 社の Azure OpenAI Service は、GPT-4o、GPT-4 Turbo with Vision、GPT-4、GPT-3.5-Turbo、Embeddings モデル シリーズなど、OpenAI の強力な言語モデルへの REST API アクセスを提供しています。

オプトアウト

生成 AI は多くの方が利用していると思いますので、その便利さを実感されているかと思います。生成 AI はとても便利ですよね、実際に便利です。ただし注意点もあります。生成 AI のサービスによっては入力した情報を生成 AI の学習に使うことがあります。その結果、思わぬ情報漏洩リスクに繋がることもあります。

AI コーディングや AI レビューをする際にはオプトアウト機能が用意されている生成 AI サービスを利用頂くことをおすすめします。オプトアウトに関しては NRI セキュアテクノロジーズの「生成AIのリスクを整理する|3つの観点でリスクと対策を解説」の記事をご参照ください。

生成AIの学習およびログ保存のリスク管理については、入力データを学習に用いないサービスを利用する、または、学習機能を無効にする設定で利用するという方法があります。ログの保存についても、オプトアウト機能を活用して保存を防ぐことも可能です。

ただし、全てのサービス提供者がオプトアウト機能を用意しているわけではないこと、また提供されていた場合でもオプトアウトを許可する条件が必要な場合もあるため、注意が必要です。

(出典)生成AIのリスクを整理する|3つの観点でリスクと対策を解説

Azure OpenAI Service ではオプトアウトを設定できます。OpenAI と同じ GPT のモデルを実行しながらも Microsoft Azure のセキュリティ機能を利用できるという点が良い点かと思います。詳細はData, privacy, and security for Azure OpenAI Service - Azure AI services をご確認ください。

さて、ここからは AI コーディングと AI レビューのツールについて解説します。

AI コーディングとは

AIコーディングとは、人工知能(AI)を利用してプログラムのコードを生成、補助、最適化する技術のことを指します。例えば以下のような活用方法があります。

  1. コード生成:

    • 自然言語の入力(例えば、「Pythonでリストをソートするコードを書いて」)に基づいてコードを生成します。AIはユーザーの要求に応じて適切なプログラムコードを生成します。

  2. コード補助:

    • コードの補完やエラーチェックを行い、開発者の作業を支援します。たとえば、IDE(統合開発環境)でのコード補完機能や、リアルタイムでのエラーチェックが含まれます。

  3. コード最適化:

    • 既存のコードを解析し、パフォーマンスや効率性を向上させるための提案や修正を行います。

  4. 自動テスト生成:

    • テストケースの生成や、テストの自動実行を支援します。これにより、ソフトウェアの品質を向上させることができます。

  5. ドキュメント生成:

    • コードのコメントやドキュメントを自動生成する機能もあります。これにより、コードの可読性とメンテナンス性が向上します。

Genie AI × Azure OpenAI Service (GPT-4)

AI コーディングツールは雨後の筍のように登場しています。NRIデジタルの社員が note でいくつかのツールの比較記事を書いているのでこちらもあわせてご覧ください。今回ご紹介するのは Genie AI です。

Genie AI は AI コーディングをサポートする VSCode のプラグインです。Azure OpenAI Service (GPT-4) とつなぐことが出来ます。GitHub Copilot や Amazon Q のように VSCode 上で生成 AI と対話しながら開発できます。Genie AI で何ができるのかを Genie に聞いてみました。

(出典)Genie AI

コーディング支援: あなたが遭遇する任意のプログラミング問題について解決策を提供します。これにはエラーのデバッグ、新しい関数の作成、最適なコーディング慣習の提案などが含まれます。
コードレビュー: コードの質を評価し、改善のための提案を行うことも可能です。これには読みやすさ、効率性、モジュール性などが考慮されます。
学習支援: 特定のプログラミング言語や技術について教えることができます。例えばPython、JavaScript、Java、C++など、またはデータ構造、アルゴリズムなどのトピックについても指導可能です。
ドキュメンテーション作成: コードのドキュメンテーションを作成するお手伝いをします。良いドキュメンテーションは、他の開発者がコードを理解し、使用するのを助けます。
コード最適化: より良いパフォーマンスを得るために、コードのリファクタリングと最適化のアドバイスを提供します。

(出典)Genie AI

具体的に見ていきましょう。Chat GPT のようにチャット形式で生成 AI に質問をしていくことも出来ますが VSCode プラグインならではの機能があります。

「ソースコードを選択 → 右クリックでメニュー表示 → Genie → Genie: Explain」 をクリックします。そうすると選択しているソースコードに何が書かれているのかを生成 AI の Genie が解説してくれます。

どうでしょう。魔法のランプのようですよね。すごく便利です。これだけじゃなくテストコードも書いてくれます。「ソースコードを選択 → 右クリックでメニュー表示 → Genie → Genie: Add tests」をクリックしてください。

生成 AI の注意点としては、生成したものが正しいと言えるかは人が判断しないといけないことです。2023年1月頃にプライベートで GPT-3.5 を触っていた時よりも GPT-4 はだいぶ正確なテストコードを書くようになったかなと思いますが、まだ手放しで任せられるほどにはなっていないかなという印象です。それでも生成 AI があるのと無いのとでは全く違ってきますので、これからはより使いこなしていきたいです。

Genie AI を使い始める

さて、ここからは Genie AI のセットアップ方法について解説します。Azure OpenAI Service の API キーとエンドポイントは準備できているものとします。VSCode の拡張機能マーケットプレイスで Genie AI と検索してみてください。ランプのアイコンの拡張プラグインをインストールします。

次に設定画面で Azure OpenAI Service の API キーの入力とエンドポイントの指定をします。以下の設定箇所を探してください。

Genieai › Azure: Url
⚠️ Please make sure you select the correct model in the extension setting genieai.openai.model that is used as a base model for your Azure OpenAI service deployment. This helps extension figure out whether to use Chat based conversation with the corresponding LLM.
Make sure you enter your full Azure OpenAI deployment URL including the version.
i.e.: https://your-endpoint-base.openai.azure.com/openai/deployments/your-azure-model-name/completions?api-version=2022-12-01

Genie AI は英語で回答するので日本語で会話できるように設定します。

これで基本的な準備は完了です。ソースコードに対してコメントを追加する際には「ソースコードを選択 → 右クリックでメニュー表示 → Genie → Genie: Add comments」をクリックすればコメントを生成してくれます。「>> Insert ボタン」を押すとチャット欄からソースコード上にコメントを追加してくれます。

Genie AI × Azure OpenAI Service (GPT-4) の良いところはオプトアウトできるということだと思います。類似サービスに GitHub Copilot や Amazon Q などがありますが、オプトアウトできるかどうかは一つの判断基準になるのではないでしょうか。Amazon Q を触ってみた記事も書いていますのでご参考までに。

AI コードレビューとは

続いて AI コードレビューについて説明します。システム開発ではコーディングだけではなくレビューも重要なタスクです。

AIコードレビューは、人工知能(AI)を用いてプログラムコードの品質、セキュリティ、パフォーマンス、スタイルなどを自動的に評価、改善するプロセスを指します。これにより、開発者の負担を軽減し、コードの品質を向上させることができます。例えば以下のような活用方法があります。

  1. バグ検出:

    • AIがコードを解析し、潜在的なバグやエラーを自動的に検出します。これには、未定義変数、範囲外のアクセス、未使用のコードなどが含まれます。

  2. セキュリティチェック:

    • AIはコードのセキュリティホールや脆弱性を特定します。例えば、SQLインジェクション、クロスサイトスクリプティング(XSS)、バッファオーバーフローなどの問題を検出します。

  3. コードスタイルの一貫性:

    • AIはコードが定められたコーディングスタイルガイドラインに従っているかをチェックします。これにより、チーム内でのコードスタイルの一貫性を保つことができます。

  4. コード最適化:

    • AIはパフォーマンスや効率性の向上を図るために、冗長なコードや非効率なアルゴリズムを検出し、最適化の提案を行います。

  5. ドキュメント生成:

    • AIはコードのコメントやドキュメントの自動生成を支援します。これにより、コードの理解やメンテナンスが容易になります。

  6. テストケースの提案:

    • AIはコードのカバレッジを向上させるために、追加のテストケースの提案や、既存のテストケースの改善を行います。

PR-Agent × Azure OpenAI Service (GPT-4)

PR-Agent は CI パイプラインに組み込むことができるプルリクエスト(PR)のレビューに特化した生成 AI のレビューツールです。GitHub, Bitbucket, GitLab で利用できます。本コラムでは Bitbucket の利用を想定して説明します。PR-Agent の代表的な機能としてはレビュー( /review )と改善提案( /improve )があります。

これまでは開発担当者が開発・テストを終えてプルリクエストを提出すると、レビュワーがソースコードの差分を確認してレビューを行っていました。PR-Agent を導入するとプルリクエストを作成すると自動的に生成 AI が一次レビューを行ってくれます。実際に使い始めて感じることは、レビューする側・される側の双方の初動・初手が早く楽になった印象です。

PR-Agent のレビュー例

一方で改善提案機能の率直な感想としてはまだまだかなと思っています。やはり PR で提出されるソースコードの差分のみを対象にして生成 AI が考えるので的はずれなことが多いです。そのため、私のチームではレビュー機能のみを有効にして日常的に利用しています。やはり PR を作って数分後には一次レビューを受けられるという環境はかなり便利だと思います。

PR-Agent を使い始める

Bitbucket のパイプラインで PR-Agent を動かすための作業は以下の通りです。

  1. Azure OpenAI Service の API キーとエンドポイントを準備する。

  2. Bitbucket のパイプラインを有効にします。

  3. Bitbucket のアクセストークン(Access tokens)を準備します。PR 書き込み権限があればよいです。

  4. Bitbucket パイプラインの Repository variables に1と3で取得した OPENAI_API_KEY と BITBUCKET_BEARER_TOKENを設定します。

  5. bitbucket-pipelines.yml を作成します。

パイプラインの設定ファイルの中身を見ていきましょう。PR-Agent をパイプラインで動かすための Docker イメージが提供されています。2024年7月時点で GPT-4 を動かすのであれば v0.21 をおすすめします。

Bitbucket パイプラインで稼働した PR-Agent の Docker コンテナから Azure OpenAI Service のエンドポイントに API リクエストを行っています。

bitbucket-pipelines.yml

pipelines:
  pull-requests:
    '**':
      - step:
          name: PR Agent Review
          image: python:3.10
          services:
            - docker
          script:
            - docker run
              -e CONFIG.GIT_PROVIDER=bitbucket
              -e AZURE_OPENAI_API_KEY=$OPENAI_API_KEY
              -e BITBUCKET.BEARER_TOKEN=$BITBUCKET_BEARER_TOKEN
              -e OPENAI_API_TYPE="azure"
              -e OPENAI_API_VERSION="2024-03-01-preview"
              -e OPENAI.API_BASE="https://your-endpoint-base.openai.azure.com"
              -e OPENAI.DEPLOYMENT_ID="gpt-4"
              -e PR_DESCRIPTION.EXTRA_INSTRUCTIONS="answer in Japanese"
              -e PR_REVIEWER.EXTRA_INSTRUCTIONS="answer in Japanese"
              -e PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS="answer in Japanese"
              codiumai/pr-agent:0.21
              --pr_url=https://bitbucket.org/$BITBUCKET_WORKSPACE/$BITBUCKET_REPO_SLUG/pull-requests/$BITBUCKET_PR_ID review

日本語で会話したい場合は PR_DESCRIPTION.EXTRA_INSTRUCTIONS, PR_REVIEWER.EXTRA_INSTRUCTIONS , PR_CODE_SUGGESTIONS.EXTRA_INSTRUCTIONS に 「answer in Japanese」 を指定することで日本語になります。

PR-Agent は内部的にプロンプトが記述されています。詳細は GitHub リポジトリの pr_description_prompts.toml をご確認ください。

PR_DESCRIPTION.EXTRA_INSTRUCTIONS="answer in Japanese"と指定しているので {{extra_instructions}} に answer in Japanese というプロンプトが追加されるという仕組みです。ユーザーからの追加の指示を出すプロンプトの拡張領域が設けられているということです。

[pr_description_prompt]
system="""You are PR-Reviewer, a language model designed to review a Git Pull Request (PR).
{%- if enable_custom_labels %}
Your task is to provide a full description for the PR content - files walkthrough, title, type, description and labels.
{%- else %}
Your task is to provide a full description for the PR content - files walkthrough, title, type, and description.
{%- endif %}
- Focus on the new PR code (lines starting with '+').
- Keep in mind that the 'Previous title', 'Previous description' and 'Commit messages' sections may be partial, simplistic, non-informative or out of date. Hence, compare them to the PR diff code, and use them only as a reference.
- The generated title and description should prioritize the most significant changes.
- If needed, each YAML output should be in block scalar indicator ('|-')
- When quoting variables or names from the code, use backticks (`) instead of single quote (').

{%- if extra_instructions %}

Extra instructions from the user:
=====
{{extra_instructions}}
=====
{% endif %}


The output must be a YAML object equivalent to type $PRDescription, according to the following Pydantic definitions:
=====
class PRType(str, Enum):
    bug_fix = "Bug fix"
    tests = "Tests"
    enhancement = "Enhancement"
    documentation = "Documentation"
    other = "Other"

あなたは PR-Reviewer であり、Git Pull Request (PR) をレビューするために設計された言語モデルです。 あなたのタスクは、PR の内容の完全な説明 (ファイルのウォークスルー、タイトル、タイプ、説明) を提供することです。
- 新しい PR コード (「+」で始まる行) に焦点を当てます。
- 「前のタイトル」、「前の説明」、「コミットメッセージ」セクションは、部分的、単純、非情報的、あるいは古くなっている可能性があることに留意してください。 したがって、PRの差分コードと比較し、参考としてのみ使用してください。
- 生成されるタイトルと説明は、最も重要な変更に優先順位をつけるべきです。
- 必要であれば、各YAML出力はブロックスカラーインジケータ('|-')にするべきです。
- コードから変数や名前を引用するときは、シングルクォート(')の代わりにバックスティック(`)を使用してください。

ユーザーからの追加の指示:
=====
日本語で答える
=====

PR-Agent プロンプト

PR-Agent で生成 AI に渡している情報は PR の差分です。そのため追加の指示のプロンプトを渡すことでプロダクトの背景が伝わり、レビューの精度も高まるのではないでしょうか。例えば TypeScript など言語の情報だったり、ライブラリやアーキテクチャ、プロダクトの目的、品質基準の観点などの背景となる情報をプロンプトに与えることで生成 AI のレビュー結果も変わるのではないかと予想しています。この辺りはまだ試していないのでこれからプロンプトをチューニングしていければと思っています。

おわりに

このようにして Azure OpenAI Service を使い GPT-4 モデルをオプトアウトした状態で安全に使いつつ、AI コーディングと AI レビューの仕組みを導入しています。プロンプトの改善だったり、既存のパイプラインの中に組み込むことで生成 AI Genie と PR-Agent をチームメンバーに招き入れたような感覚になってきています。

AI を活用したシステム開発を検討されている方の一助になれれば幸いです。

この記事が参加している募集