コードベースをLLMに読みこませるプロンプトを作成する「code2prompt」を試す
GitHubレポジトリ
code2prompt
code2promptは、ソースツリー、プロンプトテンプレート、トークンカウント機能を備え、あなたのコードベースを単一のLLMプロンプトに変換するコマンドラインツール(CLI)である。
機能
このツールをディレクトリ全体で実行すると、ソースツリー構造とすべてのコードを詳細に説明する、適切にフォーマットされたMarkdownプロンプトが生成される。このドキュメントを、コンテクストウィンドウが大きいGPTまたはClaudeモデルのいずれかにアップロードし、以下を実行するよう指示できる。
- あらゆる規模のコードベースからLLMプロンプトを素早く生成する。
- ハンドルバーテンプレートでプロンプト生成をカスタマイズする。(デフォルトテンプレートを参照).
- gitignoreを尊重する。
- グロブパターンを使用してファイルをフィルタリングし、除外する。
- 生成されたプロンプトのトークンカウントを表示する。(詳細はトークナイザーを参照)
- オプションで、生成されたプロンプトにGit差分出力(ステージングファイル)を含める。
- 生成されたプロンプトを自動的にクリップボードにコピーする。
- 生成されたプロンプトを出力ファイルに保存する。
- ファイル名またはパスでファイルやフォルダを除外する。
- ソースコードブロックに行番号を追加する。
プロンプトテンプレートをカスタマイズして、希望する使用事例を実現することができる。 基本的には、コードベースを走査し、すべてのソースファイルを結合したプロンプトを作成する。 簡単に言えば、複数のソースファイルをプロンプトにコピー&ペーストする作業を自動化し、それらのフォーマットを行い、コードが使用するトークンの数を知らせる。
レポジトリをクローンして、Cursorで@codebase
に聞くと思えば同じかなとは思うけど、インタフェースを選ばないという点がメリットかな。
以下と同じような使い方ができそう
とりあえずDockerでやる。
$ docker run -it --rm rust:latest bash
コンテナに入ったら、cargoでインストール
$ cargo install code2prompt
$ code2prompt --help
Usage: code2prompt [OPTIONS] <PATH>
Arguments:
<PATH>
Path to the codebase directory
Options:
--include <INCLUDE>
Patterns to include
--exclude <EXCLUDE>
Patterns to exclude
--include-priority
Include files in case of conflict between include and exclude patterns
--exclude-from-tree
Exclude files/folders from the source tree based on exclude patterns
--tokens
Display the token count of the generated prompt
-c, --encoding <ENCODING>
Optional tokenizer to use for token count
Supported tokenizers: cl100k (default), p50k, p50k_edit, r50k, gpt2
-o, --output <OUTPUT>
Optional output file path
-d, --diff
Include git diff
--git-diff-branch <BRANCHES>
Generate git diff between two branches
--git-log-branch <BRANCHES>
Retrieve git log between two branches
-l, --line-number
Add line numbers to the source code
--no-codeblock
Disable wrapping code inside markdown code blocks
--relative-paths
Use relative paths instead of absolute paths, including the parent directory
--no-clipboard
Optional Disable copying to clipboard
-t, --template <TEMPLATE>
Optional Path to a custom Handlebars template
--json
Print output as JSON
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
では適当なレポジトリをクローンする。今回はStreamlitのチャットのサンプルを使用させていただく。
$ git clone https://github.com/streamlit/chatbot-template
code2promptにクローンしたディレクトリを渡す。
$ code2prompt chatbot-template
なるほど、自動でクリップボードにコピーしてくれるらしい。今回はDockerなのでホスト側のクリップボードにアクセスできない。
▹▹▹▹▸ Done!
[!] Failed to copy to clipboard: Failed to initialize clipboard: Unknown error while interacting with the clipboard: X11 server connection timed out because it was unreachable
レポジトリの内容は以下のような感じでテキスト化される。
Project Path: chatbot-template
Source Tree:
```
chatbot-template
├── streamlit_app.py
├── requirements.txt
├── LICENSE
└── README.md
```
`/chatbot-template/streamlit_app.py`:
```py
import streamlit as st
from openai import OpenAI
# Show title and description.
st.title("💬 Chatbot")
st.write(
"This is a simple chatbot that uses OpenAI's GPT-3.5 model to generate responses. "
(snip)
code2promptの特徴は、いろんなコマンドラインオプションがあることだと思う。
--output-text
で出力ファイル名を指定
$ code2prompt chatbot-template --output=output.txt
(snip)
[✓] Prompt written to file: output.txt
$ head -5 output.txt
Project Path: chatbot-template
Source Tree:
```
--tokens
でトークン量を出力してくれる。巨大なコードベースだとモデルによっては飲み込めない場合もあると思うで、参考になると思う。--encoding
でトークナイザーを指定することもできる。
$ code2prompt chatbot-template --tokens --encoding=cl100k | head -5
▹▹▹▹▸ Done!
[i] Token count: 3049, Model info: ChatGPT models, text-embedding-ada-002
(snip)
--include
/--exclude
でプロンプトに含めるファイルの指定ができる。
# code2prompt chatbot-template --include="*.py"
Project Path: chatbot-template
Source Tree:
```
chatbot-template
├── streamlit_app.py
├── requirements.txt
├── LICENSE
└── README.md
```
`/chatbot-template/streamlit_app.py`:
```py
import streamlit as st
from openai import OpenAI
(snip)
$ code2prompt chatbot-template --exclude="*.py"
Project Path: chatbot-template
Source Tree:
```
chatbot-template
├── streamlit_app.py
├── requirements.txt
├── LICENSE
└── README.md
```
`/chatbot-template/requirements.txt`:
```txt
streamlit
openai
```
`/chatbot-template/LICENSE`:
(snip)
あと面白いのは、出力テンプレートが用意されているところ。以下のようなテンプレートが用意されている。
document-the-code.hbs
- このテンプレートを使用して、コードのドキュメント化のためのプロンプトを生成する。コードベース内のすべてのパブリック関数、メソッド、クラス、モジュールにドキュメントコメントを追加する。
find-security-vulnerabilities.hbs
- このテンプレートを使用して、コードベースの潜在的なセキュリティ脆弱性を検出するためのプロンプトを生成する。一般的なセキュリティ問題を探し、その修正または緩和方法に関する推奨事項を提供する。
clean-up-code.hbs
- このテンプレートを使用して、コードのクリーンアップと品質向上のためのプロンプトを生成する。可読性、ベストプラクティスの順守、効率性、エラー処理などの改善の機会を探す。
fix-bugs.hbs
- このテンプレートを使用して、コードベースのバグ修正に関するプロンプトを生成する。問題の診断、修正の提案、提案された修正によるコードの更新に役立つ。
write-github-pull-request.hbs
- このテンプレートを使用して、2つのブランチのgit diffとgit logを比較し、GitHubのプルリクエストの説明をMarkdownで作成する。
write-github-readme.hbs
- このテンプレートを使用すると、GitHubでのホスティングに適した、プロジェクト用の高品質なREADMEファイルを生成できる。コードベースを分析してその目的と機能性を理解し、Markdown形式でREADMEコンテンツを生成する。
write-git-commit.hbs
- このテンプレートを使用して、Git ディレクトリ内のステージングされたファイルから Git コミットを生成する。 コードベースを分析してその目的と機能性を理解し、Markdown 形式で Git コミットメッセージを生成する。
improve-performance.hbs
- このテンプレートを使用して、コードベースのパフォーマンスを改善するためのプロンプトを生成する。 最適化の機会を探し、具体的な提案を行い、コードを変更して更新する。
cargoでインストールした場合は、以下のディレクトリにテンプレートファイルがあった。
$ find /usr/local -type f -name "**.hbs" | grep code2prompt
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/src/default_template.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/binary-exploitation-ctf-solver.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/document-the-code.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/write-github-pull-request.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/write-git-commit.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/write-github-readme.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/clean-up-code.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/cryptography-ctf-solver.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/find-security-vulnerabilities.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/refactor.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/improve-performance.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/reverse-engineering-ctf-solver.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/fix-bugs.hbs
/usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/web-ctf-solver.hbs
READMEに記載されているもの以外にもテンプレートはあるみたい。
とりあえずclean-up-code.hbs
を使ってみる。
$ code2prompt chatbot-template -t /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/code2prompt-2.0.0/templates/clean-up-code.hbs
デフォルトだと単にソースツリーと各ファイルの内容だけが出力されていたのが、プロンプトが含まれるようになっている。
Project Path: chatbot-template
I'd like your help cleaning up and improving the code quality in this project. Please review all the code files carefully:
Source Tree:
```
chatbot-template
├── streamlit_app.py
├── requirements.txt
├── LICENSE
└── README.md
```
`/chatbot-template/streamlit_app.py`:
```py
import streamlit as st
from openai import OpenAI
(snip)
When reviewing the code, look for opportunities to improve:
- Readability and clarity
- Adherence to language idioms and best practices
- Modularity and code organization
- Efficiency and performance (within reason)
- Consistency in style and conventions
- Error handling and reliability
- Simplicity (remove unused code, simplify complex logic)
- Naming of variables, functions, classes, etc.
- Formatting and whitespace
- Comments and documentation
Make sure your changes don't alter existing behavior (except perhaps for improved error handling). Try to infer the original intent as much as possible, and refactor towards that intent.
For each change you make, include a brief code comment explaining your rationale, something like:
// Refactored to improve readability and efficiency.
// Combined error handling logic into a reusable function.
Be thoughtful and judicious with your changes. I trust your programming expertise! Let me know if any part of the original code is unclear.
テンプレートはHandleBarsで書かれているので、自分でカスタマイズして使ったり、スクラッチで作るのも簡単にできそう。
Project Path: {{ absolute_code_path }}
I'd like your help cleaning up and improving the code quality in this project. Please review all the code files carefully:
Source Tree:
```
{{ source_tree }}
```
{{#each files}}
{{#if code}}
`{{path}}`:
{{code}}
{{/if}}
{{/each}}
When reviewing the code, look for opportunities to improve:
- Readability and clarity
- Adherence to language idioms and best practices
- Modularity and code organization
- Efficiency and performance (within reason)
- Consistency in style and conventions
- Error handling and reliability
- Simplicity (remove unused code, simplify complex logic)
- Naming of variables, functions, classes, etc.
- Formatting and whitespace
- Comments and documentation
Make sure your changes don't alter existing behavior (except perhaps for improved error handling). Try to infer the original intent as much as possible, and refactor towards that intent.
For each change you make, include a brief code comment explaining your rationale, something like:
// Refactored to improve readability and efficiency.
// Combined error handling logic into a reusable function.
Be thoughtful and judicious with your changes. I trust your programming expertise! Let me know if any part of the original code is unclear.
まとめ
オプションも色々合って、カスタマイズもやりやすそうなので、使い勝手は良さそう。やっていることはシンプルなので、Rustのコードを学ぶのにもいいと思う。