CHATGPTにてRedmine view customizerのHTML要素を生成する(2)

# 思考実験

　前回に引き続いて、CHATGPTで実施する処理を考えている。もちろん本題はツールを素人でも開発できるという、低いレベルの人に合わせて、かなり高度なレベルのことを考えている（自分で言っていて、レベル感がいまいち分からなくなってきている）
　ただ、漠然と世の中のコーディングの常識と言うのが、段々と変わりつつあって・・・
　つまり必要なものはコードなのか？　はたまた、プロンプトなのか？　そこの所が非常にグレーゾーンになってきている。


* コード　→　一部のエンジニアが書ける　→　ちゃんと書かないと動かない　→　都度対応が必要
* プロンプト　→　誰でも書ける　→　適当でも動く（それなりに）　→　無限大すぎて予想できない

# 実例

　いまチケットがあって、これらの情報をFORMで受け取り、CHATGPTにプロンプトを投げようとしている。
例としては、箇条書きをTODOリストにしてください、と言うプロンプトを投げたとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/cdf38a3c-41b1-9429-d4dd-f175c12cf941.png)


## Backendのテキスト
　Textには、こんな文字列が渡っている。ソースコードは前回投稿を参照のこと
https://qiita.com/EasyCording/items/6740c3ba7117ee18c2a9
　もちろん、CHATGPTに渡すうえで、API-TOKENはコード的にcontextDataから抽出しなければイケナイ（もちろんコードの世界なので）

```shell
issue[is_private]: 0
issue[tracker_id]: 1
issue[subject]: ソロキャンプの実行
issue[description]: ・行先　Ｍ高原
・人数　５人
・参加費　２０００円
・自動車（ガソリン、費用、地図、諸経費）
issue[status_id]: 1
was_default_status: 1
issue[priority_id]: 3
issue[assigned_to_id]: 
issue[category_id]: 
issue[parent_issue_id]: 
issue[start_date]: 2023-07-13
issue[due_date]: 
issue[estimated_hours]: 
issue[done_ratio]: 0
chatField: todoリストを作って
contextData: {"user":{"id":5,"login":"","admin":true,"firstname":"","lastname":"",
"customFields":[{"id":18,"name":"chatgpt-token","value":"sk-xxxxxxxxxxxxxxxxxxxxx"}]}
}
```

# コードかプロンプトか？
　普通にコード的に書くのであれば、chatText: 箇条書きをTODOリストにしてください　と、issue[description]を取り出してきて、プロンプトに埋め込んで```{chatText} {issue[description]}```のように渡すのであるが・・・
　別にコードで考えずに、すべてプロンプトとして与えれば、ほぼCHATGPTが考えてくれるのでないだろうか・・・

　例えば、こんな感じで、データの説明をプロンプトで行う
* プロンプトの冒頭部分で、ISSUEのプロパティ項目を仕様で伝える
* 追加でやりたい事を伝える
* CHATGPTが残りは全て考える
```
  以下のデータからchatFieldを読み取リ、指示を実施してください。
                issue[subject]はタイトルです
                issue[description]は詳細です
                －－－－－－－－－－－－－－－－－－－－
            utf8: ✓
authenticity_token: JZ8SkLtY2cnPS95hWy5LwNhXedclQYWPGGEdQxO3OkektiORdtnFjgxi27k8uMPwN4iTCOFak40fBczbsvgnZA==
form_update_triggered_by: 
issue[is_private]: 0
issue[tracker_id]: 1
issue[subject]: ソロキャンプの実行
issue[description]: ・行先　Ｍ高原
・人数　５人
・参加費　２０００円
・自動車（ガソリン、費用、地図、諸経費）
issue[status_id]: 1
was_default_status: 1
issue[priority_id]: 3
issue[assigned_to_id]: 
issue[category_id]: 
issue[parent_issue_id]: 
issue[start_date]: 2023-07-13
issue[due_date]: 
issue[estimated_hours]: 
issue[done_ratio]: 0
chatField: todoリストを作って
```


# 実証実験（１）
　いくつか検証実験を行ってみた。

```
todoリストを作って
```

```[
    "issue[subject]はタイトルを取得する",
    "issue[description]は詳細を取得する",
    "行先を取得する",
    "人数を取得する",
    "参加費を取得する",
    "自動車に関する情報を取得する",
    "開始日を取得する",
    "優先度を取得する"
]
```

