はじめに
- 生成AIの実力を知りたい
- どのようにプロンプトを書いたら生成AIは上手に成果物を作ってくれるのか知りたい
- 仕事で楽をしたい
- 今回の記事のレーティング:
生成AIの台頭
最近何かと生成AIが話題になることが多いな。わしもメールの返信を考えてもらったりするのにたまに使っているが、PID制御のような専門的な内容まで任せられるのか??
どうでしょう?試してみましょう!今回はこれまでは人力に頼っていた仕事を機械に任せちゃおう!をピックアップします。今最も人気のあるChatGPTと、知能が最強と噂のClaude AIを使っていきますよ~
今日は色々なデバイスに幅広く使われている古典的な制御ロジック:PID制御のシミュレータをChatGPTとClaude AIを使って作ってみるよ。従来なら人の手でプログラミングが必要だったし、うまく制御するためには制御工学の専門的な理論を用いた最適化ロジックや職人芸のようなパラメータの調整(ゲインチューニング)が必要だったけど、果たしてAIの実力は…!?
流行りの生成AIについて、コード生成や数値計算ができるものとしては、下記のようなものがあります。既に仕事で使っている方も多いのではないでしょうか?中でも特にChatGPTとClaude AI(以下Claudeと省略)はコード生成に優れているため、そのポテンシャルを見て行きましょう!
- ChatGPT 🌟
- Copilot
- Claude AI 🌟
- Gemini
- Deepseek
ChatGPTは日常業務にも欠かせない存在になってて私もほぼ毎日使っています。でも複雑はタスクはどこまでできるのか!?気になっている方に向けてこの記事を書いてみました!日頃から使い慣れている人も、生成AIってよく聞くけど、どうやって活用したらいいんだろう??っていう人も読んでみてくださいね!
PID制御について
今回ピックアップするPID制御っていうのは主に装置の制御に使われる最も原始的な方式の一つで、とある入力に対して目標値に達するためにどのような入力をしたら良いのかを決めて、指示を与えることで、素早く正確に目標値に到達させるために用いられているよ。古典制御で最も広く使われている昔からある方式なんだ。
例えば、直進している船を左に回転させたいとします。
舵を切っても瞬時に反応するわけではなくて、船はゆっくりと回転しながら最終的には行きたい向きを向きますが、ここには時間差が生じます。
どれぐらい舵を切り込めば最も素早く、かつ正確に行きたい方向を向くのか?
この舵切量を自動的に決めてくれるのがPID制御器です。
この記事では、AIを使うこと自体が目的なのでPIDの詳細については割愛します。数式を深く理解しなくても大丈夫なので、とりあえず読み進めてみてください。プログラムを書くために制御器のパラメータを下記のように定め、フィードバック制御系統を下記のように定義します。
\(
{K_P}: Pゲイン(比例項) \)
\(
{K_I}: Iゲイン(積分項) \)
\(
{K_D}: Dゲイン(微分項) \)
\(
\)
\(ただし e(t)は偏差 \)
中に色々と専門的な用語が出て来たりしますが、Kp、KI、KDという定数が存在し、それらの値を上手に設定することで、性能の良い制御ができる、ということだけ覚えておけば大丈夫です。PID制御についてはネットにたくさんの情報があるので、詳しく知りたい方は調べてみてくださいね。
https://controlabo.com/pid-control-introduction
https://www.tdupress.jp/book/b349521.html
PID制御なら物心がついた頃から触れているぞ!昔は可変抵抗をいじったりしてアナログでパラメーターを変更していたものだよ
プロンプトの作成と動作確認
サンプル信号の生成
それでは初めていくよー。まずは制御した対象の入力と出力信号を用意してね。と言ってもそう簡単に手元にあるとは限らないから、サンプル信号もChatGPTに生成してもらいましょう。
早速新しいプロンプトを開いてみましょう。二次遅れ系の伝達関数を元に、適当な入力信号と出力信号の波形を作ってもらいました。AIに具体的な適用例を理解してもらうために、飛行機の操舵翼の動きとピッチ運動をイメージした物理的な系を対象としてみました。
物体の運動や、電子回路の信号など、現実の物理法則に則っている二次遅れ系の信号であれば何でも大丈夫です。また、入力は英語でなく、適切に指示ができるのであれば日本語でもOKです。抵抗-コンデンサ回路とピッチング運動ではすべての定数が全くオーダーが違うので、このように背景を教えてあげると成功率があります。また、具体的に成果物の形式を指定してあげるとイメージ通りの結果が得られます。
敢えて英語でプロンプトを作成するメリットとしては、曖昧な表現を避けられるため、また入念に考えてからプロンプトを入力することにより、正確な指示を与えられることが多いです。あくまで私の経験則なので、日本語が得意な方はどちらでも大丈夫だと思います。
プロンプトの文章のみで、T-S平面上の伝達関数とどのような役割が要求されているのか理解してもらえたようです。しかし、無料プランでは回数制限によりcsvの出力と描画は拒否されてしまいました。このような場合は分析タブを開くと、おすすめpythonのプログラムが出てきます。これをそのままコピペして使ってみましょう。Random2ndOrderFunc.py として保存しました。
コードを見てみると、csv_filename = “/mnt/data/second_order_response.csv”という誤ったパスが表示されているため、同じディレクトリに保存したい場合は相対パスで”./second_order_response.csv”に修正してから実行してみましょう。下図のようなcsvファイルが生成されているはずです。最後の章に生成したプログラム一式を共有しているので、自分で動かしてみたい方はダウンロードして試してみてくださいね!
便利な生成AIですが、たまに変なバグを出力することもあるので、出てきたコードをそのまま鵜呑みにするのではなく、しっかりと自分の目で確認して動作を理解するように気をつけましょう。
/mnt/data/って。。。仮想マシンで動いているのは分かるけど随分と露骨だね!
プログラムを動かすと、それっぽい波形が生成されました。このままでは波長が2回分しか存在せず、信号解析が困難です。そこで、最低限10周期以上の時間スパンとなるよう修正を依頼しました。
無事に出力してもらえました!どのように考えて修正をしたのかの解説付きです。なお、任意のランダム波形、と指定をしたものの、入力信号はハードコーディングされており、毎回同じ波形が出てくる仕組みです。厳密にはプログラムとしては失格ですが、今回の目的にはサンプル信号があれば十分なので、見逃してあげましょう。
何故かChatGPTは聞いてもいない証明問題のような回答まで付属してくれることが多いけれど、中身の理解が難しい時など役に立つこともあるから、目をキラキラさせた新人ができました!!って言ってきたつもりになって暖かく見守ってあげましょう
ふむふむ。いきなり数式を投げられるより何に使うのか教えてあげたほうが誰だって作業はしやすいわな。
信号の解析
次のPID制御器を作るために、信号を分析するコードを作っていきましょう。二次遅れ系の伝達関数では下記のパラメータが登場します。既にChatGPTくんが説明してくれていますね。
- ゲイン定数: K
- 時定数: τ
- 減衰係数: ζ
これらをcsvファイルから解析して、表示してくれるプログラムを作ってもらいましょう。
生成されたプログラムで先程作ったsecond_order_response.csv を読み込ませてみます。
ん。。。?どうやら様子が変ですね?明らかに正の減衰係数のはずなのに、負の値を提示しています。コードを見てみましょう。。。
どうやらゲインと時定数の求め方が単調増減関数のような場合にしか対応できないような誤った判別方法を使ってしまっているようです。制御工学を勉強している人であれば、この部分を書き換えて正しく判定できるようにすることも可能ですが、生成AIのみでPID制御という目的が達成できなくなってしまいます。これがChatGPTの限界?早くも企画倒れ…!?
生成AIは思い込みが激しく、これだ!と信じた道を突き進んでしまうこともあるから、詰んだかな?と思ったら一度新しいプロンプトで再開してみたり、別のモデルを使ってみるのも手かも
ChatGPTでダメならClaudeはどうかな?
気を取り直して、先程の作業をClaude AI3.7でもやってみます。ゼロベースで二次遅れ系と推定される任意の入力信号からゲイン、時定数、減衰係数を求めるプログラムの作成を依頼してみました。
かなりパワープレイの推定ロジックが出てきました!動きそうではありますが、これでも使えるのかどうか。。。??先程作った信号のヘッダーをプログラムに合わせて書き換えてで試してみましょう。
予想でゴリ押しするよ!っていう予告と共に一応の結果が出てきましたがモデルとの差が気になります。。。
雲行きが怪しくなってきましたね💦 このままだと制御なんて。。。と思われるかもしれませんが、とある”裏技”を使って一旦次のステップに進んでみましょう。
PIDコントローラーの作成
伝達関数の推定が怪しいままですが、必ずしも必須ではないので、一旦先に進めてみます。
先程生成したグラフをClaudeに投げて、これからPID制御のシミュレーションをするよ~っということを伝えてあげました。そうすると、先程はうまくいかなかった定数の推定もやってくれました。
先程までうまく行かなかったK、τ、ζの推定がそこそこ正確に推定されてることが分かるわね。かなりアナログな方法で、グラフを目で読み取って、ステップ入力毎の応答を見ている感じなので、人間がやるのに近い方式のようだわ。
ちゃんとした推定するプログラムも頑張れば作れそうだけど、一旦は投げればやってくれることが分かったから進めちゃおうー
K=5、τ=2、ζ=0.5に対して、K=5、τ=3~4、ζ=0.5の回答が得られ、信頼できそうです。時定数がずれている原因としては、csvファイルそのものでなく、グラフのスクショを読み込ませたため縦軸の読み取り精度が良くない影響がありそうです。
ただしこのような系では、フィードバック制御は行っているものの、時系列が離散化されており、時間ステップ毎に伝達関数に基づいて機械的に計算をしていくだけなので、エラーは少なそうです。
シミュレーションを実行させるために、プログラムを作ってもらいましょう。プロンプトに対する回答の解説を見ると、物理定数K、τ、ζ、制御定数KP、KI、KDは既知のものとした場合、任意の入力信号に対する応答を計算するよ、と予言しています。
スクショのように各定数をハードコーディングする仕様です。UIについて、何も指定していないので、検証目的ではこれでも問題はないでしょう。おそらく成立するであろう範囲で初期値としてこのように推奨されたため、このまま使ってみます。
適当なステップ入力 test_input.csv を作って、生成されたプログラムを実行すると、成り行きの制御での応答が得られました!
おおお!それっぽい…?試しにすべての定数(KP、KI、KD)をゼロにし、自然応答を見てみましょう!
当然ですが、減衰の効いた二次遅れ系の応答そのままが返ってきました。動作としては問題なさそうです!これでPID制御のシミュレータは完成しました。UI周りはtkinter等のGUIを適当にプロンプトで生成してもらうと良いでしょう。この際も、どの要素をGUIに含めてあげるか明確に指定してあげると、成功率がアップする傾向です。
あまりに簡単に作れてしまうので、GUI周りは割愛します💦 これまで一番コードが長く、面倒でつまらない作業が完全に任せられるようになったのは、これだけでも驚異的だなと感じています
当然中身は何も変わっていないため、同じ結果が得られます。次のページではPIDパラメータの最適化プログラムを作っていきましょう。
次のページではいよいよ最終関門、PIDパラメータの最適化。。。制御の専門知識も要求されるし、2~3年前だと生成AIだけでここまで作るのはかなり難しかったと思うなー