ChatGPTなるものが世間を賑わせています。
(世間ってどこよ?)
自然言語処理のための大規模言語モデルの1つです。
文章生成、対話システム、テキストマイニングなどに活用できるシステム。
ざっくり言うと、
・パソコン上で利用できて
・「普段の会話感覚」で文章を入力すると
・いろいろな文字列を作り出してくれる
そんなサービスです。
例えば
最初のデートで、相手を喜ばせるには、どんな会話したら良いと思う?
と入力すると
最初のデートでは、お互いに興味を持つ話題を見つけたり、相手に好印象を与えることが重要です。以下は、相手を喜ばせる可能性のある会話のトピックの例です。
- 趣味や興味を尋ねる
- どのような趣味や娯楽が好きですか?
- 最近読んだ本や映画は何ですか?
- 旅行で行ってみたい場所はありますか?
- 仕事や学校について話す
- 仕事や学校で何をしているのですか?
- どんなキャリアゴールを持っていますか?
- 好きな職場環境は何ですか?
- 質問に答える
- 自分自身についてもっと知りたいことはありますか?
- 最近自分で新しいことを始めたり、挑戦したことはありますか?
- お互いに好きな食べ物やレストランは何ですか?
ただし、相手が話したいことや、話題に触れるのが適切であるかどうかを常に意識し、相手にリスペクトを示すことが大切です。また、相手が話をしているときは、真剣に聞き、興味を持って聞くことも重要です。
のような文が返ってきます。
上の様なふんわりとした対話もできますが、専門的な内容を扱うこともできます。
僕の専門の符号理論には「ハミング符号」と呼ばれる誤り訂正符号があります。
この誤り訂正の仕組みを「ソフトウェア実装」するために、ChatGPTを使ってみましょう。
ハミング符号の復号アルゴリズムをC言語で記述して下さい。
と入力したところ、次の回答がありました。
以下は、ハミング符号の(7, 4)符号化方式の復号アルゴリズムの例です。このアルゴリズムは、エラー訂正が可能な1ビットの誤りを検出でき、1ビットの誤りを訂正することができます。
続いて
#include <stdio.h>
int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[1] + received[3]) % 2;
syndrome[1] = (received[0] + received[2] + received[3]) % 2;
syndrome[2] = (received[1] + received[2] + received[3]) % 2;// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);return 0;
}
実際の入出力の画面キャプチャがこちらです。

思わず、
ChatGPTって賢い!!!
と思ってしまったのですが。
よく見ると
「シンドロームを計算する」以降の4行は、計算が間違っています。
そこで間違いを指摘します。具体的には次の入力をしました。
あなたのプログラムに間違いを発見しました。
syndrome[0]はreceivedの0,1,3の和ではなくて、0,2,4,6の和です。
syndrome[1]はreceivedの0,2,3の和ではなくて、1,2,5,6の和です。
syndrome[1]はreceivedの1,2,3の和ではなくて、3,4,5,6の和です。これらの3行を修正して下さい。
するとChatGPTからの返事は
申し訳ありません、間違いを修正します。正しいシンドロームの計算方法は以下の通りです:
// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;
その通りです。素晴らしい。
では、修正版のソースコード全体を出力して下さい。
#include <stdio.h>
int main() {
int received[7]; // 受信した符号語
int decoded[4]; // 復号した情報語
int error_bit = 0; // エラーがあったビットの位置printf(“Enter the received codeword (7 bits): “);
for (int i = 0; i < 7; i++) {
scanf(“%d”, &received[i]);
}// シンドロームを計算する
int syndrome[3] = {0};
syndrome[0] = (received[0] + received[2] + received[4] + received[6]) % 2;
syndrome[1] = (received[1] + received[2] + received[5] + received[6]) % 2;
syndrome[2] = (received[3] + received[4] + received[5] + received[6]) % 2;// シンドロームからエラーの位置を特定する
error_bit = syndrome[0] + syndrome[1]*2 + syndrome[2]*4;if (error_bit != 0) {
printf(“Error detected at bit %d\n”, error_bit);
// エラーを訂正する
received[error_bit – 1] = (received[error_bit – 1] + 1) % 2;
printf(“Corrected codeword is: “);
for (int i = 0; i < 7; i++) {
printf(“%d”, received[i]);
}
printf(“\n”);
} else {
printf(“No errors detected\n”);
}// 復号する
decoded[0] = received[2];
decoded[1] = received[4];
decoded[2] = received[5];
decoded[3] = received[6];printf(“Decoded message is: “);
for (int i = 0; i < 4; i++) {
printf(“%d”, decoded[i]);
}
printf(“\n”);return 0;
}
ChatGPTに対する私の印象は
よく間違えるけど作業の早いアシスタント
です。
とにかく間違えます。
ですから、
利用側に
正解と不正解を見極められる力
が要求されます。
上手く活用すれば、
自分で考えるよりも早くプログラミングできます。
デートの例もそうですが、
それらしい答えを短時間で導いてくれます。
ただし、あてになるかどうか分かりません。