メール送信をAIコーディングしたら失敗した話

## 初めに
こんにちは、自分は主にAI(特に言語)をやっている高校生です。
このような機会がないと失敗談を語る機会がないので、失敗したことについて書こうと思います。
AIコーディングをしている方(特にSMSやメール、認証周りのミスが許されない実装をしている方)にとって参考になれば幸いです。

## 今回の問題の概要
まずは問題の説明。
今回はPythonとGmailを使って、指定したメールアドレスに資料(今回やろうとしたのはAIエージェントシステムの管理資料)をある一定間隔で渡すコードをAIコーディングで書いていたときにおきました。

### AIコーディングとは
端的に言うとAIでコードを書くことをAIコーディングと言います。
以下のようなツールを使ってAIと会話をしながら、コードを組み上げていきます。
コードを直接書くことはないのでコードを書く手間を省くことができ、短時間でシステムをくみ上げることができるため、自分のように1人で開発している人にとっては非常にありがたいものです。

### 問題
今回作ろうとしていたシステムはいわゆるAIエージェントシステムの一環で、主にAIたちを管理する際の要です。

複数のAIが同時に動作するAIエージェントシステムにおいて、「各自AIたちが」何をやっているかを把握するのはシステムを管理する上で一番大切なことです。HAL2000みたいになったらたまったものではありません。
サーバーを操作する担当がいれば、ウェブを検索する担当もいる。ファイルを整理したり、コードを修正したりもする。そんなAIたちを管理し、まとめるときに大切なのが「人間の認証」です。
勝手にAIが動く前にメールを送付して、人間にAIたちが要求する行動を「承認する」か「承認しないか」を選ばせると言うものです。

具体的なフローはこうです。
```
1.  **AIによる重要動作の判断:** まず、AIが実行しようとしている動作が、人間の承認を必要とする重要度の高い動作かどうかを判断します。
2.  **承認用Webページの生成:** 重要度の高い動作と判断された場合、コード承認用のWebページとURLを生成します。
3.  **メール送信:** 生成したURLを記載したメールを、管理者のメールアドレス宛に送信します。
4.  **承認操作:** 管理者は、メール内のURLにアクセスし、Webページ上でAIの動作を承認または拒否します。
```
これを読み込ませて、AIにコーディングを依頼して完成をしたものを軽めに動作確認して、実装。
AIシステムにタスクを依頼して就寝！

#### 問題発生
![IMG_0931.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763201/af679aca-7df2-1193-1699-6b9d6727e722.png)
朝起きた自分の目に飛び込んできたのは500件超のメールであった

起きた瞬間から500件超のリクエストを承認するのはとてもできることではない。
でも、普通に考えてこれ **バグじゃね？**

生成されたURL数を確認したら30件。バグでした。

もしこれが大人数でつかうWebサービスで起こっていたら、、、考えたくもない

#### バグの直接的な原因
このバグの原因は、Pythonにおけるリスト管理でした。

リクエストをリストで管理する際に、リストを別の変数に代入する際に`=`演算子を使用していました。これにより、リストの実体がコピーされるのではなく、参照がコピーされたため、元のリストが変更されると、参照先のリストも変更されてしまうという問題が発生しました。(少なくともpythonにおいては)

```python:list_test
request_lists = ["req_1","req_2","req_3"]

request_lists_2 = request_lists

request_lists.append("req_4")
```
これをすると直感的に考えると、request_lists_2にreq_4が含まれていないように思えるが、 **含まれている**
これが問題の原因でした。
```python:list_test
request_lists = ["req_1","req_2","req_3"]

request_lists_2 = request_lists.copy()

request_lists.append("req_4")
```
こうすればrequest_lists_2にreq_4が含まれずに済む。だいぶ直感的。
今回はメールの送信機能であったために **ダメージ**が大きかった

## 問題を解決するために
今回の問題は、AIモデルが誤ったコードを生成したことに起因します。ただ、自分のAIコーディングの進め方にも問題があったとも考えられます。

(自分が考える一番の原因は"メール送信といった大事なコードをAIに書かせたまま、あまり確認"をしなかったということだとは思う)

思い当たる原因を書きだすとこんな感じです。
```markdown
*   **不適切なAIモデルの選定:** ローカル環境で動作する、性能が低いAIモデルを使用していたことが原因の一つです。特にメール送信のような重要な処理には、より精度の高いモデルを使用すべき。
*   **コードレビューの不足:** AIが生成したコードを十分に確認せずに使用したため、参照渡しのような基本的なミスを見逃してしまった。
*   **AIへの指示の曖昧さ:** AIに対して、複雑な処理内容を曖昧な指示で伝えたため、AIが意図を正しく理解できなかった可能性がある。
などなど...
```

## 根本的な問題の解決策(自分が考えた範囲で)
今回のケースのようなシステムにおける問題に対して、ただ一つの解決策は存在しません。しかし、複数の対策を講じることで、ミスの発生を抑え、万が一ミスが発生した場合でも、被害を最小限に抑えることが可能だと思います。

#### ミスをしないようにする工夫
**大事な作業は性能の高いモデルを使う**
特にメール送信や認証など、重要な処理については、高い精度と信頼性を持つAIモデルを使用するようにする

**コードを2重チェックする**
人間もAIもミスをするという前提に立ち、複数の目でコードを精査すること。異なるAIモデルでコードをチェックしてミスがないかを確認する。

**入力を入力前に精査する**
特に複雑なシステムに連れて複雑になっていく入力。複雑な入力ではAIがうまく咀嚼できず、理解不足のシステムが出来上がる。
それを対策するために、AIに指示する内容を事前に十分検討し、複雑なシステムでもAIが意図を正確に理解できるように具体的な指示を与えるようにする。

#### ミスがあってもダメージを少なくする工夫
**サーキットブレーカーを付ける**
異常が起こったときに止められるようなものを実装しておくことは、忘れられがちではあるがやっておくに損はない(今回は送るメールの総量を制限する機能を付けるべきであった)

**いきなり本番運用しない**
そんな人はあまりいないが、急いでPDCAサイクルを回そうとして失敗する例は多々あるので、焦らず作るべき。
テスト環境で十分な検証を行い、段階的に本番運用に移行するべきであった。

## まとめ
こういったミスや問題は多々あるうちの一つではあるが、一つ一つの問題に向き合って試行錯誤すること自体をおろそかにするといつか取返しのつかない大きな問題に成長することがあるので、おろそかにするべきではないと思っています。
自分はその問題のせいで、コードを1から書き直す羽目になったことがあるので言える。

**おろそかにするといつか自分に返ってくると**