👀

プログラミングに関係する生成AIの調査

に公開

はじめに

プログラミングにおいて生成AIを活用することで生産性の向上が期待できそうなので、下準備として生成AIの種類と、できそうなことを調べました。

生成AIサービス一覧

サービス名 有料/無料 インタフェース 用途
ChatGPT 無料 対話型 汎用
Microsoft Copilot 無料 対話型 汎用
Google Gemini 無料 対話型 汎用
Claude 無料 対話型 汎用
GitHub Copilot 有料 自動補完型 コード生成
React Agent 無料 対話 React特化
Amazon Q Developer 無料 対話・自動補完両方 AWS特化

プログラミングでの活用例

一般的な質問

Copilot Edgeに以下の内容を入力しました。

ソートのアルゴリズムの種類を教えて下さい

以下の出力が得られました。

ソートのアルゴリズムにはいくつかの種類があります。それぞれのアルゴリズムには異なる特徴と用途があります。以下に代表的なソートのアルゴリズムをいくつか紹介します:

バブルソート:隣り合う要素を比較し、必要に応じて交換することでソートを行います。シンプルですが、効率はあまり良くありません。

選択ソート:リストの中から最小(または最大)の要素を選び、それを先頭(または末尾)に移動させることでソートを行います。

挿入ソート:リストの要素を順に取り出し、適切な位置に挿入することでソートを行います。小規模なデータセットに対しては効率的です。

マージソート:リストを半分に分割し、それぞれを再帰的にソートしてから結合することでソートを行います。安定したソートアルゴリズムです。

クイックソート:基準となる要素(ピボット)を選び、それより小さい要素と大きい要素に分割して再帰的にソートを行います。平均的には非常に高速です。

ヒープソート:ヒープデータ構造を利用してソートを行います。安定性はありませんが、効率的です。

これらのアルゴリズムはそれぞれ異なる特性を持っており、用途やデータの特性に応じて使い分けることが重要です。どのアルゴリズムについてもっと知りたいですか?

概ね質問を満足する回答内容です。

コーディング関連の質問

先程はCopilot Edgeでしたが、
今度はChatGPTに以下の内容を入力しました。

Please show me bubble sort C source.

以下の出力が得られました。

#include <stdio.h>

// Function to perform bubble sort
void bubbleSort(int arr[], int n) {
    int i, j, temp;
    
    // Outer loop for each pass through the array
    for (i = 0; i < n - 1; i++) {
        // Inner loop to compare adjacent elements
        for (j = 0; j < n - 1 - i; j++) {
            // If the current element is greater than the next, swap them
            if (arr[j] > arr[j + 1]) {
                // Swap arr[j] and arr[j + 1]
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// Function to print an array
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Unsorted array: \n");
    printArray(arr, n);

    // Perform bubble sort
    bubbleSort(arr, n);

    printf("Sorted array: \n");
    printArray(arr, n);

    return 0;
}

これもまた、概ね質問を満足する回答内容です。

コードレビュー

CopilotともChatGPTともさらに異なり、
今度はGeminiに以下の内容を入力しました。

次のCソースコードをレビューしてください。

#include <stdio.h>

int main(int argc, char *argv[])
{
   int *p = malloc(sizeof(int));
   *p = 5;
}

以下の出力が得られました。

問題点と改善点

  1. メモリリーク
    malloc で動的に確保したメモリ領域を free で解放していません。プログラム終了時に自動的に解放される保証はなく、メモリリークが発生します。

  2. エラー処理の不足
    malloc が失敗した場合(メモリ不足など)に、エラー処理が行われていません。NULL ポインタが返される可能性があるため、必ずチェックする必要があります。

  3. 戻り値の無視
    main 関数の戻り値 int 型ですが、何も返していません。通常、正常終了を 0、異常終了をそれ以外の値で返すのが慣習です。

修正後のコード

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   int *p = malloc(sizeof(int));

   // メモリ確保失敗時のチェック
   if (p == NULL) {
       perror("malloc");
       return 1; // 異常終了
   }

   *p = 5;

   // メモリの解放
   free(p);

   return 0; // 正常終了
}

その他、説明などありましたが省略します。

これが満足する内容かどうかはレビュアーの能力にもよると思いますが、
私は概ね満足する内容であると判断します。

ユニットテスト

Copilot Edgeに以下の内容を入力しました。
この文章のUnityはC言語のユニットテスト用のフレームワークのことを指しています。

Please show me unity unit test code for following function.

int multiply(int x, int y)
{
   return x+y;
}

以下の出力が得られました。

#include "unity.h"

// Function prototype
int multiply(int x, int y);

void setUp(void) {
   // Set up code, if needed
}

void tearDown(void) {
   // Clean up code, if needed
}

void test_multiply(void) {
   TEST_ASSERT_EQUAL(6, multiply(2, 3));
   TEST_ASSERT_EQUAL(0, multiply(0, 5));
   TEST_ASSERT_EQUAL(-15, multiply(-3, 5));
   TEST_ASSERT_EQUAL(25, multiply(-5, -5));
}

int main(void) {
   UNITY_BEGIN();
   RUN_TEST(test_multiply);
   return UNITY_END();
}

実装は加算になってしまっていますが、関数名は乗算(multiply)なので、乗算をテストするコードが生成されていることがわかります。
(実装が間違っているのか関数名が間違っているのかは状況次第ですが)

そして生成されたコードは、符号の正負の組み合わせと0に対する乗算が0になることをテストしています。

実際にはオーバーフローなどもテストしたいところです。
しかし、生成AIに完璧な結果を求める必要はなく、それよりはむしろ生成AIの出力結果をプログラマが確認して、フィードバックなり補完なりした方が良いでしょう。
その点ではこの出力は効率的であり、満足する内容であると判断します。

組織内の事情に合わせたカスタマイズが可能

「組織特有の知識はインターネットでは見つからない。故に他者とのコミュニケーションは大事である。」
確かにそのとおりです。それとは別に知識を属人化せずに共有しようよ、とは思いましたが。
社内独自のライブラリなどがある場合には、生成AIがそのことを事前に知るのは難しいでしょう。

では、「生成AIは組織独自の情報には対応できないので仕事には使えない」となるのでしょうか?
その答えはノーであると私は判断しました。

確かにAIモデルをそのまま使うのであれば組織内の事情には対応できないこともあるでしょう。
しかし、この問題に対処する技術もすでに存在します。キーワードだけにとどめますが、「ファインチューニング」と「RAG」などを活用すれば、組織内の事情を反映した状態で生成AIを活用することができます。

私は組織の内側でしか使えない知識や技術に対してはあまり興味はありませんが、
組織内の事情に精通した人間の価値を否定するわけではありません。
しかし、「インターネットの情報で学習した生成AIなんて仕事では使えないから関係ない」と考えるのは推奨しません。あなたの組織に精通した生成AIを作ることもできます。

所感

生成AIの出力内容を判断するのには専門知識と経験を持った人間が未だ必要とされています。
博識であることやプログラミングの経験が豊富であることの価値は今しばらくは失われないとは思いますが、プログラミングに特化することを目指していた私としては今後のキャリアを今一度考え直す必要があると感じました。

Discussion