I.R.I.S. v0.2.0 アップデートガイド:初心者のための詳細解説

AI・機械学習

はじめに:I.R.I.S.とは?

I.R.I.S.は、GitHubのイシュー(問題や課題の報告)を自動的に分析し、適切なラベル(タグのようなもの)を付けてくれるAIアシスタントです。例えば、バグ報告なのか、新機能の要望なのか、ドキュメントの改善提案なのかを自動で判断し、それに合ったラベルを付けてくれます。

これにより、開発者は素早くイシューの内容を把握でき、効率的に作業を進められるようになります。

GitHub Actionsで実現する高度なイシュー管理: 安野たかひろ都知事選マニフェストリポジトリの自動化ワークフロー解説
はじめに安野たかひろ氏の都知事選マニフェストリポジトリで使用されているGitHub Actionsワークフローは、オープンソースプロジェクトの効率的な管理を実現する優れた例です。このワークフローは、新しいイシューが開かれた際に自動的に実行さ...

主な更新点

v0.2.0では、以下の主要な更新が行われました:

  1. Google Generative AI の統合
  2. ラベル管理システムの改善
  3. イシュー処理スクリプトの大幅なリファクタリング
  4. ワークフローの改善と日本語化
  5. ユーザビリティの向上(READMEの改善など)

それでは、これらの更新点について詳しく見ていきましょう!