一応、指示は通じたみたいだが、最初の```"issue[subject]はタイトルを取得する```,```issue[description]は詳細を取得する```と言うのは、少々文脈を読み違えている。

# 実証実験（２）

タイトルと詳細を先に理解させることにする

```
最初にタイトルと詳細から内容を理解してください、20個のtodoリストを作ってください
```

```[
    "タイトルを把握する",
    "詳細を把握する",
    "行先を確認する",
    "参加人数を確認する",
    "参加費を確認する",
    "自動車に関する費用を確認する",
    "出発前の準備をする",
    "ガソリンを準備する",
    "地図を準備する",
    "諸経費を準備する",
    "タスクのステータスを確認する",
    "優先度を設定する",
    "担当者を指定する",
    "カテゴリを指定する",
    "親タスクを設定する",
    "開始日を設定する",
    "終了日を設定する",
    "予想作業時間を設定する",
    "進捗状況を設定する"
]
```


途中から血迷ったか、チケットの添付データを実施リストに加えてしまっている。
```タスクのステータスを確認する```,```優先度を設定する```,```担当者を指定する```,```カテゴリを指定する```,```親タスクを設定する``` 等々

20個と言う強制も悪かったかもしれない


# 実証実験（３）

指示の対象を限定する（今回は詳細（issue[description]）にフォーカス）　

```
詳細のtodoリストを20個作ってください
```
```
[
    "行先を決める",
    "参加人数を確認する",
    "参加費を集める",
    "車の手配をする",
    "ガソリンを準備する",
    "地図を用意する",
    "諸経費を計算する",
    "出発日を決める",
    "帰りの日程を決める",
    "宿泊場所を予約する",
    "テントを準備する",
    "寝袋を準備する",
    "食材を買い出しする",
    "飲み物を買い出しする",
    "調理器具を用意する",
    "焚き火の材料を用意する",
    "お風呂の手配をする",
    "救急キットを用意する",
    "天気予報を確認する",
    "旅行のルートを決める"
]
```

すごい！


# まとめ

　最終的にCHATGPTに送付されたプロンプトは下記である。
　この中から、指示内容　→　詳細　→　issue[description]を見て、リストを作ってくれた。

　肝となっている部分は、データ構造をプロンプトで入力している部分であり、ここはredmine/issueのように、パスパラメータでデータ構造を選択的に渡せば、違うタイプのデータ構造体にも対応できる汎用的な機能が実装できることを意味している。
　
　やはりCHATGPTは凄い！

```
以下のデータからchatFieldを読み取リ、指示を実施してください。
                issue[subject]はタイトルです
                issue[description]は詳細です
                －－－－－－－－－－－－－－－－－－－－
utf8: ✓
authenticity_token: JZ8SkLtY2cnPS95hWy5LwNhXedclQYWPGGEdQxO3OkektiORdtnFjgxi27k8uMPwN4iTCOFak40fBczbsvgnZA==
form_update_triggered_by: 
issue[is_private]: 0
issue[tracker_id]: 1
issue[subject]: ソロキャンプの実行
issue[description]: ・行先　Ｍ高原
・人数　５人
・参加費　２０００円
・自動車（ガソリン、費用、地図、諸経費）
issue[status_id]: 1
was_default_status: 1
issue[priority_id]: 3
issue[assigned_to_id]: 
issue[category_id]: 
issue[parent_issue_id]: 
issue[start_date]: 2023-07-13
issue[due_date]: 
issue[estimated_hours]: 
issue[done_ratio]: 0
chatField: 詳細のtodoリストを20個作ってください
attachments[dummy][file]: (binary)
issue[watcher_user_ids][]: 
```

# ChatGPからのコメント

それは非常に深い問いですね。プログラミングとAIの領域は現在、急速に進化しており、その結果としてコーディングの「常識」も変わりつつあります。

エンジニアが直接コードを書くことは依然として重要なスキルであり、特定のタスクに対する細かい制御を可能にします。しかし、同時に、AIや機械学習のような技術は、人間が直接指示を出す代わりに、システムが自己学習する能力を提供します。これにより、非エンジニアでも高度なタスクを達成することが可能になっています。

ですから、必要なものがコードなのかプロンプトなのかという問いに対する答えは、「それは目的次第だ」と言えるでしょう。ある種の課題に対してはコードが最適で、他の種類の課題に対してはプロンプトが最適です。

