💡

IoT用コードをchatGPTに出力させるコツ

2023/04/05に公開

1. はじめに

シンギュラリティの到来か?と話題のopenAIのchatGPTは、webの情報を蓄積したチャットボットです。chatGPTは、github copilotと違い、無料で利用できる(2023.3/30現在)ので、IoTなどの開発でも利用しない手はないでしょう。
今回は、chatGPTでコードを出力させるコツを記載します。

2. 指示文章

2.1. 指示文章でコード出力

chatGPTのユーザの間では、目的の内容を出力させる文章をプロンプトと呼んでいます。ここでは、指示文章と表現することにします。
指示文章は次のようなものです。

指示文章 1. 指示文章の例

**に従って***の****を作ってください
**について
:
:

例えば次のように記載します。

指示文章 2. 温度計測用コードを出力させる文章

要件を満たすarduino-IDEでESP32のプログラムを作成してください。
要件
- 温度をシリアルモニタに10ミリ秒毎に表示
- 温度は電圧値から0.424 V を引いて、160をかけた値
- 電圧値は、GPIO33番からアナログ値で読み込む。
- アナログ値は、電圧値を最大3.3V、12bitで読み込まれる
- 電圧値は、0.1の重みで平滑化する
- シリアルポートは115200bps

これをchatGPTの入力窓に入れると、プログラムが表示されます。

リスト 1. 出力された温度計測用コード

const int analogPin = 33;  //アナログ読み込みピン番号
const float voltageMax = 3.3;  //最大電圧
const int bit = 12;  //ビット数
const float weight = 0.1;  //平滑化の重み

float voltage, smoothedVoltage, temperature;

void setup() {
  Serial.begin(115200);  //シリアルポートの設定
  pinMode(analogPin, INPUT);  //アナログピンの入力設定
}

void loop() {
  voltage = analogRead(analogPin) * (voltageMax / pow(2, bit));  //アナログ読み込み
  smoothedVoltage = smoothedVoltage * (1 - weight) + voltage * weight;  //平滑化
  temperature = (smoothedVoltage - 0.424) * 160;  //温度計算
  Serial.println(temperature);  //シリアルモニタに表示
  delay(10);  //10ミリ秒待機
}

2.2. コード出力の指示文章を簡略化

指示文章2を見ると、コードをそのまま日本語で書いてある感じです。これでは何も楽ではありません。そこで、次のようにもう少し短い指示を考えて見ます。

指示文章 3. 温度計測用コードを出力させる文章

要件を満たすarduino-IDEでESP32のプログラムを作成してください。
要件
- 温度をシリアルモニタに10ミリ秒毎に表示
- 温度はGPIO33番に接続したテキサスインスツルメンツの温度センサLM60より取得
- 温度は0.1の重みで平滑化する
- シリアルポートは115200bps

温度を取得する部分は1行になっているのがわかります。
ESP32のアナログ読み込みの仕様と、温度センサLM60の仕様を盛り込んだコードを、という指示になります。

従来、IoTでセンサノードを自作する場合、利用するデバイスについて調査して、それをプログラムにして、という作業が必要になります。chatGPTでは、調査→プログラム の作業を省略できる可能性があるということになります。

3. 指示文章のコツ

3.1. 具体的な指示が必要な例

前章で指示文章の簡略化を示しましたが、要求を一言で表すことができれば、それを指示文章として入力すればよいことが判ります。ところが、その指示には勘所があります。

例えば、「円周率を求めるコードを作れ」というのは、判り易い一言だと思います。

指示文章 4. 円周率を求めるコードを出力させる文章

円周率を求めるコードを作ってください

この指示で出力されるのは次のようなものです。

リスト 2. 出力された円周率を出力するコード

import math

# 円周率を求める
pi = math.pi

print(pi)

きっと、これを見て「何か違う」と思ったのではないでしょうか。このコードは、予め用意された定数を出力しているに過ぎません。「円周率を求める」とは、「円周率を計算」してほしい訳ですが、chatGPTの解釈は「円周率を得る」になっていると思われます。なお、「円周率を計算して出力するコードを作って下さい」と入力しても上記と同じ結果になることが多いようです。

では何が必要なのでしょうか?

実は、ここで必要なのは「アルゴリズム」の指示なのです。そこで、次のようにchatGPTに質問しましょう。

指示文章 5. アルゴリズムを列挙

円周率を求めるアルゴリズムについて教えてください

そうすると、様々なアルゴリズムを列挙してくれます。その中で「ライプニッツの公式」という単語が出ますので、これを利用してみましょう。

