GitHub Copilotを超える！GitHub×OpenAI 実践編：効率的なコード開発のステップバイステップガイド

https://azure-recipe.kc-cloud.jp/openai_github_integration_copilot/

前回の記事「GitHubとOpenAIの連携で開発効率アップ！その魅力とCopilotとの違い」では、GitHubとOpenAIの連携がもたらすメリットや活用法、さらにはOpenAI Copilotとの違いについてご紹介しました。今回は、具体的な実践編として、GitHubとOpenAIを連携させる方法を解説します。前回の記事をお読みいただいた方にとっては、これにより実際のプロジェクトでOpenAIを活用して開発効率を向上させるためのステップを学ぶことができます。それでは早速、実践編に入っていきましょう！

## 必要なツールとライブラリの準備

この実践編では、Pythonを使ってGitHubリポジトリとOpenAI APIを連携させます。そのために、以下のライブラリを利用します。

**GitPython:** Gitリポジトリを操作するためのPythonライブラリです。
**PyGithub:** GitHub APIを操作するためのPythonライブラリです。
**OpenAI Pythonライブラリ:** OpenAI APIを簡単に利用できるようにするPythonライブラリです。

まずは、必要なライブラリをインストールしましょう。以下のコマンドでインストールできます。

```
pip install PyGithub openai
```

## GitHubリポジトリとOpenAIのAPI連携

### アクセストークンの取得と設定

GitHubリポジトリとOpenAI APIを連携させるには、それぞれのアクセストークンが必要です。

**GitHubのアクセストークン:** こちらの手順に従って、リポジトリへのアクセス権限を持つアクセストークンを取得してください。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

**OpenAIのアクセストークン:** OpenAIのアカウントページでサインアップまたはログインし、APIキーを取得してください。

https://beta.openai.com/signup/

取得したアクセストークンは、環境変数や設定ファイルに記述して、プログラムから読み込むことができます。

例えば、以下のように環境変数を設定することができます。

```bash
export GITHUB_ACCESS_TOKEN='your_github_access_token'
export OPENAI_ACCESS_TOKEN='your_openai_access_token'
```

Pythonプログラムからは、以下のようにアクセストークンを読み込むことができます。

```python
import os

github_access_token = os.environ['GITHUB_ACCESS_TOKEN']
openai_access_token = os.environ['OPENAI_ACCESS_TOKEN']
```

### リポジトリのクローンとファイル操作

PyGithubを使って、特定のディレクトリ内のファイルを取得する関数を定義します。

```python
from github import Github

def get_github_repo(repo_name, access_token):
    github = Github(access_token)
    repo = github.get_repo(repo_name)
    return repo

def get_files_in_directory(repo, directory):
    contents = repo.get_contents(directory)
    files = [content for content in
    contents if content.type == "file"]
    return files

def create_directory_structure_text(files):
    code_snippets = "Code Snippets:\n"
    dir_structure = f"Directory Structure:\n- {clone_dir}\n"
    dir_list = []
    for file in files:
        splitted_path = file.path.split('/')
        if len(splitted_path) > 1:
            parent_dir = splitted_path[-2]
            file_name = splitted_path[-1]
            if parent_dir not in dir_list:
                dir_structure += f"  - {parent_dir}: Describe the purpose of {parent_dir}\n"
                dir_list.append(parent_dir)
            dir_structure += f"    - {file_name}: Describe the purpose of {file_name}\n"
            content = get_file_contents(repo, file.path)
            code_snippets += f"- {parent_dir}/{file_name}:\n```python\n"
            code_snippets += f"{content}\n"
            code_snippets += "```\n"
            
    return dir_structure, code_snippets
```

これらの関数を使って、GitHubリポジトリから特定のディレクトリ内のファイル（ディレクトリ構造とコードスニペット）を取得することができます。次に、OpenAI APIと連携して、各ファイルのソースコードを解析し、改善点やバグを特定する方法を紹介します。

## ソースコード解析と改善点の特定
GitHubリポジトリからファイルを取得した後、OpenAI APIを使用してソースコードを解析し、改善点やバグを特定します。GPT-4を活用することで、自動的にコードレビューやバグの検出ができるようになります。

まず、OpenAI APIと連携するために、以下のようにAPIキーを設定します。

```python
import openai

