🤖

噂のAIレビューをAzure OpenAIでできるようにしてみた

2023/11/26に公開

概要

Github Copilot for Pull RequestやCodeRabbit, PR AgentなどAIがコードレビューをしてくれるサービスがいくつか出てきています。
現在利用可能なCodeRabbitやPR AgentはOPENAI_API_KEYとyamlを設定するだけでGithub Actionsを通して、Pull Requestのレビューを自動で行ってくれる手軽さが魅力の一つです。
今回はCodeRabbitのOSS版ai-pr-reviewerをforkしてAzure OpenAIで使えるように改修してみました。

以下のyamlと環境変数を設定すれば、Github Actions上から動かすことができます。

name: Code Review

permissions:
  contents: read
  pull-requests: write

on:
  pull_request:
  pull_request_review_comment:
    types: [created]

concurrency:
  group:
    ${{ github.repository }}-${{ github.event.number || github.head_ref ||
    github.sha }}-${{ github.workflow }}-${{ github.event_name ==
    'pull_request_review_comment' && 'pr_comment' || 'pr' }}
  cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: wisteria30/ai-pr-reviewer@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          AZURE_OPENAI_API_KEY: ${{ Secrets.AZURE_OPENAI_API_KEY }}
          AZURE_OPENAI_API_INSTANCE_NAME: ${{ Secrets.AZURE_OPENAI_API_INSTANCE_NAME }}
          AZURE_OPENAI_API_DEPLOYMENT_NAME: ${{ Secrets.AZURE_OPENAI_API_DEPLOYMENT_NAME }}
          AZURE_OPENAI_API_VERSION: '2023-07-01-preview'
        with:
          debug: true
          review_comment_lgtm: false
          openai_light_model: gpt-4
          openai_heavy_model: gpt-4
          language: ja-JP

リポジトリと実際に動かしたPRのレビューはこちらです。

なぜAzure OpenAIなのか

理由は、Azure OpenAIをオプトアウトしたAPIが最もセキュアに利用できるからです。

OpenAIのAPIの利用データが許可なしで学習に使われないことはご存知の方も多いと思います。
では、完全にセキュアか?と言われるとそうではなく、「乱用や悪用をレビューする目的」ではAPIデータがOpenAIとその委託会社に利用される旨がプライバシーに関するFAQで記載されています。

https://openai.com/enterprise-privacy

委託会社にも閲覧される可能性がある事を考えると、書き捨てのコードならともかく、大事なコードのCIにOpenAIのAPIを使うことは少しためらわれます。

一方のAzure OpenAIですが、前提として、OpenAIとは独立してMicrosoftによって管理されており、データ管理やプライバシーへの取り組みも独自の仕組みを使用しています。

Azure OpenAI Serviceは、マイクロソフトによって完全に管理されています。マイクロソフトはOpenAIのモデルをマイクロソフトのAzure環境でホストしており、サービスはOpenAIが運営するいかなるサービス(ChatGPTやOpenAI APIなど)とも相互作用しません。

Azure OpenAIでもAbuse Monitoringという名前で不正行為の監視が行われているのですが、こちらはオプトアウト申請が許諾されると完全にセキュアな状態でOpenAIを利用することができるようになります。

https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy

やったこと

OpenAIのAPI呼び出しをchatgptからlangchainにリプレイスしました。

ただ環境変数を追加して済めばよかったのですが、Azure OpenAIの呼び出しはドメインからパスまで全て変わるので、公式のopenaiライブラリに依存しないと高確率で動かないと予想していました。
実装を見ると、chatgpt-apiというAPI_KEYを渡すとChatGPTっぽい会話が出来るChatGPT黎明期のライブラリを使っており、予想通りAzure OpenAIには対応していませんでした...

openaiをそのまま使っても良かったのですが、内部でメッセージを管理するチャット形式で実装されていたので、langchainを採用することでインターフェースを踏襲しつつメッセージ管理部分をMemoryに委譲して楽できるようにしました。

おわりに

使ってみた感想としては、要約や変更したファイル名と概要などがまとまっているのは良いと思いました。(たまに嘘つきますが)
文章を書くことに若干苦手意識があり、PR出す前の文章作成に5-10分ほど使うこともあったので、空のままPRを作れるのがとても楽だと感じます。

CIは最低限使えるようにしただけなので、気になる点があれば是非コメント・PRいただけると幸いです。

Discussion