コマンド一つでGitHub上のコメントを自動要約するGitHub Actionsを公開しました

2023/04/12に公開

こんにちは!本記事では、GitHubのissueコメントを簡単に要約できる「SummarAIzeHub」というGitHub Actionsについて紹介します。このGitHub Actionsは、プロジェクトのコミュニケーションを円滑に進めるためのサポートツールとして作成しました。💪

https://github.com/zerebom/SummarAIzeHub

記事では、SummarAIzeHubの開発の動機や背景、使用法、技術的詳細などを紹介します。

使用方法

SummarAIzeHubは下記のように使用できます。GitHub上のissueやプルリクエストで、コメント欄に/summarize-issueと入力するだけで、GitHub Actionsが発火し、要約プロセスが開始されます。

まず、/summarize-issueより上のコメントがすべて取得され、ChatGPT-4にプロンプトとして渡されます。そして、ChatGPT-4がそれらのコメントを要約し、要約結果が得られます。最後に、要約結果が新しいコメントとして追加されるという流れです。

具体的には下記のようなコメントが有ったとします。(読みとばしてください)

これに/summarize-issueとissue上でコマンドを打つと、下記のように要約をコメントしてくれるという機能になっています。

https://github.com/zerebom/SummarAIzeHub/issues/2

インストール方法

SummarAIzeHubを使用するためには、以下の手順に従ってインストールしてください。

必要な準備

  1. まず、OpenAIにサインアップし、APIキーを取得します。
  2. 次に、GitHubリポジトリのシークレットにOPENAI_API_KEYPERSONAL_ACCESS_TOKENを追加します。OPENAI_API_KEYは前の手順で取得したものです。PERSONAL_ACCESS_TOKENには、${{ secrets.PERSONAL_ACCESS_TOKEN }}を使用してください。

インストール方法

  1. リポジトリに.github/workflowsディレクトリを作成し、その中にsummarize_issue.ymlという名前のファイルを作成します。
  2. 以下のコードをsummarize_issue.ymlに追加します。
name: Summarize Issue

on:
  issue_comment:
    types: [created]

jobs:
  summarize_issue:
    if: startsWith(github.event.comment.body, '/summarize-issue')
    runs-on: ubuntu-latest
    name: Checkout code & SummarAIze
    steps:
      - uses: actions/checkout@v3
      - uses: zerebom/SummarAIzeHub@v1.0.1
        with:
          PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

これで、SummarAIzeHubがリポジトリにインストールされました。コメントに/summarize-issueが含まれると、要約が自動的に生成されます。

カスタムプロンプトテンプレートの利用

SummarAIzeHubでは、カスタムプロンプトテンプレートも設定することができます。

デフォルトでは、プロンプトテンプレートは path/to/default/prompt_template.txt に格納されています。カスタムプロンプトテンプレートを使用する場合は、以下のように summarize_issue.ymlのwith セクションに prompt_template_path を追加してください。

with:
  PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
  openai_api_key: ${{ secrets.OPENAI_API_KEY }}
  prompt_template_path: 'path/to/your/custom_template.txt'

カスタムテンプレートを使用すると、要約の形式や質問などを自由にカスタマイズできます。プロンプトテンプレートは、issue の情報とともに GPT モデルに送信されるテキストです。これにより、GPT が適切な要約を生成できます。

背景とプロジェクトの動機

SummarAIzeHubの開発は、ChatGPTをどのようなシチュエーションで利用すると便利かを考察していた過程から始めました。

自分は過去に下記のようなChatGPTとのペアプロや、ChatGPTを使ったデータ分析をしていました。

https://zenn.dev/zerebom/articles/1ffd51da420c9e

https://speakerdeck.com/zerebom/chatgpttonohui-hua-nodetafen-xi-kai-fa-dui-hua-wozui-shi-hua-surutamenozhi-zhen-tote-xing

