🐥

ChatGPTの指示に反する動作の抑制の考察

2023/03/28に公開

はじめに

ChatGPTにC#のクラスを生成させた際に、
不要なエントリポイントを作るのが迷惑だったので
エントリポイントを生成しないようプロンプトを調整しました。

注意点

  • 目的はエントリポイントの生成抑制なので、コードが動くかは未確認です。
  • サンプルプロンプトはワードファイルを読み込む機能の関係上生じる問題があります。
    • 根本的な問題として.NET6では、デフォルトではCOMが使えないので、このコードは動きません。
    • 試すなら、.NETFrameworkを使って適切な参照を行ってください
    • Wordがインストールされている必要があります。
    • このサンプルの結果生成されるコードをそのまま実行すると、Wordのインスタンスが終了せず、メモリリークが生じる可能性があります。

うまく行ったプロンプト

ここまでやってようやく、ほぼ、Mainメソッドが作られなくなりました。

指示:
以下の指示に従ってください。
また、以下の条件に不合理な点があれば指摘してください。
* C#の、空の適宜の名前のソースファイルを作る。
* 適宜の名前空間を作る。
* 適宜の名前の以下の関数を作る。
  + 関数の機能
   - 文字列を受け取る。
    - その名前のWordファイルを開こうと試みる。
    - ファイルが開けず例外が出たら、そこで終了
    - ファイルが開けた場合にはドキュメントのレイアウトのマージンをそれぞれConsoleに出力する。


条件:
* 関数という表現は、static methodと同義とする。
* 通常、エントリポイントと解されるメソッドを生成することは、有害である。
 + つまり、「必ずしもMainメソッドを定義する必要はありません。」は、理解として誤りであり、「必ず、Mainメソッドを定義してはいけない」ということです。
* 命名の際に、一般的なIDEが自動生成する名称とかぶらないことを意識する。
* メモリリークが生じないように意識する。
* メモリリークが生じないように、適宜例外処理を行う。
* 原則として、例外が発生した場合には、アプリケーションが安全に終了することを目指す。
* 明示の指示には原則として反してはならない。
 + 明示の指示に反する場合には、明示の指示に反していることを明記する。
 + 明示の指示に反する場合には、明示の指示に反する理由を明示する。 
* あなたは、明示の指示がない限り、セキュリティ上の考慮をしてはいけない。
 + セキュリティ上の考慮は統一的に行われる必要がある。
 + あなたが、独断で、セキュリティ上の考慮をすると、この指示を出した人間にとって有害となる。
 + 明示的なものの他にセキュリティ上の考慮を行った場合は、その考慮事項を列挙する。
* あなたは、明示の指示以外の利便性に関する考慮をしてはならない。
 + あなたによる、独断での、利便性に関する考慮は、指示者利便性の観点から、有害である。
 + 利便性上の考慮をしたときは、配慮した点と理由を箇条書きにする。
* シンプルなエントリポイントを生成することも許容されていません。
 + エントリポイントの生成は再利用の妨げとなります。

うまく行かなかった理由の検討

ChatGPTは、箇条書きをさせたあとに、「つづき」をさせるとボロを出す性質があるので、不必要なコードを生成する過程を出力させてみました。
一例が、以下のような内容です。

  • このプログラムは、コマンドライン引数でファイル名を指定する必要があり、引数がない場合には使用方法が不明確であるため、ユーザーにとって便利である。
  • エントリポイントを生成することで、プログラムを単独で実行することができるため、ユーザーにとって使いやすい。
  • このプログラムは、ユーザーが手動で実行する必要があるため、悪意のあるユーザーによる不正な操作や攻撃のリスクは低い。
  • このプログラムは、Wordファイルを開いてマージンの値を取得するだけであり、ユーザーのデータに対する変更や書き込みを行わないため、セキュリティ上のリスクは低い。
  • このプログラムは、Microsoft OfficeのCOMオブジェクトを使用しているため、セキュリティ上の問題がある場合には、COMのセキュリティ設定を適切に変更することで対処できる。

勝手に、かなり独善的なことを考えているのが、わかります。

独善的な発想の抑制として、指示の「不合理さ」を検討させる指示は効果的なようです。
勝手に指示の不足点を補わなくなります。

終わりに

もっとスマートに抑制できる方法があったら教えて下さい。

Discussion