見出し画像

リポジトリの自動要約スクリプト と それを使ったIssue解析Botの作成

こんにちは、ニケです。
今回は便利ツール開発したよ系の記事です。

このツールを使うと、指定したフォルダにあるファイルを1つずつAIを使用して要約し、1つのMarkdownファイルにまとめてくれます。

最近は一度に送れるコンテキストウインドウが100万トークンとかいう強強LLMも登場しているわけですが、それでも大きめのプロジェクトの中身をそのまま渡すと足りなかったりします(しない?しなかったらそのまま突っ込んで大丈夫です)

ツールの成果物にはコードが含まれないので用途は限られますが、READMEやその他ドキュメントの生成、目的に応じたファイルの特定、などには使えそうです。
今回はツールの紹介と、これを活用して GithubのIssue解析Bot を作成したのでその使い方も載せます。


注意事項

※ pythonを実行できる環境が必要です。
※ LLMには、Anthropic claude-3-5-sonnet-20240620 を使用しています。
※ Macで動作確認していますが、WindowsやLinuxでも問題なく動くと思います。

使い方

事前準備

リポジトリをクローンしてフォルダに移動します。

git clone https://github.com/tegnike/codebase-explainer.git
cd codebase-explainer

必要ライブラリをインストールします。

pip install -r requirements.txt

環境変数に ANTHROPIC_API_KEY を設定します

# Linuxまたは macOS の場合
export ANTHROPIC_API_KEY=your_api_key_here
 
# Windows の場合:
## コマンドプロンプトの場合:
set ANTHROPIC_API_KEY=your_api_key_here
## PowerShell の場合:
$env:ANTHROPIC_API_KEY = "your_api_key_here"

対象となるフォルダを用意しておきます。
今回は /Users/user/WorkSpace/aituber-kit を対象と仮定して話を進めていきます。

準備スクリプトの実行

dry-runモードでスクリプトを実行します。
このコマンドを実行すると、対象となるファイルと除外されるファイルが表示されます。

同時に、指定したフォルダ名のフォルダと、.projectignoreファイルが作成されます。
対象ファイルのうち、AIの要約が不要としたファイルは.projectignoreに1行ずつ記載してください。

> python main.py /Users/user/WorkSpace/aituber-kit --exclude vrm vrma --dry-run

.projectignoreファイルが作成されました: /Users/user/WorkSpace/codebase-explainer/aituber-kit/.projectignore
ファイルをスキャン中...

処理対象となるファイル数: 98
除外されたファイル数:
  .gitignoreにより無視: 23
  .projectignoreにより無視: 0
  除外された拡張子: 3
  テキストファイルではない: 10
  空のファイル: 0

対象ファイルのリスト:
tailwind.config.js
LICENSE
output_sorted.json
Dockerfile
next.config.js
electron.mjs
input_sorted.json
test.py
README.md
.gitignore
package-lock.json
package.json
.env
watch.json
tsconfig.json
docker-compose.yml

〜〜〜(省略)〜〜〜

除外されたファイルの詳細:

.projectignoreにより無視されたファイル:

除外された拡張子のファイル:
  public/AvatarSample_B.vrm
  public/AvatarSample_B_old.vrm
  public/idle_loop.vrma

テキストファイルではないファイル:
  locales/ja/translation.json
  docs/README_en.md
  docs/README_zh.md
  docs/logo_licence.md
  docs/vrm_licence.md
  docs/vrm_licence_ko.md
  public/ogp.png
  public/bg-c.png
  src/utils/englishToJapanese.json
  src/pages/api/google.ts

空のファイル:

dry-runが完了しました。.projectignoreファイルを編集し、本実行を行ってください。

実行時間: 0.09

なお、最初にdry-runモードでスクリプトを実行しないとエラーになるので、まずこれを実行し、対象ファイルを確認するようにしてください。
.projectignoreファイルを更新したあとに再度dry-runを実行することで、変更後の対象ファイルを確認することも可能です。

オプションを紹介します。

--exclude: 除外する拡張子のリストを指定 (例: --exclude jpg png)
--prompt: カスタムプロンプトテンプレートを指定

--excludeでは、除外する拡張子を一括で指定できるので、あまりにも特定の拡張子ファイルが多い場合は指定するのがよいでしょう。

--promptで要約用のプロンプトを指定できますが、行数が多くなりがちなので、main.py の中身を変更したほうが良いと思います。実装者が言うのもなんですが。

デフォルトのプロンプトは下記の通りです。contentにファイルの内容が入ります。
Claudeの「Generate a Prompt」機能を使用して作成しました。

あなたは、プログラミングファイルの内容を分析し、その構造と機能を簡潔に説明するAIアシスタントです。以下の指示に従って、与えられたファイルの内容を分析し、Markdown形式で説明を提供してください。

まず、分析対象のファイル内容を以下に示します:

<file_content>
{content}
</file_content>

