ごあいさつ
どうも、はじめまして。もはや年寄りに差しかかろうとしているモブな組み込みエンジニアです。
組み込みだから、「AIは関係ないや」と言ってたら社内や顧客もAIまみれになりつつあり慌てて勉強しています。
ただ、せっかくおもしろいガジェットがでてきたのに、記事を見ると割とインパクトが強いものや即物的なものが多いので、自分は別方向に進みました。
背景
きっかけはAIで遊んでいると時間が飛んでしまうことです。
そこで考えました。AIにマネージメントをしてもらおう。
「○時になったら知らせて」と言っておくとやり取りの最中に知らせてくれました。
…………つまり、ある程度の融通が利き、AIとのやり取りはシステム化ができるということです。
前提
ただし、前提としてAIとのやりとりはプロンプトを介して行われます。
つまり、mermaidで書くと
sequenceDiagram
私->>AI : (REQ)何か芸をしてください。今すぐに。
AI-->>私: (RES)無茶ぶり酷い
というやり取り、要求と応答がインターフェースのすべてです。
(ちなみに図にはしませんmermaidは結構セキュリティ問題出しているので。私は好きですが。)
先ほどの「○時になったら知らせて」は(RES)に結果を加える形となりますね。
今回のプロンプトはこれを強化した形です。
なにはともあれ試作
ついでにPythonでDoxygenのXMLを解析するスクリプトを組んでもらいます。
あなたはPythonプログラマーのプロフェッショナルとして以下の条件のもとスクリプトを生成してください。
# やり取りに関する条件
* 条件との一致はあなたと私のやり取りの中であなたが常に一致を確認すること。
* 出力するコードは常に全文出力とすること。
* 出力するコードはコピーしやすい形式であること。
* 出力するコードは途切れ(トークンリミットやブラウザのコピー上限)を防止するため、1つのコードブロック(\`\`\`python)あたり「最大60行まで」として、クラスや関数などのキリが良いところで必ず閉じてください。
* 続きのコードは、こちらからの合図を待つことなく、次のコードブロック(```python)を開いて同じ回答内で連続して最後まで出力しきってください。
* コピペ時にファイルとして1つに結合できるよう、コードブロックの間には余計な解説を挟まず、ブロックの直前に「# --- 分割パーツ1 ---」といったコメントのみを記載してください。
* 各ブロックの末尾や先頭が重複したり、ロジックが欠落したりしないように完全に連続したコードにすること。
* 以下の要件で記載のない回答は控えること。
* 本アプリケーションは「入力要件」に記載されている情報を入力とし「機能要件」による処理を行った結果を用いて「出力要件」に記載された出力を行うものとする。
* 以降で要件を分類しながら記載していくが書式は「要件番号 : 要件内容」とする。要件内容が複数行になる場合は、: 以降を次の行から記載すること。
# 要件記載内容に対する要件
DREQ_COM_001_00 : 要件番号が重複していた場合は指摘すること
DREQ_COM_002_00 : 要件内容が矛盾していた場合は指摘すること
# 共通実装要件
CREQ_COM_001_01 : 本スクリプトはPythonスクリプトである。
CREQ_COM_001_02 : 本スクリプトはコンソールアプリケーションである
CREQ_COM_003_01 : 識別子は、ライブラリ内に定義されている識別子、予約語以外は英数の小文字とアンダーバーで記載すること(ただし、定数は大文字とアンダーバーで記載すること)
CREQ_COM_003_02 : コンフィグ要素の定数は接頭辞としてCFG_を記載すること
CREQ_COM_003_03 : DocStringに対応してコメントを書くこと
CREQ_COM_003_04 : 本スクリプトのコメントは基本的に日本語で記載すること(他の要件と矛盾する場合は他の言語も許容する)
CREQ_COM_003_05 : 本スクリプトのエラーやユーザーに対するメッセージは日本語とすること(対応策が予測できるものは対応策もセットで記載すること)
CREQ_COM_003_10 : ファイル先頭にはメタ情報とエンコーディング指定を追加すること
CREQ_COM_003_11 : CREQ_COM_003_10の記載に続き、次の行からコメントでファイルヘッダを記載すること
CREQ_COM_003_12 :
ファイルヘッダの内容は以下の通り
* スクリプト概要
* 使い方
* 注意点
* 実行環境
* 実行可能なPythonの最新バージョン
* 実行に必要な上記Pythonで標準で使用できないライブラリの一覧
CREQ_COM_003_21 : ファイル末尾にはコメントでファイルフッタを記載すること
CREQ_COM_003_22 :
ファイルフッタの内容は以下の通り。(各項目を章立てしすること。ただし、カッコの部分は章の文字列として使用しないこと)
* AI拡張要件
* AI提案要件
* AI指摘事項(「要件記載内容に対する要件」で指摘された内容)
CREQ_COM_003_31 :
スクリプト内の各要素は要件に関連づけられていること。
DocStringのコメントの備考として記載し、ロジック内に記載する場合は通常のコメントとして記載すること。
(定数や変数のクラスの使用箇所、関数の呼び出し個所など)
CREQ_COM_003_41 : 要件に関連付けできない要素は要件を作成し、ファイルフッタにある「AI拡張要件」として記載すること(要件番号の接頭辞はAI_EXT_REQ_)
CREQ_COM_003_42 : 要件に関連付けできない要素は下記の「アプリケーション概要」が達成できない場合ではない限り極力少なくすること
CREQ_COM_003_43 : CREQ_COM_003_42に該当する内容は要件としてAI提案要件として記載すること(要件番号の接頭辞はAI_RFP_)
# 共通入力要件
IREQ_COM_001_01 :
アプリケーションの入力情報は以下の通りとなる。(記載は「以降の文章で使用する別名 : 入力情報の説明」のように記載する)
スクリプトコンフィグ : スクリプト内に定義された初期値
環境コンフィグ : OSの環境変数
コンフィグファイル : スクリプトと同一ディレクトリに配置されたスクリプトと同一名称で拡張子が.ymlに変えられファイル
起動引数 : 本スクリプトの起動引数
入力ファイル : 起動引数で指定されたファイル
IREQ_COM_001_02 : 入力情報の優先度は起動引数、コンフィグファイル、環境コンフィグ、スクリプトコンフィグとして、内部データとしては逆順でデータを上書きしていき、最終コンフィグとする。(入力ファイルはコンフィグとは別で取り扱う)
# 共通出力要件
なし
# 共通デバッグ要件
DREQ_COM_001_01 : デバッグ機能は起動引数にDEBUGがオプションとして渡された場合にのみ有効となること
DREQ_COM_001_02 :
デバッグ機能が有効な場合は以下をログとして吐き出すこと
* 最終コンフィグの内容
* 関数、またはメソッドの内部ロジックのif, matchによる分岐に関わる変数の値のトレース情報(VSCodeのターミナルでジャンプできるように位置情報も記載すること)
# 共通実行環境要件
* 本スクリプトはWindows 11上で動作する
* 本スクリプトは日本語環境で動作する
# アプリケーション概要
Doxgenに生成されたXMLを解析し、解析結果を出力します。
# アプリケーション入力要件
IREQ_APP_001_01 :
入力されるコンフィグは以下がある
* CFG_XML_PATH: Doxgenに生成されたXMLディレクトリパス
* CFG_OUT_PATH: 解析結果の出力ディレクトリパス
# アプリケーション出力要件
OREQ_APP_001_01 : XMLの解析結果を出力します
OREQ_APP_001_02 : 結果はYAML形式としてください
# アプリケーション機能要件
FREQ_APP_001_01 : XMLの解析結果として各関数をベースに関数、参照されている関数、マクロ、変数、定数をツリー状にまとめたデータを生成します。
FREQ_APP_001_02 : 関数の参照が循環している場合は循環を検知して、それ以上の深堀せず次の解析を進めてください。
FREQ_APP_001_03 : 解析結果の中で関数の参照、被参照関係があるものについてはツリーをマージしてください。
FREQ_APP_002_01 : 解析は「Doxgenに生成されたXMLディレクトリパス」で指定されているディレクトリにあるXMLファイルすべてに対して行います。
FREQ_APP_003_01 :
パスインジェクションおよびトラバーサル脆弱性への防衛
外部から入力される不特定のファイルパスを安全に扱うため、スクリプトコンフィグ
読み込みの段階で全パス情報を正規化・絶対パス化する処理を追加すること。
今回のプロンプトで検討したのは以下の内容となります。
(だいたい、CREQ_COM_003_22の結果にまとめて出力されます。)
- 要件とコードの紐づけ
- 要件にないコードのコントロール
- 意識しなかった要件についてのAIからのフィードバック
これで自分の気づかなかったところを要件として定義し直し、
同じことも何度かAIとやり取りをせば、PDCAサイクルとなり質も上がっていくはず…………たぶん。
もっと積極的に別アプローチで提案してもらえる要件を追加してもいいかもしれません。
FREQ_APP_003_01なんかは別途セキュリティで意見を求めた結果の要件ですし。
結論
コピペが面倒。(上の話とつながってませんが)
ファイルを生成して共有してくれるAIばかりならいいんですが、そうでないAIもあるので。
これもプロンプト内で条件分岐しつつの切り替えかな………というか、似たような試みをやってる人はいるはずだし、記事を探すのが先か。