# Replace 'your_openai_api_key' with your actual OpenAI API key
openai.api_key = "your_openai_api_key"

# or Replace 'your_azure_openai_api_key' and 'your_azure_openai_api_base' with your actual Azure OpenAI Service API Key
openai.api_type = "azure"
openai.api_base = f"https://{your_azure_openai_api_base}.openai.azure.com/"
openai.api_version = "2023-03-15-preview"
openai.api_key = "your_azure_openai_api_key"
```

次に、GPT-4を活用してソースコードを解析する関数を定義します。

```python
def analyze_code_with_openai(code, dir_structure_text, prompt):
    messages=[
        {"role": "system", "content": prompt},
        {"role": "user", "content": dir_structure_text},
        {"role": "user", "content": code}
    ]
    response = openai.ChatCompletion.create(
        engine="gpt-4",
        messages=messages
    )

    suggestion = response.choices[0].text.strip()
    return suggestion
```

この関数は、ソースコードとプロンプトを引数として受け取り、OpenAI APIを使用してプロンプトに基づいた解析結果を返します。プロンプトは、GPT-4にどのような解析を求めるかを指定するための文章です。

最後に、取得したファイルの内容を解析して、改善点やバグを特定するために、先ほど定義したanalyze_code_with_openai関数を使用します。

```python
files = get_files_in_directory(repo, directory)
dir_structure_text, code = create_directory_structure_text(files)

prompt = "Analyze the following Python code for potential improvements and bugs:\n```python\n{code}\n```\nSuggestions:"
analysis_result = analyze_code_with_openai(code, dir_structure_text, prompt)
```

これで、GitHubリポジトリ内のファイルのソースコードを解析し、改善点やバグを特定することができます。このように、GitHubとOpenAIの連携を活用することで、より効率的なコードレビューが可能になり、開発プロセスが大幅に改善されるでしょう。以下は実行した結果の一部となります。

![cap02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/cc6820b5-e322-59b8-c7be-849b853889b9.png)

他にも、Issueの内容を入力することで結果を出したりすることもできます。

![cap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/b4d3ccf7-b7a1-9543-ce4c-6c7bd9f3f1be.png)

promptに上図のIssueの内容を入れることで下図の結果が出力されます。

![cap03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/9db2b1e3-f1be-f8f6-5ccd-6c4a802df797.png)

この図は一部省略しておりますが、ディレクトリ構造を理解して10以上のファイルから編集部分についても具体的に表示してくれてます。また、適用した時のエラーを投げることで修正方法も教えてくれます。

## まとめ

この記事では、GitHubとOpenAIを連携させる方法と、それを活用してソースコードの解析や改善点の特定を行う方法を紹介しました。この連携を利用することで、開発効率が向上し、より質の高いソフトウェア開発が期待できます。

実際に手を動かして試してみることで、GitHubとOpenAIの連携の真価を実感できることでしょう。今後はさらに多くの開発者が、GitHubとOpenAIの連携を活用して、より効率的な開発プロセスを実現できることが期待されます。

また、今回紹介した方法は一例にすぎません。OpenAIのAPIは非常に柔軟であり、さまざまなシナリオに適用することができます。例えば、ドキュメントの自動生成や、新たな機能を持つコードの生成など、開発のさらなる効率化につながる応用が考えられます。

さらに、OpenAIが今後さらに進化することで、機能が拡張され、より高度なタスクをこなせるようになるでしょう。これにより、GitHubとOpenAIの連携は、開発者にとって必要不可欠なツールとなり、新たな可能性を切り拓くことが期待されます。

最後に、今回の記事では主にPythonを対象としましたが、GPT-4は多くのプログラミング言語に対応しているため、他の言語でも同様の手法を適用することが可能です。あなたが使っている言語や開発環境に応じて、GitHubとOpenAIの連携を活用して、開発効率を向上させましょう。