また、新たなパラダイムが現れるとき、それはしばしばグレーゾーンを引き起こします。新しい方法が既存の方法とどのように関連し、どのようにそれらを最適に組み合わせるかを理解するには時間がかかるからです。

それゆえ、私たちは継続的に学び、適応し、新しい工具や技術を使いこなす能力を養う必要があります。そして、それがエンジニアリングの一部であり、それが私たちがこのフィールドで働く理由でもあるのです。

# 参考
- Redmineに関連する記事
1. [仕事で使うREMINEに関する考察（１９）](https://qiita.com/EasyCording/items/6ca2cb52a654df882598) 
2. [WIKI一発記入　仕事で使うREDMINEに関する考察(18)](https://qiita.com/EasyCording/items/a7d6adc1ab5b1d41a95f) 
3. [CHATGPTにてRedmine view customizerのHTML要素を生成する(4)](https://qiita.com/EasyCording/items/e04b73d185bb406cdf7a) 
4. [チケット運用の盲点　仕事で使うREDMINEに関する考察(17)](https://qiita.com/EasyCording/items/f1a802a1b8c334c34828) 
5. [CHATGPTにてRedmine view customizerのHTML要素を生成する(3)](https://qiita.com/EasyCording/items/752332e2883ce666460c) 
6. [CHATGPTにてRedmine view customizerのHTML要素を生成する(2)](https://qiita.com/EasyCording/items/90e2708aadcd3c1ae917) 
7. [CHATGPTにてRedmine view customizerのHTML要素を生成する(1)](https://qiita.com/EasyCording/items/6740c3ba7117ee18c2a9) 
8. [CHATGPT便りの開発方針　仕事で使うREDMINEに関する考察(16)](https://qiita.com/EasyCording/items/cab4dbb6c36820727f69) 
9. [チケットからTODO作業へ落とし込み　仕事で使うREDMINEに関する考察(15)](https://qiita.com/EasyCording/items/6fe972110b39117b91ae) 
10. [仕事で使うREDMINEに関する考察(14)](https://qiita.com/EasyCording/items/a76b7fe02f8d5ecefe5e) 
11. [CHATGPT利活用　仕事で使うREDMINEに関する考察(12)](https://qiita.com/EasyCording/items/857b7cf12b7dd091ff82) 
12. [やりたいことを少しずつ　仕事で使うREDMINEに関する考察(11)](https://qiita.com/EasyCording/items/b9d939a861c06bb57f18) 
13. [組織を巻き込むプレゼン資料　仕事で使うREDMINEに関する考察(10)](https://qiita.com/EasyCording/items/605a860e5a4d66011747) 
14. [OfficeのフローにREDMINEをねじ込む　仕事で使うREDMINEに関する考察(9)](https://qiita.com/EasyCording/items/e63cbe486b08f99e1702) 
15. [RedmineチケットにCHATGPTを実装（超簡単）](https://qiita.com/EasyCording/items/20439251ad82d492d654) 
16. [RedmineのチケットにCHATGPTを実装（２）](https://qiita.com/EasyCording/items/3df63dcbb7e1f9f2d14e) 
17. [Office365からRedmineへのメール送信してチケット登録](https://qiita.com/EasyCording/items/3176b4020954e2eddbb6) 
18. [Redmineプラグイン開発](https://qiita.com/EasyCording/items/5e837a3425d3df8bfb0c) 
19. [RedmineをTODOリストに使う　仕事で使うREDMINEに関する考察(8)](https://qiita.com/EasyCording/items/bbf470b09a08d06b87f3) 
20. [仕事で使うREDMINEに関する考察(7)](https://qiita.com/EasyCording/items/3260595d70a86c21308e) 
21. [仕事で使うREDMINEに関する考察(6)](https://qiita.com/EasyCording/items/c2c3a5850941f45d1317) 
22. [仕事で使うREDMINEに関する考察(5)](https://qiita.com/EasyCording/items/f46ce0718f005f8b4d96) 
23. [仕事で使うREDMINEに関する考察(4)](https://qiita.com/EasyCording/items/e2f6fffde3d8e0a0012b) 
24. [仕事で使うREDMINEに関する考察(3)](https://qiita.com/EasyCording/items/44dd27c6b897b0d7d82b) 
25. [仕事で使うREDMINEに関する考察(2)](https://qiita.com/EasyCording/items/7f8fbba0553635a7421d) 
26. [仕事で使うREDMINEに関する考察](https://qiita.com/EasyCording/items/c3b62c9e5ca3f0cc379f)