Release 📒I.R.I.S. v0.2.0 リリースノート · Sunwood-ai-labs/IRIS
変更点イシュー処理システムの強化 (#6, #11)イシュー処理スクリプトを大幅にリファクタリングし、コード構造を改善しました。Google Generative AIライブラリを導入し、より高度なイシュー分析が可能になりました。ラベル管理をCSVファイルベースに変更し、柔軟性と保守性を向上させました。ユーザビリティの...

新機能の詳細解説

Google Generative AI の統合

Google Generative AI(別名:Gemini)が新たに統合されました。これにより、イシューの分析がより高度になりました。

設定方法

  1. Google AI Studio で API キーを取得します。
  2. GitHub リポジトリの Secrets に GEMINI_API_KEY として API キーを追加します。

コードでの使用例

# Google Generative AI(Gemini)を使用するための設定
from litellm import completion

# Geminiモデルの指定
MODEL_NAME = "gemini/gemini-1.5-pro-latest"

# Geminiを使用してイシューを分析する関数
def analyze_issue_with_gemini(issue_content):
    # プロンプトの作成
    prompt = f"以下のGitHubイシューを分析し、適切なラベルを提案してください:\n\n{issue_content}"

    # Geminiモデルを使用して分析
    response = completion(model=MODEL_NAME, messages=[
        {"role": "system", "content": "あなたはGitHubイシューを分析し、適切なラベルを提案する助手です。"},
        {"role": "user", "content": prompt}
    ])

    # 分析結果(提案されたラベル)を返す
    return response['choices'][0]['message']['content']

# 使用例
issue_content = "アプリがクラッシュする問題が発生しています。..."
suggested_labels = analyze_issue_with_gemini(issue_content)
print(f"提案されたラベル: {suggested_labels}")

この例では、Google Generative AI(Gemini)を使用してイシューを分析し、適切なラベルを提案する方法を示しています。

ラベル管理システムの改善

ラベルの管理がより柔軟になりました。新しく追加された .github/labels.csv ファイルを使って、プロジェクト固有のラベルを簡単に定義できるようになりました。

IRIS/.github/labels.csv at main · Sunwood-ai-labs/IRIS
I.R.I.S(Intelligent Repository Issue Solver). Contribute to Sunwood-ai-labs/IRIS development by creating an account on GitHub.

labels.csv の例

label,description
bug,何かが正常に動作していません
feature,新機能または要望
documentation,ドキュメントの改善または追加
enhancement,既存機能の改善
question,さらなる情報が必要です
good first issue,初心者に適しています

ラベル読み込みと検証のコード例

import csv
import re

# CSVファイルからラベルを読み込む関数
def load_labels_from_csv(file_path):
    # ラベルを格納する辞書を初期化
    labels = {}

    # CSVファイルを開いて読み込む
    with open(file_path, mode='r', encoding='utf-8') as file:
        # CSVリーダーを作成
        reader = csv.DictReader(file)
        # 各行を処理
        for row in reader:
            # ラベル名を前処理(小文字に変換し、空白を削除)
            label_name = preprocess_label(row['label'])
            # ラベル名と説明を辞書に追加
            labels[label_name] = row['description']

    return labels

# ラベル名を前処理する関数
def preprocess_label(label):
    # ラベル名を小文字に変換し、空白とアスタリスクを削除
    return re.sub(r'[\s*]', '', label.lower())

# 提案されたラベルを検証する関数
def validate_labels(suggested_labels, valid_labels):
    # 検証済みラベルを格納するリストを初期化
    validated_labels = []

    # 各提案ラベルについて処理
    for label in suggested_labels:
        # ラベル名を前処理
        preprocessed_label = preprocess_label(label)
        # 前処理したラベル名が有効なラベルリストに含まれているか確認
        if preprocessed_label in valid_labels:
            # 元のラベル名(大文字小文字を保持)を検証済みリストに追加
            original_label = next(k for k in valid_labels.keys() if preprocess_label(k) == preprocessed_label)
            validated_labels.append(original_label)

    return validated_labels

# 使用例
csv_path = '.github/labels.csv'
valid_labels = load_labels_from_csv(csv_path)
suggested_labels = ['bug', 'enhancement', 'invalid_label']
validated_labels = validate_labels(suggested_labels, valid_labels)
print(f"検証済みラベル: {validated_labels}")

このコードでは、CSVファイルからラベルを読み込み、AIが提案したラベルを検証して、有効なラベルのみを使用する方法を示しています。

イシュー処理スクリプトの改良

イシュー処理のメインスクリプトが大幅に改良され、より構造化されたコードになりました。

IRIS/.github/scripts at main · Sunwood-ai-labs/IRIS
I.R.I.S(Intelligent Repository Issue Solver). Contribute to Sunwood-ai-labs/IRIS development by creating an account on GitHub.

主な改善点

  1. LLMIntegration クラスの導入
  2. 複数のAIモデルのサポート
  3. エラーハンドリングの強化
  4. コードの可読性向上

改良されたスクリプトの一部

import os
from github import Github
from litellm import completion
from enum import Enum

# 使用するAIモデルを定義するEnum
class LLMModel(Enum):
    GEMINI = "gemini/gemini-1.5-pro-latest"
    GPT4 = "gpt-4"
    CLAUDE = "anthropic/claude-2"

# LLM(大規模言語モデル)との統合を管理するクラス
class LLMIntegration:
    def __init__(self):
        # 環境変数から必要な情報を取得
        self.github_token = os.getenv("GITHUB_TOKEN")
        self.github_repo = os.getenv("GITHUB_REPOSITORY")
        self.issue_number = int(os.getenv("ISSUE_NUMBER", 0))
        # API キーのセットアップ
        self.setup_api_keys()
        # ラベルの読み込み
        self.labels = self.load_labels_from_csv()

    # 各AIサービスのAPIキーをセットアップ
    def setup_api_keys(self):
        os.environ['GEMINI_API_KEY'] = os.getenv("GEMINI_API_KEY", "")
        os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY", "")
        os.environ['ANTHROPIC_API_KEY'] = os.getenv("ANTHROPIC_API_KEY", "")

    # 指定されたAIモデルを使用してレスポンスを取得
    def get_llm_response(self, model: LLMModel, messages: List[Dict[str, str]]) -> str:
        try:
            # litellmライブラリを使用して、指定されたモデルにリクエストを送信
            response = completion(model=model.value, messages=messages)
            # レスポンスの内容を返す
            return response['choices'][0]['message']['content']
        except Exception as e:
            # エラーが発生した場合はログに記録
            print(f"{model.value}からのレスポンス取得中にエラーが発生しました: {str(e)}")
            return ""

    # GitHubイシューを分析し、ラベルを提案
    def analyze_github_issue(self) -> List[str]:
        # GitHubクライアントの初期化
        g = Github(self.github_token)
        repo = g.get_repo(self.github_repo)
        issue = repo.get_issue(number=self.issue_number)

        # イシューの内容を取得
        issue_content = f"タイトル: {issue.title}\n\n本文: {issue.body}"
        # ラベル提案用のプロンプトを作成
        prompt = self.create_label_prompt(issue_content)

        # AIモデルを使用してラベルを提案
        response = self.get_llm_response(LLMModel.GEMINI, [
            {"role": "system", "content": "あなたはGitHubイシューを分析し、適切なラベルを提案する助手です。"},
            {"role": "user", "content": prompt}
        ])

        # 提案されたラベルを検証
        suggested_labels = response.strip().split(', ')
        return self.validate_labels(suggested_labels)

    # メイン処理を実行
    def process_issue(self):
        suggested_labels = self.analyze_github_issue()
        self.apply_labels_and_comment(suggested_labels)

# スクリプトのメイン処理
if __name__ == "__main__":
    llm_integration = LLMIntegration()
    llm_integration.process_issue()

この改良されたスクリプトでは、コードがより構造化され、各機能が明確に分離されています。また、複数のAIモデルを簡単に切り替えられるようになっています。

ワークフローの変更

IRIS/.github/workflows/issue-review.yml at main · Sunwood-ai-labs/IRIS
I.R.I.S(Intelligent Repository Issue Solver). Contribute to Sunwood-ai-labs/IRIS development by creating an account on GitHub.

GitHub Actionsのワークフローも更新され、より分かりやすくなりました。主な変更点は以下の通りです:

  1. ワークフロー名の日本語化
  2. 新しい依存関係の追加(Google Generative AI)
  3. 環境変数の追加(GEMINI_API_KEY)

更新されたワークフローファイル(.github/workflows/issue-review.yml)の例:

name: イシュー自動ラベリング

on:
  issues:
    types: [opened]

jobs:
  process_issue:
    runs-on: ubuntu-latest
    steps:
    - name: リポジトリのチェックアウト
      uses: actions/checkout@v2

    - name: Pythonのセットアップ
      uses: actions/setup-python@v2
      with:
        python-version: '3.x'

    - name: 依存関係のインストール
      run: |
        python -m pip install --upgrade pip
        pip install litellm
        pip install PyGithub
        pip install -q -U google-generativeai

    - name: LLMによるイシュー処理
      env:
        GITHUB_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}
        OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        GITHUB_REPOSITORY: ${{ github.repository }}
        ISSUE_NUMBER: ${{ github.event.issue.number }}
      run: python .github/scripts/process_issue.py

