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

はじめに

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

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

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

コードの一般化

ソースコードの具体的な部分を抽象化または変更して、問題の本質を維持しつつセキュリティリスクを回避します。これにより、コードの機密性を保ちながらAIによってコードの作成や添削をしてもらうことができます。

例えば、以下のようなソースコードがあるとします。このソースコードは、特定のデータベースからデータを取得する関数を持っています。

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

import psycopg2

def get_user_data(user_id):
    connection = psycopg2.connect(
        host="mydb.example.com",
        user="username",
        password="password",
        dbname="mydatabase"
    )
    cursor = connection.cursor()
    query = f"SELECT * FROM users WHERE id = {user_id}"
    cursor.execute(query)
    result = cursor.fetchall()
    cursor.close()
    connection.close()
    return result

このソースコードの、データベースの接続情報や特定のクエリを秘匿したい場合、以下のような手順でソースコードの一般化を行い、質問をして回答を得ます。

コードの一般化ステップ:
1. データベース接続情報の抽象化: 具体的な接続情報(ホスト名、ユーザ名、パスワードなど)を隠し、これらを代表する一般的な関数に置き換えます。このケースでは、create_db_connectionとして置き換えます。

  1. クエリの抽象化: 特定のクエリを含む部分を、一般的なクエリを実行する関数に置き換えます。これにより、特定のテーブル名やカラム、条件などの詳細を隠します。このケースでは、execute_queryに置き換えます。

  2. 関数の一般化: 関数の名前や引数を、特定のビジネスロジックやデータモデルに依存しない形に置き換えます。このケースでは、get_user_data関数を、より一般的なget_data_from_db関数に置き換えます。

一般化したコード(ChatGPTによる例):

def get_data_from_db(query):
    # DB接続設定は抽象化されています
    connection = create_db_connection()
    data = execute_query(connection, query)
    return data

質問の仕方(例):
データベースからデータを取得する際に、パフォーマンスを向上させる最適な方法は何ですか?具体的に教えてください。上記のような一般的な関数を使用しています。


AIによる回答(ChatGPT):
データベースからデータを取得する際のパフォーマンス向上にはいくつかの一般的なアプローチがあります。ご提供いただいた一般化された関数get_data_from_dbに基づいて、以下の最適化戦略を考慮することができます。

1. 効率的なクエリの記述
・ 不要なデータの除外: 必要なデータのみを取得するために、SELECT文で具体的な列を指定します。例えば、SELECT *の代わりにSELECT column1, column2と記述します。
・ インデックスの利用: 頻繁に検索される列にインデックスを作成することで、検索速度が向上します。
・ JOINの最適化: 必要なテーブルのみを結合し、不要な結合は避ける。

2. データベース接続の管理
・ 接続プールの利用: 接続プールを使用して、データベースへの接続と切断を繰り返さないようにします。これにより、接続のオーバーヘッドが減少します。
・ トランザクションの管理: 複数のクエリを一つのトランザクションとしてまとめて実行し、不要なコミットやロールバックを避けます。

3. クエリキャッシング
・ クエリ結果のキャッシュ: 頻繁に実行されるクエリの結果をキャッシュし、同じクエリが再度実行された際にはキャッシュからデータを取得します。

4. データの分割 (パーティショニング)
・ クエリ計画の分析: 実行計画を使用してクエリを分析し、非効率なジョイン、フルテーブルスキャン、その他のパフォーマンスに影響を与える要因を特定し、最適化します。

5. データベースのチューニング
・ データベースの設定: データベースの設定を最適化し、パフォーマンスに影響を与えるパラメータ(例えば、バッファサイズやキャッシュ設定)を調整します。

これらのアプローチを適切に組み合わせることで、データベースからデータを取得する際のパフォーマンスを大幅に向上させることが可能です。データベースの種類(SQL Server、MySQL、PostgreSQLなど)によって最適な戦略は異なる場合があるため、具体的なデータベース管理システムのドキュメントやベストプラクティスを参照することも重要です。


このように、ソースコードの一般化を行うことで、コードの一般化を行う方法では実際のデータベースの接続情報やクエリの内容を隠していますが、パフォーマンスに関するアドバイスや最適な方法を求めることができます。コードの機密性を保ちつつ、生成AIから有用なフィードバックを得ることが可能です。



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

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

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

問題点の抽出編:https://tech.kurojica.com/archives/59992/