はい。第3話は、**「毎朝のデータ整理を自動化したら、簡単なはずが例外処理の沼だった」**でいきます。第1・2話から自然につながる形で、noteにそのまま貼れる原稿にしました。
毎朝の作業をAIで自動化したら、「簡単なはず」が一番大変だった
前回は、AIを使って自分専用の風予報アプリを作った話を書きました。
それがきっかけで、
「毎日同じことをしているなら、これも自動化できるんじゃないか?」
と考えるようになりました。
今回、自動化しようと思ったのは、毎朝やっていたデータ整理です。
最初は本当に、
「数字を読み込んで、計算して、保存するだけ」
だと思っていました。
ところが実際に作ってみると、これが想像以上に面倒でした。
毎朝、同じ数字を確認していた
私は日々、いくつかの数値を確認しています。
前日の高値や安値。
一定期間の高値や安値。
週単位の数字。
月単位の数字。
それらを毎朝確認して、表へまとめる。
一回の作業だけを見れば、それほど大変ではありません。
でも毎日です。
しかも、数字なので入力を間違えると困ります。
そこで、
「元データを読み込ませて、自動で計算して表にしてくれればいい」
と考えました。
今思えば、この時点では完全に甘く見ていました。
正常な日だけなら、すぐできる
データがあります。
読み込みます。
高値を探します。
安値を探します。
結果を書き込みます。
これだけなら、AIに頼むと比較的すぐ形になります。
実際、最初に動いた時は、
「これは楽勝だな」
と思いました。
ところが、毎日使おうとすると問題が出始めます。
「今日」って、どの日?
最初に出てきたのが日付の問題でした。
人間なら、
「これは昨日の取引分」
と普通に分かります。
でもプログラムには、その「普通」がありません。
データ上の日付。
実際に使う日。
処理を実行した日。
日付をまたいで動いている時間帯。
これらが必ずしも同じではありません。
深夜をまたぐデータになると、さらにややこしくなります。
人間なら画面を見れば何となく判断できます。
でもプログラムには、
「何時から何時までを1日とするのか」
を全部決めてやる必要があります。
次にやってきたのが、土日と祝日
毎日データがあるなら簡単です。
でも当然、毎日同じようにデータが存在するわけではありません。
土曜日。
日曜日。
祝日。
連休。
すると、
「前日って何日前?」
という問題が出てきます。
金曜日の次が月曜日なら、人間は自然に金曜日を見る。
しかしプログラムに、
「昨日のデータを使え」
とだけ書いておくと、日曜日を探しに行くことがあります。
データはありません。
エラーになります。
そこで、
「データがなければ前へ戻る」
という処理が必要になります。
ところが、これにも落とし穴があります。
「データがない」と「休み」は同じではない
ここが特に重要でした。
データがない。
一見すると、
「休みだったんだな」
で済みそうです。
でも、本当に休みだったのか。
それとも、
データ取得に失敗したのか。
ファイルが壊れているのか。
途中までしか取得できていないのか。
この違いは大きいです。
データがないたびに、
「今日は休み」
と勝手に判断すると危険です。
逆に、少し欠けただけでシステム全体を止めても使い物になりません。
そこで、
軽い異常なら警告して続ける。
結果が信用できない場合だけ、その部分を保留にする。
という考え方になりました。
これは、この後ほかのソフトを作る時にも使うようになったルールです。
週単位になると、さらにややこしい
毎日だけならまだいい。
次に週単位の数字があります。
週の途中では、
月曜日までの高値・安値。
火曜日までの高値・安値。
水曜日までの高値・安値。
というように、その週の途中経過を更新していく必要があります。
ここで問題になるのが、
「前日の結果を引き継ぐのか」
それとも、
「毎回、元データから計算し直すのか」
です。
これはかなり重要でした。
前日の値を引き継ぐ方式なら速い。
でも、前日の数字が間違っていたら、その間違いまで引き継ぐ可能性があります。
毎回元データから計算すれば、その問題は減ります。
ただし、どの期間を読み込むのかを正確に決めなければいけません。
こういう部分は、
AIに、
「週の高値と安値を出して」
と頼むだけでは決まりません。
AIは「仕様が曖昧な部分」を勝手に埋める
AIを使ってソフトを作っていて、何度も感じたことがあります。
こちらが決めていない部分を、
AIはそれらしい方法で埋めることがあります。
例えば、
「前日」
と言った時に、
単純にカレンダー上の1日前として実装する。
「週」
と言った時に、
月曜0時から日曜23時59分だと考える。
普通のシステムなら、それでいい場合もあります。
でも、自分が扱っているデータでは違う。
つまり、
AIが間違っているというより、こちらの仕様が足りない
ことも多いのです。
この頃から、
「コードを書いて」
より先に、
「どういう条件で、どう判断するか」
を細かく決めるようになりました。
そして起きる、「昨日まで合っていたのに」
さらに厄介なのが修正です。
ある不具合を直します。
そこは直る。
ところが翌日、
別のところがおかしい。
確認すると、
修正した時に正常だった別の処理まで変更されていた。
AIで開発していると、こういうことが何度かありました。
そこで、
「今回直す場所以外は触らない」
というルールを強く意識するようになりました。
それと同時に、
修正前にバックアップを残す。
正常だった最後の状態を分かるようにする。
問題が出たら、
正常時と現在との差を見る。
これもかなり重要です。
「作り直しましょう」は簡単に言わない
AIは問題が続くと、
「構成を見直しましょう」
「新しい方式に変更しましょう」
と提案することがあります。
でも、すでにかなりの部分が正常に動いているのに、
一つの不具合のために全部作り直すのは怖い。
なので今は、
正常だった状態
↓
現在の状態
↓
何が変わったか
↓
原因
↓
必要最小限の修正
という順番をかなり意識しています。
単純な問題を、大きな改修にしない。
これはAI開発では特に大事だと思います。
テストが通っても、まだ信用しない
これも途中で学びました。
AIが、
「テストは全部成功しました」
と言います。
以前なら、
「じゃあ完成だ」
と思っていました。
今は思いません。
実際のファイルを入れてみる。
実際のデータで動かす。
出てきた数字を見る。
前日と比べる。
過去の結果が勝手に変わっていないか確認する。
そこまでやって、初めてかなり安心できます。
テストが成功したことと、実際に使えることは別。
これも、実際に自分で使うソフトを作ったから分かったことでした。
「自動化」は、人間の判断を全部言葉にする作業だった
最初は、
毎朝10分、20分やっている作業を、
ボタン一つにしたかっただけです。
でも作ってみると、
普段自分が無意識にしていた判断が大量にありました。
今日は休みだから飛ばす。
このデータは途中だから使わない。
この数字は前日から継続。
これは新しい週だからリセット。
これは異常だけど結果には影響しない。
これは危ないから確定しない。
人間なら一瞬で判断していることです。
ところが自動化するには、それを全部ルールにする必要があります。
そして気づきました。
自動化とは、作業をプログラムにやらせることではなく、人間の判断を仕様にすることなのかもしれません。
簡単そうなソフトほど、意外と奥が深い
見た目だけなら、とても地味なソフトです。
派手なAIもありません。
画像生成もしません。
会話もしません。
データを読んで、
計算して、
数字を残す。
それだけです。
でも、
毎日安心して使えるようにする。
間違った結果を出さないようにする。
異常があった時に分かるようにする。
過去の正常なデータを壊さない。
ここまで考えると、一気に難しくなります。
そして今では、この地味なシステムから学んだことが、
その後作るほぼすべてのソフトの基本ルールになっています。
AIにお願いすれば、
コード自体はかなり書いてくれます。
でも、
何を正しいとするのか。
異常な時にどうするのか。
何を絶対に壊してはいけないのか。
そこを決めるのは人間です。
次回は、
「AIに簡単な修正を頼んだだけなのに、なぜか半日消えた話」
を書こうと思います。
AI開発で一番腹が立ち、
そして一番勉強になった部分かもしれません。
次回からはこちら
こっちで更新はこれで最後の予定。

