Closed4

コードベースをLLMに読みこませるプロンプトを作成する「code2prompt」を試す

kun432kun432

GitHubレポジトリ

https://github.com/mufeedvh/code2prompt

code2prompt

code2promptは、ソースツリー、プロンプトテンプレート、トークンカウント機能を備え、あなたのコードベースを単一のLLMプロンプトに変換するコマンドラインツール(CLI)である。

機能

このツールをディレクトリ全体で実行すると、ソースツリー構造とすべてのコードを詳細に説明する、適切にフォーマットされたMarkdownプロンプトが生成される。このドキュメントを、コンテクストウィンドウが大きいGPTまたはClaudeモデルのいずれかにアップロードし、以下を実行するよう指示できる。

  • あらゆる規模のコードベースからLLMプロンプトを素早く生成する。
  • ハンドルバーテンプレートでプロンプト生成をカスタマイズする。(デフォルトテンプレートを参照).
  • gitignoreを尊重する。
  • グロブパターンを使用してファイルをフィルタリングし、除外する。
  • 生成されたプロンプトのトークンカウントを表示する。(詳細はトークナイザーを参照)
  • オプションで、生成されたプロンプトにGit差分出力(ステージングファイル)を含める。
  • 生成されたプロンプトを自動的にクリップボードにコピーする。
  • 生成されたプロンプトを出力ファイルに保存する。
  • ファイル名またはパスでファイルやフォルダを除外する。
  • ソースコードブロックに行番号を追加する。

プロンプトテンプレートをカスタマイズして、希望する使用事例を実現することができる。 基本的には、コードベースを走査し、すべてのソースファイルを結合したプロンプトを作成する。 簡単に言えば、複数のソースファイルをプロンプトにコピー&ペーストする作業を自動化し、それらのフォーマットを行い、コードが使用するトークンの数を知らせる。

kun432kun432

とりあえず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のチャットのサンプルを使用させていただく。

https://github.com/streamlit/chatbot-template

$ 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.
kun432kun432

まとめ

オプションも色々合って、カスタマイズもやりやすそうなので、使い勝手は良さそう。やっていることはシンプルなので、Rustのコードを学ぶのにもいいと思う。

このスクラップは2ヶ月前にクローズされました