このファイルの内容を注意深く分析し、以下の手順で説明を作成してください:

1. ファイル全体の概要を把握します。
2. インポートされているモジュールを特定します。
3. 定義されている関数を見つけ、各関数の目的を理解します。

分析が完了したら、以下の形式でMarkdown形式の説明を提供してください:

<answer>
### File Description
ファイルの全体的な説明を25文程度で記述してください。ファイルの主な目的、機能、および重要な特徴を含めてください。

### Imported Modules
- モジュール1
- モジュール2
(以下、インポートされているすべてのモジュールをリストアップしてください)

### Functions
- 関数名1: 簡潔な説明(1-2文)
- 関数名2: 簡潔な説明(1-2文)
(以下、ファイル内のすべての関数について同様に記述してください)
</answer>

注意事項:
- 説明は日本語で提供してください。
- ファイルの内容を正確に反映させ、重要な情報を漏らさないようにしてください。
- 専門用語や技術的な概念については、可能な限り分かりやすく説明してください。
- 関数の説明は簡潔でありながら、その主な目的や機能が伝わるようにしてください。
- コメントや文字列内の日本語はそのまま使用し、適切に説明に組み込んでください。

以上の指示に従って、与えられたファイルの内容を分析し、Markdown形式の説明を提供してください。

メインスクリプトの実行

では、実行します。

> python main.py /Users/user/WorkSpace/aituber-kit --exclude vrm vrma
 
ファイルをスキャン中...

処理対象となるファイル数: 75
除外されたファイル数:
  .gitignoreにより無視: 23
  .projectignoreにより無視: 23
  除外された拡張子: 3
  テキストファイルではない: 10
  空のファイル: 0
ファイル構造を生成中...
ファイルの説明を生成中...
  処理完了: tailwind.config.js
  処理完了: Dockerfile
  処理完了: next.config.js
  処理完了: electron.mjs
  処理完了: package.json
  処理完了: watch.json
  処理完了: tsconfig.json
  処理完了: docker-compose.yml
  処理完了: postcss.config.js
...

このように1ファイルずつ処理が進んで行きます。
最終的に出来上がったマークダウンファイルは こちら においておきます。

- 対象ファイル数: 75
- 出力結果行数: 1,828
- 実行時間: 507.00 秒
- API費用: $0.77

これでプロジェクトの情報を持った1つのマークダウンファイルが作成できました。

成果物の用途

このスクリプトで作成された長文ファイルは、プロジェクトの構造と各ファイルの詳細な説明を含む資料です。これを活用することで、以下のようなことが可能になると想定されます。

  1. プロジェクト概要の把握

    • 新しいチームメンバーや外部の開発者が、プロジェクトの全体像を素早く理解するのに役立ちます。

    • プロジェクトの構造や主要なコンポーネントを一目で把握できます。

  2. ドキュメンテーションの強化

    • 自動生成された説明を基に、より詳細な技術ドキュメントを作成できます。

    • README.mdやWikiページの内容を充実させるのに活用できます。

  3. コードレビューの効率化

    • レビュアーがファイルの目的や機能を事前に理解した上でコードを読むことができます。

    • 変更の影響範囲を素早く特定するのに役立ちます。

  4. リファクタリングの計画

    • プロジェクト全体の構造を俯瞰することで、改善が必要な箇所を特定しやすくなります。

    • 重複した機能や非効率な構造を見つけやすくなります。

  5. プロジェクト分析

    • ファイル数、関数数、モジュールの依存関係などの統計情報を抽出し、プロジェクトの複雑さを分析できます。

これらの用途により、プロジェクトの管理、開発、メンテナンス、そして知識の共有が大幅に改善される可能性があります。

最後に、今回の成果物を活用した Issue解析bot を作成したので紹介します。

Issue解析bot

このbotは下記の流れで実行されます。

  1. 上記で作成した要約ファイルをリポジトリに置いておく。

  2. Issueを作成する。タイトルと本文はできるだけ詳しく書く。

  3. Issue作成をトリガーにGithub Actionsが実行され、LLMを使用してIssueと要約ファイルから原因がありそうなファイルを複数候補に上げる

  4. 候補に上がったファイル名からコード全文を取得し、最初のIssueと一緒にLLMに投げて改善案を提示させる

これらの実行にはGithub Actions用のファイルとpythonファイルが必要です。
こちら に置いてあるので、興味がある方は見てみてください。

シンプルなファイルなのでご自身の環境に合わせて設定することも可能だと思います。
そのときは、ANTHROPIC_API_KEY をGithub Sttings > Environmentsに設定するのを忘れずに。

このツールは、現在 tegnike/aituber-kit に実装されています。
作成された改善案のサンプルは下記です。あまりに後半な修正が必要な不具合は難しいかもしれませんが、叩き台としては十分な内容と言えるでしょう。


この記事が気に入ったらサポートをしてみませんか?