ソースコードを直接貼り付けずに生成AIにコードのパフォーマンスを改善してもらう方法 (問題点の抽出編)

はじめに

エンジニアの開発効率を向上させるために、昨今多くの会社で生成AIを導入する動きが見られます。

その中で、自社で開発したソースコードを生成AIに直接入力することは、知的財産の漏洩やセキュリティ上のリスクを発生させる懸念があります。

そこで本記事では、ソースコードを直接貼り付けずにAIにコードのコードのパフォーマンスを改善してもらう具体的な方法の中で、問題点を抽出した方法について紹介します。

問題点の抽出

コードの特定の問題点や疑問点だけを切り出し、その部分のみを質問としてAIに入力します。これにより、コード全体の内容を明かさずに具体的な問題解決を図ることができます。

例えば、以下のようなソースコードがあるとします。

ソースコード(ChatGPTによる例):

# データベースへの接続を設定
connection = psycopg2.connect(
    host="example_host",
    user="example_user",
    password="example_password",
    dbname="example_db"
)

# データベースからデータを取得する関数
def get_large_data():
    cursor = connection.cursor()
    try:
        cursor.execute("SELECT * FROM large_table")
        data = cursor.fetchall()
        return data
    finally:
        cursor.close()

# データ取得関数を呼び出し
large_data = get_large_data()

このソースコードにおける、データベースからのデータ取得速度が遅いという問題を解決しようとしているとき、以下のような手順でソースコードの問題点を抽出し、質問をして回答を得ます。

コード抽出のステップ:
1. 問題の特定: まず、コード全体を分析し、問題点を特定します。このケースでは、get_large_data関数内で大規模なテーブルから全てのデータを取得する際のパフォーマンスが問題点です。

  1. 関連するコードの特定・抽出: 次に、問題に直接関連するコードの部分を探し、抽出します。このケースでは、データを取得するためのクエリ実行部分であるcursor.execute(“SELECT * FROM large_table”)が重要点です。

抽出したソースコードの一部(ChatGPTによる例):

# データベースから大量のデータを取得するクエリ
cursor.execute("SELECT * FROM large_table")

質問の仕方(例):
大量のデータを含むデータベーステーブルからデータを効率的に取得するには具体的にどうすれば良いですか?例えば、”SELECT * FROM large_table” のようなクエリを実行する際に、パフォーマンスを最適化にどのような方法はありますか?


AIによる回答(ChatGPT):
大量のデータを含むデータベーステーブルからデータを効率的に取得するためには、以下のような方法を考慮すると良いでしょう。

1. 特定の列のみを選択する
・ SELECT * はテーブルの全ての列を取得しますが、これは必要以上のデータを読み込むことになり、パフォーマンスに悪影響を与えます。代わりに、必要な列のみを明示的に指定します。例:SELECT column1, column2 FROM large_table。

2. インデックスの使用
・ クエリで特定の条件を使用している場合、その条件にマッチする列にインデックスを作成することで、検索速度が向上します。例:SELECT * FROM large_table WHERE column1 = ‘some_value’というクエリであれば、column1にインデックスを設定します。

3. バッチ処理
・ 大量のデータを一度に取得するのではなく、小分けにして取得する方法です。例えば、LIMITとOFFSET句を使用してデータをページングします。例:SELECT * FROM large_table LIMIT 100 OFFSET 200 は201番目から300番目のレコードを取得します。

4. クエリの最適化
・ データベースの実行計画(EXPLAIN PLAN)を使用して、クエリのパフォーマンスを分析し、必要に応じてクエリを調整します。

5. データの分割 (パーティショニング)
・ テーブルを複数の小さなテーブルに分割(パーティショニング)することで、クエリの効率を向上させることができます。これにより、クエリが対象とするデータの量を減少させることができます。

6. キャッシュの利用
・ 頻繁にアクセスされるデータはキャッシュに保存することで、データベースへの負荷を減らし、パフォーマンスを向上させます。

7. 並列処理の利用
・ 複数のプロセスやスレッドを使用してデータを並列に取得することで、全体的な応答時間を短縮することができます

これらのアプローチを適切に組み合わせることで、大量のデータを含むデータベーステーブルからのデータ取得を効率化できます。それぞれのテクニックの適用は、使用しているデータベースの種類や特定のユースケースによって異なるため、状況に応じた最適な方法を選択することが重要です。


このように、ソースコードの問題点を抽出することで、実際のデータベース名やテーブルの構造などの詳細を伏せていますが、パフォーマンスに関する具体的なアドバイスを求めることができます。セキュリティリスクを最小限に抑えながら、必要な技術的なサポートを得ることが可能です。



その他の手法はこちらです。

コードの一般化:https://tech.kurojica.com/archives/59975/

擬似コード化:https://tech.kurojica.com/archives/59987/

ドキュメント化:https://tech.kurojica.com/archives/59994/