ChatGPTにプロジェクトのコードをより簡単に理解させる方法

AIと機械学習が急速に発展する中で、ChatGPTに特定のプロジェクトや特定分野のコードを理解させることの価値はますます高まっています。直接的な方法の一つは、コードリポジトリをモデルが検索しやすく理解しやすいテキスト資料として整理し、カスタム知識ベースやプロジェクト資料としてアップロードすることです。

この記事では、ディレクトリ内のPythonファイルをサブディレクトリごとにまとめてテキストファイルへ統合する、シンプルなPythonスクリプトを紹介します。これにより、コードの元パスを保持しつつ、細かなファイルが多数あることによる整理コストを減らせます。

背景

Pythonスクリプトでいっぱいのコードベースがあり、それぞれのスクリプトに価値あるコード片やプロジェクト知識が含まれていると想像してみてください。このコードベースを活用して、ChatGPTによるプロジェクト構造、ビジネスロジック、あるいは特定領域の実装方法への理解を深めたいとします。

課題は、大量の個別ファイルをそのままアップロードするのは不便なことが多く、モデルがコードとパスを素早く対応づけるうえでも不利だという点です。そのため、コードベースをより明確で取り込みやすいテキスト形式に変換する必要があります。

解決策

以下のスクリプトは、指定したディレクトリを走査し、各サブディレクトリ内の .py ファイルを一つの .txt ファイルにまとめ、統合した内容の中に元ファイルのパスを書き込みます。出力ファイルはソースディレクトリ内の相対パスに基づいて命名されるため、後からの特定や参照がしやすくなります。

この方法は、次の用途に向いています。

  • ChatGPTのプロジェクト知識ベース用資料を準備する。
  • コードレビューやリファクタリング作業にコンテキストを提供する。
  • 検索可能でアーカイブしやすいコードスナップショットを素早く生成する。
  • 元のプロジェクト構造を変更せずにコード資料を整理する。

仕組み

  1. ディレクトリの走査:スクリプトは os.walk を使って指定されたソースディレクトリをたどり、拡張子が .py のPythonファイルを識別します。
  2. ファイルの統合:同じサブディレクトリで見つかったすべてのPythonファイルを一つのテキストファイルにまとめ、それぞれのコード片の前に元ファイルのパスを書き込みます。
  3. 出力の整理:統合後のファイルはソースディレクトリ内の相対パスに基づいて命名されるため、出力構造も読みやすいまま保たれます。
  4. 柔軟性の維持:任意のソースディレクトリとターゲットディレクトリを指定できるため、さまざまなプロジェクトで利用できます。

コード

import os


def merge_py_files_by_directory(source_directory, target_directory):
    for subdir, dirs, files in os.walk(source_directory):
        py_files = [f for f in files if f.endswith('.py')]
        if py_files:
            relative_path = os.path.relpath(subdir, start=source_directory)
            new_filename = relative_path.replace(os.sep, '_') + '.txt'
            target_file_path = os.path.join(target_directory, new_filename)

            os.makedirs(target_directory, exist_ok=True)

            with open(target_file_path, "w") as outfile:
                for file in py_files:
                    file_path = os.path.join(subdir, file)
                    outfile.write(f"{'=' * 20}n")
                    outfile.write(f"File: {file_path}n")
                    outfile.write(f"{'=' * 20}nn")
                    with open(file_path, "r") as infile:
                        outfile.write(infile.read())
                        outfile.write("nn")


# 示例用法
source_directory = 'diffraction'
target_directory = 'merged_py_files'
merge_py_files_by_directory(source_directory, target_directory)

使用上の提案

実行前に、source_directory が整理したいプロジェクトディレクトリを指していること、target_directory が出力テキストを保存したいディレクトリを指していることを確認してください。例:

python merge_python_files.py

生成後は、いくつかの出力ファイルを抜き取り確認し、次の点をチェックするとよいでしょう。

  • ファイルパスが正しく保持されているか。
  • コード内容が完全か。
  • 出力ディレクトリに想定したサブディレクトリの内容が含まれているか。
  • 仮想環境、キャッシュディレクトリ、サードパーティ依存コードを除外する必要があるか。

プロジェクトが大きい場合は、.venvvenv__pycache__site-packages などのディレクトリをスクリプト内で追加で除外し、無関係な依存関係を知識ベースにまとめてしまわないようにすることをおすすめします。

結論

この方法は、PythonコードベースをChatGPTが読み取りやすい知識ベース資料へ変換するための簡潔な道筋を提供します。元のコードは変更せず、構造化されたテキストコピーを生成するだけなので、プロジェクト理解、コードQ&A、リファクタリング準備、技術ドキュメント整理に適しています。

Leave a Reply