うみがめのオセロ以外

オセロ以外の雑多なことを書きます。

arXivの最新論文を要約してSlackに自動投稿その3

前回作ったものと不満点

表題のものについて、前回記事まででひとまず動くものが完成した。大雑把な仕様として

  1. arXivから最新論文のデータを取得し
  2. 論文データがmysqlのtableに格納されているかチェック、見つかったら3,4を省略
  3. 格納されていない場合はChatGPTのAPIで要約
  4. 要約と論文データをtableにinsertして、同時にslackに投稿

という手順を踏んでいた。

これは概ね理想通りに動いてくれていたが、なんらかの理由でtableへの挿入が失敗した場合に*1、同じ論文情報が毎日slackに投稿されてしまうという不満があった。
それほど頻繁に起こる現象ではなかったためadhocに対応していたが、暇ができたので仕様を変更して対処した。

今回の変更

仕様を以下の二段階の処理に変更した。まず

  • 論文データを収集する処理
    1. arXivから最新論文のデータを取得し
    2. 論文データがMySQLのtableに格納されているかチェック
    3. 格納されていない場合はtableに挿入

上記のスクリプトを実行後、それとは別に下記のスクリプトを実行する

  • 要約してslackに投稿する処理
    1. MySQLのtableから要約の作成されていない論文データを抽出
    2. ChatGPTのAPIで要約*2
    3. tableの要約をupdateして、同時にslackに投稿

これにより、tableへの挿入が失敗してしまった場合は後段の処理が行われないため、投稿の重複を防ぐことができた。

変更はこれだけなのだが、実際はコードのリファクタリングをしたりしていたらそれなりに大きな改修になってしまった。
最初からちゃんと設計を考えてきれいに書くべきですね。

今後の課題

これまでよりだいぶ安定して動くようになったが、まだいくつか課題はある

  • tableへの挿入が失敗するレコードは何が問題なのか
    • 常に挿入失敗しているレコードがありそう
    • これは調べれば原因がわかりそうだが、レアだし面倒くさがって未着手
  • slackへの投稿に失敗した場合、もう一生投稿されなくなってしまう問題
    • 一度要約が作成されてしまうと後段の処理がスルーされてしまうため
    • これはslackへの投稿機能を分離して、tableにslackに投稿済みか否かのフラグを追加すれば済む気がする
    • が、ログを見る感じそこの失敗はまだ起きていないし、tableの定義の変更も面倒でやる気が...
  • Function Callingで実装してみたが、そこそこの頻度で関数を呼び出してくれないことがあり、結局few-shot learningを利用した方法に戻った
    • Function Calling力が足りておらず、ここは理解を深めた方が良さそう

追記

slackへの投稿失敗のことを書いたら気になってしまったので修正した。
やっぱ気合いがあるときにやらないとダメですね。

もう少し例外処理をきれいにしたら、次は何らかの形で公開してみたい気持ち。

*1:この場合にもスクリプトは停止しない仕様になっている

*2:ここは低確率で失敗するので、成功した場合のみ3を行う