このワークフローファイルでは、新しい依存関係が追加され、必要な環境変数が設定されています。

セットアップ方法の更新

I.R.I.S. v0.2.0を使用するための新しいセットアップ手順は以下の通りです:

  1. リポジトリをクローンまたはフォークします。

  2. .github/workflows/issue-review.yml ファイルをあなたのリポジトリの .github/workflows/ ディレクトリにコピーします。

  3. GitHub Secrets に以下のキーを設定します:

    • OPENAI_API_KEY: OpenAI の API キー
    • GH_ACCESS_TOKEN: GitHub のパーソナルアクセストークン
    • GEMINI_API_KEY: Google AI Studio の API キー(オプション、Gemini を使用する場合)
    • ANTHROPIC_API_KEY: Anthropic の API キー(オプション、Claude を使用する場合)
  4. .github/labels.csv ファイルを確認し、必要に応じてプロジェクト固有のラベルを追加または編集します。

  5. GitHub Actions が有効になっていることを確認します。リポジトリの「Settings」→「Actions」→「General」で、「Allow all actions and reusable workflows」が選択されていることを確認してください。

これらの手順を完了すると、新しいイシューが作成されるたびに I.R.I.S. が自動的に起動し、ラベルの提案と適用を行います。

新しいワークフロー図の解説

I.R.I.S. v0.2.0 の新しいワークフローを視覚化した図を見てみましょう。

file

