📙

ソースコードをリポジトリ丸ごとLLMに読んでもらう方法

2024/08/30に公開

はじめに

ソースコードをLLMに読んでもらうとき、単一ファイルだと楽なのですが、GitHubのリポジトリのように複数ファイルから構成されるプロジェクトだと困ってしまいますね。

リポジトリごとLLMに読んでもらえるようにいい感じにテキスト化できると良いですね。そんなソフトがありました。しかも2つ。

https://github.com/mpoon/gpt-repository-loader

https://github.com/Olemi-llm-apprentice/generate-project-summary

両方ともほとんどコンセプトは同じです。特に後者のgenerate-project-summaryは使い方も含めて、自分のやりたいことが、すでに開発者の清水れみおさんが以下の記事にまとめていました。

https://zenn.dev/olemi/articles/7b7992c055c64a

なので、あんまり書く必要ないのですが、せっかくなのでgpt-repository-loaderの使い方と、出力したファイルの別の活用方法について書いてみたいと思います。

gpt-repository-loaderでリポジトリをテキストに変換

使い方はREADMEに書いてあります。シンプルなソフトなので、特別なライブラリ(環境構築)は不要です。Pythonさえ使えれば大体動くと思います。以降は、Mac、Linux、Windows(WSL2)いずれかのターミナルでコマンドを実行していくことを想定しています。

リポジトリにあるサンプルのリポジトリをテキスト化する場合は以下の通りコマンドを実行します。

$ git clone https://github.com/mpoon/gpt-repository-loader
$ cd gpt-repository-loader
$ python3 gpt_repository_loader.py test_data/example_repo -o example.txt 

生成されたexample.txtの中身は以下のようになります。複数ファイルを全てテキストファイルにしてくれます。LLMが解釈しやすいように記述の解説もついています。

The following text is a Git repository with code. The structure of the text are sections that begin with ----, followed by a single line containing the file path and file name, followed by a variable amount of lines containing the file contents. The text representing the Git repository ends when the symbols --END-- are encounted. Any further text beyond --END-- are meant to be interpreted as instructions using the aforementioned Git repository as context.
----
file2.py
def hello():
    print("Hello, World!")

----
folder1/file3.py
def add(x, y):
    return x + y

--END--

適当なソフトとして、自分が作ったLLMでデータ処理を実施するソフトcode-cookerで試してみます。

gpt-repository-loader内で続いて、以下コマンドを実行します。

$ git clone https://github.com/karaage0703/code-cooker 
$ python3 gpt_repository_loader.py code-cooker -o code-cooker.txt

テキストに含めたくないファイルがある場合は.gptignoreに追加することで、除外することができます。細かいことですが、デフォルトでは.gptignoreLICENSEが指定されていますが、個人的には除外したくないので、私は.gptignoreからLICENSEは削除して、LICENSEファイルをテキスト化するようにしています。

リポジトリ毎テキスト化したソースコード情報の使い方

LLMのプロンプトとして入力

ChatGPT, Claude, GeminiといったLLMのプロンプトとして入力することができます。Geminiは特に入力できるプロンプト長が長いので有利ですね。

あとは、QAするなり、README生成するなり好きにできそうですね。

NotebookLMで要約&QA

GoogleのNotebookLMに入力するのも便利そうです。

いい感じにどんなソフトか解説してくれます。READMEがプアなソフトには助かりますね。

QAでソフトについて色々質問できます。

ただし、50万文字を超えるようなテキストは入力できないので注意しましょう。

巨大なソフトの場合

巨大なソフトの場合は、テキスト化するとプロンプトにはおさまらないことも出てきます。そういう場合はRAGを使うことで、QAを実現できます。

RAGはDifyを使うと比較的手軽に実現できます。クラウド版だと容量制限で引っかかるので、ローカルで設定ファイルを修正する必要があります。手順は以下記事を参照ください。

https://zenn.dev/karaage0703/articles/6bcbaf37d6607d

DifyとOllamaと組み合わせることで、ローカルLLMを使うことも可能です。

まとめ

コードをリポジトリごとLLMに読んで貰う方法について説明しました。これは、前からやりたいけれどやり方が分からず悩んでいたのですが、リポジトリを構造化してテキスト化するという方法であっさり実現することができました。テキスト化するソフトを開発した先駆者に感謝です。

こういう使い方だと、LLMのロングコンテキストが重要になってきますね。QA的な使い方ならRAGでよいですが、全体を要約とかは、ソースコード全体をプロンプトに入れるのがやりやすいですからね。プロンプトに100万トークンとか何に使うのかと思ってましたが必要ありますね。

関連記事

https://zenn.dev/karaage0703/articles/256c79babaf28d

https://zenn.dev/mkj/articles/93dbd6c9d94c58

Discussion