このような個人開発を通して、以下のような状況でChatGPTを活用すると非常に有益だという肌感覚があったため、その要件に満たすサービスを作ろうと考えました。

  1. 大量の入力情報を活用できる: GitHubには開発中に人々が記録した大量の情報があります。事前に情報を与えることで、ChatGPTは高い精度で回答してくれます。この情報を効果的に使うことで、ChatGPTの能力を最大限に活かせると考えました。

  2. ユーザーに余計な手間をかけない: ChatGPTは便利ですが、別のアプリやタブで作業している場合、ブラウザの移動が必要だったり、プロンプトを自分で考えるが必要があります。そこで、このようなちょっと面倒くさい作業を全部取っ払ったサービスならもっと便利に使えるのではないかと思いました。SummarAIzeHubを使う際には、使うかどうかを決め、コメントするだけで自動的に要約が生成されます。NotionAIの便利さから着想を得て、サービスとGPTのインターフェースを少し変えるだけで、ユーザー体験が大きく向上するのでは?というアイディアに基づいています。

なお、このような機能はGitHubの公式がリリースされることも予想されますが、リリースやWaitlistを待つことができず、独自に開発することにしました。さらに、自分でカスタマイズでき、ChatGPTのAPI料金以外かからないメリットがある上に、開発の工数も少ないと見込んで、このサービスを作成しました。

技術的詳細

SummarAIzeHubは、Python, LangChain, GitHub Actions, そしてChatGPT-3.5-turboといった技術を用いて開発されています。以下に、技術的な仕組みの概要を説明し、処理の流れを明示します。

  1. GitHub Actionsの起動: ユーザーがGitHub上で/summarize-issueという所定のコマンドを入力すると、GitHub Actionsを介してPythonコードが実行されます。

  2. 情報の取得: 次に、PyGitHubライブラリを使用して、ユーザーのコメントや他の関連情報をGitHubから取得します。

  3. 要約処理: 取得した情報を、LangChainを通じてOpenAIに送信し、ChatGPT-3.5-turboを利用して要約処理が行われます。

  4. 要約結果の投稿: 最後に、要約された結果を再びPyGitHubを使って、GitHubのコメントに貼り付けます。

このような処理の流れにより、要約が実現されています。既存のライブラリを利用することで、コード全体はわずか200行程度で実装することができました。

特にGitHub上での開発は、PyGitHubなどPythonのSDKがあるうえに、Secrets、デプロイ、リリース周りをGitHubが管理してくれるので非常に簡単にできました。さらにOpenAIとの接続もLangChainによってに直感的に書くことができます。

例えば、GitHubからコメントを取得し、promptにするコードは下記のように書けます。

# GitHubクライアントの作成
    github_client = Github(PERSONAL_ACCESS_TOKEN)
    repo = github_client.get_repo(repo_name)
    issue = repo.get_issue(number=int(issue_number))

    # Issueの全コメントを取得
    comments = issue.get_comments()

    # コメントをまとめたテキストを作成
    comments_section = ""
    for comment in comments:
        comments_section += f"コメント({comment.user.login}、投稿日:{comment.created_at.strftime('%Y-%m-%d')}):\n{comment.body}\n\n"

    with open("./templates/prompt_template.txt", "r") as f:
        prompt_template = f.read()

    prompt = prompt_template.format(
        issue_title=issue.title, comments_section=comments_section
    )

また、ChatGPTと相談しながら開発を進めることで、半日~1日程度で実装することができました。

注意事項

データの取り扱いに関する注意

  • 自動要約による結果は必ずご自身で内容を確認してください。
  • OpenAI社にAPI経由で情報が渡るため、機密情報などの取り扱いには注意して利用してください。なお、API経由でのデータは学習には利用されず、30日後に入力データは削除されます。

tokenの制限について

  • ChatGPTの制限により、4000tokenまでしか入力できません。現在はそれに収まるようにコメントを切り詰めてChatGPTに投げています。
  • 4000tokenより長いコメントの場合、入力できる量を超えた部分は切り捨てられます。

将来的なアップデートや機能改善に関する情報

  • 今後はtoken上限ごとに要約を行い、それらを結合するような実装に変更を検討しています。

まとめ

SummarAIzeHubは、GitHubのissueコメントを簡単に要約することができる便利なツールです。ぜひ試したり、フィードバックを送ってくていただけたらうれしいです!

また、これまではGPTを使った、簡単なアプリケーションを組んできましたが、今後はよりエンタープライズなシステムに組み込むにはどうしたらよいか?などを考えた上で、さらに開発を進めていきたいと思っています!

今後も発信し続ける予定なので、Twitterなどフォローしていただけたら幸いです!
https://twitter.com/zerebom_3

Discussion