この図は、I.R.I.S. の動作を視覚的に表現しています。各ステップを詳しく見ていきましょう:

  1. ユーザーがイシューを作成: 開発者や貢献者が新しいイシューを GitHub リポジトリに作成します。

  2. GitHub Action のトリガー: 新しいイシューが作成されると、GitHub Actions が I.R.I.S. を起動します。

  3. イシュー内容の取得: I.R.I.S. が GitHub API を使って、新しく作成されたイシューの詳細を取得します。

  4. AI モデルによる分析: 取得したイシュー内容を AI モデル(OpenAI GPT-4、Google Gemini、Anthropic Claude など)に送信し、適切なラベルの提案を要求します。

  5. ラベルの提案: AI モデルがイシューの内容を分析し、適切だと判断したラベルを提案します。

  6. ラベルの照合: 提案されたラベルを .github/labels.csv ファイルに定義された有効なラベルと照合します。

  7. 検証済みラベルの適用: 照合の結果、有効と判断されたラベルをイシューに適用します。

  8. コメントの追加: I.R.I.S. が適用したラベルとその説明をイシューにコメントとして追加します。

  9. ユーザーへの通知: GitHub がイシューの更新(ラベルの追加とコメント)をユーザーに通知します。

この新しいワークフローでは、ラベルの検証ステップが追加されたことで、より正確で一貫性のあるラベリングが可能になりました。

開発者向けのヒント

I.R.I.S. v0.2.0 の新機能を最大限に活用するためのヒントをいくつか紹介します:

AI モデルの使い分け:

異なる AI モデルは異なる強みを持っています。例えば、特定の種類のイシューに対して Gemini が優れた結果を出す場合、そのイシューカテゴリには Gemini を使用するようにカスタマイズできます。

   # イシューの種類に応じてAIモデルを選択する例
   def select_ai_model(issue_content):
       if "バグ" in issue_content.lower():
           return LLMModel.GPT4
       elif "機能要望" in issue_content.lower():
           return LLMModel.GEMINI
       else:
           return LLMModel.CLAUDE

   # 使用例
   selected_model = select_ai_model(issue_content)
   response = self.get_llm_response(selected_model, messages)

カスタムラベルの追加:

プロジェクト固有のラベルを .github/labels.csv に追加することで、より細かなイシュー分類が可能になります。

   label,description
   performance,パフォーマンスに関する問題や改善
   security,セキュリティに関する問題や改善
   ui/ux,ユーザーインターフェースやユーザー体験に関する問題や改善

プロンプトのカスタマイズ:

AI モデルへのプロンプトをカスタマイズすることで、より正確なラベル提案を得られる可能性があります。

   def create_custom_prompt(issue_content):
       return f"""
       以下のGitHubイシューを分析し、最も適切なラベルを1つだけ提案してください。
       可能なラベル: バグ, 機能要望, 文書化, パフォーマンス, セキュリティ, UI/UX

       イシューの内容:
       {issue_content}

       回答は以下の形式で提供してください:
       推奨ラベル: [ラベル名]
       理由: [簡潔な説明]
       """

   # 使用例
   custom_prompt = create_custom_prompt(issue_content)
   response = self.get_llm_response(LLMModel.GEMINI, [
       {"role": "system", "content": "あなたはGitHubイシューを分析する専門家です。"},
       {"role": "user", "content": custom_prompt}
   ])

まとめ

I.R.I.S. v0.2.0 は、以下の点で大きく進化しました:

  1. 複数の AI モデルのサポート: OpenAI GPT-4、Google Gemini、Anthropic Claude など、複数の高性能 AI モデルを利用可能になりました。

  2. 柔軟なラベル管理: CSV ファイルを使用したラベル管理により、プロジェクト固有のニーズに合わせたカスタマイズが容易になりました。

  3. 改善されたコード構造: リファクタリングにより、コードの可読性と保守性が向上しました。

  4. 強化されたエラーハンドリング: 様々な状況に対応できるよう、エラーハンドリングが改善されました。

  5. 日本語対応の強化: ワークフローやコメントの日本語化により、日本語話者にとってより使いやすくなりました。

これらの改善により、I.R.I.S. はより柔軟で強力なツールとなり、開発チームの生産性向上に大きく貢献します。ぜひ、あなたのプロジェクトに I.R.I.S. v0.2.0 を導入して、イシュー管理の効率化を体験してください!

質問やフィードバックがありましたら、GitHub の Issues や Discussions でお気軽にお問い合わせください。I.R.I.S. の改善に皆様のご意見をお待ちしています。

Happy coding! 🚀✨

リポジトリ

GitHub - Sunwood-ai-labs/IRIS: I.R.I.S(Intelligent Repository Issue Solver)
I.R.I.S(Intelligent Repository Issue Solver). Contribute to Sunwood-ai-labs/IRIS development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました