噂のAIレビューをAzure OpenAIでできるようにしてみた
概要
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で記載されています。
委託会社にも閲覧される可能性がある事を考えると、書き捨てのコードならともかく、大事なコードのCIにOpenAIのAPIを使うことは少しためらわれます。
一方のAzure OpenAIですが、前提として、OpenAIとは独立してMicrosoftによって管理されており、データ管理やプライバシーへの取り組みも独自の仕組みを使用しています。
Azure OpenAI Serviceは、マイクロソフトによって完全に管理されています。マイクロソフトはOpenAIのモデルをマイクロソフトのAzure環境でホストしており、サービスはOpenAIが運営するいかなるサービス(ChatGPTやOpenAI APIなど)とも相互作用しません。
Azure OpenAIでもAbuse Monitoringという名前で不正行為の監視が行われているのですが、こちらはオプトアウト申請が許諾されると完全にセキュアな状態でOpenAIを利用することができるようになります。
やったこと
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