指示文章 6. 具体的なアルゴリズムを指示してコードを出力させる文章

円周率をライプニッツの公式で求めるコードを作って下さい

すると、次のコードが出力されます。

リスト 3. 出力された円周率を計算して出力するコード

# 計算する項数
n = 1000000

# 初期値を設定
pi = 0
sign = 1

# ライプニッツの公式で円周率を計算
for i in range(n):
    pi += sign / (2 * i + 1)
    sign *= -1

pi *= 4

# 結果を出力
print(pi)

今度は実際に計算して出力するコードが出力されました。

以上のように、chatGPTでコードを出力させるには、曖昧さの少ない具体的な指示が求められます。

3.2. IoT用コード生成のための具体的な指示

chatGPTにコードを出力させる場合、次の2点を理解して指示文章を作成すると良いでしょう。

  • 共通した概念のある言葉
  • 設定すべき数値や条件

例えば、「デバイスでESP32」とデバイスを指示し場合、これはIoT向けの32bitマイコンであることが共通の概念になります。共通の概念なのかどうかは、google検索して出るか出ないか、と考えれば良いと思います。

例えば、人にコード作成を次のように依頼することにしましょう。

  • マイコンはESP32
  • プログラム開発環境はarduino-IDE
  • 録音するのが目的
  • デジタルマイクを利用

ここまで記せば、コードを作ってもらえるか?というと、そうではないはずです。
しかも、逆に次のような質問をされるはずです。

  • デジタルマイクの種類は?
  • サンプリングレートは?
  • どんな風に録音して、それをどうするの?

いくら人であっても、こちらで要求事項を示さないと作れない訳です。これは、chatGPTでも同じことがいえます。

ここでは、次のような仕様にしたとします。

  • PDM型デジタルマイクSPM0405HD4H
  • サンプリング周波数は44.1kHz
  • リセット後に1秒間録音し、シリアルモニタで数値で出力

これらの要求事項を含め、次のように指示文章を作ります。

指示文章 7. デジタルマイクで録音するコードを作成させる文章

要件を満たすarduino-IDEでESP32のプログラムを作成してください。
要件
- 音声サンプリングしたデータを10進数でシリアルモニタに表示
- 音声サンプリングは、PDM型デジタルマイクSPM0405HD4Hを用いて、I2SのWSピンはGPIO26番に接続、I2SのDinピンはGPIO34番に接続している
- 音声サンプリングの周波数は44.1kHz
- 音声サンプリングの長さは1秒間
- I2Sのバッファ長は128にする
- 音声サンプリングが1秒経ったら、整数値でシリアルモニタに表示
- シリアルポートは115200bps

こちらで決めた仕様を漏れなく記載します。
また、「PDM型デジタルマイク」と表記することで、I2Sの動作モードが指定されます。ここはI2Sの設定内容を具体的に記載しなくても共通理解であるとしています。
このように必要な部分を記載することで、意図したコードが出力されます。

4. おわりに

本来は、はじめに に記載する内容ですが、chatGPTは膨大な知識を持つチャットボットです。チャットボットの技術分野を自然言語処理といい、この分野の研究者によって様々な言語モデルと呼ばれる機械学習の構造が研究されています。そして、言語モデルの1つであるGPTでLLM(Large Languege Model,大規模言語モデル)が構築され、chatGPTが実現されています。また、同じくGPTを用いたサービスで、github copilotというコード生成サービスが既にあります。このサービスはコメント部分など作りたいコードを言葉で記述するとコードを出力してくれるというものです。chatGPTもgithubを学習していると予想されることから、同様の機能を持っていると予想されます。chatGPTは様々な質問に回答してくれる点と、無料でも利用できる点がgithub copilotとの違いです。(2023.3/30現在)

今回は、chatGPTにIoT用コードを出力させるためのコツについて記載しました。特に、具体的な指示がなければ、目的のコードが出力されないことが重要な点です。
余談ですが、業務などでプログラムを外注で依頼する際に必要なものに仕様書があります。仕様書が間違っていると納品されるプログラムもこちらが想定していたものとは違う動きをする場合があります。そうなると、依頼費用や作業自体が無駄になりかねません。それだけ仕様書の完成度は重要なのです。
将来的にchatGPTも仕様書を渡せば大規模なコードを出力してくれるようになるかもしれません。いよいよ、コードの完成度は仕様書の完成度ということになります。
つまり、作りたいものを論理的に記述するという作業は、なかなか消えないでしょうし、もしかしたら、ますます重要になるかもしれませんね。

Discussion