こんにちは。 DSOC R&D グループの高橋寛治です。
アルゴリズムを開発する際に、課題やデータ量に応じた手法の一つとして、ルールベースを採用することがあります。 ルールベースによるアルゴリズムを運用していると、想定外の事象による例外が発生するものです。 これを的確に把握することで、改善へとつなげることができます。
動作するコードのエラーを的確に把握するということは、ソフトウェア開発では当たり前のことだとは思います。 しかしながら、研究開発という観点だと考慮が漏れがちな点ではないでしょうか。
今回は、実運用で利用しているツールや改善事例について研究開発観点で紹介します。
エラー監視ツールの導入
エラー監視ツールである Sentry を利用します。 ルールベースはただ単に手続きが書かれているだけですので、普通のソフトウェアと同様にエラーを監視できていればいいという考えです。 エラー監視ツール Sentry では、エラー時のエラーメッセージや変数の値、ライブラリのバージョンなど、エラー発生時の状況を事細かく知ることができます。
手元で Sentry を動かすためのセットアップは、ドキュメント を参考に設定すれば動きますので、ここでは省略します。 Python コードへの Sentry クライアントの導入は非常に簡単です。 アルゴリズムの呼び出し元となる API 定義コードやワーカに初期化処理を以下のように記述します。 これだけで、例外発生時に Sentry へ必要な情報を自動で送信します。
import os import sentry_sdk sentry_sdk.init(os.environ.get("SENTRY_DSN"))
sentry_sdk
の初期化に、Sentry イベントの送り先である Data Source Name(DSN) を設定します。
上記のコードでは、環境変数 SENTRY_DSN
に設定されています。
実際のエラー事例
あるルールベースアルゴリズムの処理において、実運用時に発生した事例について紹介します。
テキストから日付を抽出し、周辺の情報を考慮しながら、分類するというタスクです。 ここで、テキストから抽出された日付が無効なものだったため、日付型への変換時にエラーが起きていました。 なお、データ内容については、紹介向けに異なるものへと改変しています。
日付を抽出する際に、\d{4}年\d{1,2}月\d{1,2}日
といった正規表現を書くかと思います。
この正規表現ですと、1999年0月1日
のような無効な日付も抽出されます。
テストを書くことで事前に防げることもありますが、今回は考慮漏れによりエラー監視ツールで気づくこととなりました。
Sentry 上で次のように ValueError
が起きていることが確認できます。
Python の datetime
モジュールの strptime
は無効な日付に対しては ValueError
を送出します。
このエラーが起きた状況を事細かくログから知ることができます。
例えば、 logger には logzero
が使われていたり、 Python ランタイムは CPython 3.8.3
であることがわかります。
次に、実際のエラー内容が整形された状態で表示されます。
strptime
の想定外の入力となり、例外が送出されていることがわかります。
エラーは呼び出し元まで遡ることができ、ここでは worker.py
の 92 行目となります。
インターフェースとして AnalysisRequest
というオブジェクトを process
メソッドが受け取るようになっています。
どのような request
においてエラーが発生したかという詳細を把握することができます。
このシステムでは、ある解析リクエストに対して、入力されるデータは別のストレージから取得されます。
今回のエラー要因は、ストレージに格納されたデータを目視することで、エラーが起きる根本原因が判明しました。
想定外の入力として、テキスト中に 1999年0月1日
のような無効な表記が見られました。
この想定外の入力に対して、どのような対処を行うかは、タスクに依存しているかと思います。 ここでは、無効な日付は採用しない、という対処を取りました。
このようにルールベース手法における考慮漏れを的確に把握し、すぐに修正対応を行うことができます。
しっかり監視して継続した改善へ
ルールベースということで、ソフトウェア開発におけるエラー監視をそのまま活かすことができました。 ルールベースのみならず機械学習を用いる場合でも、入力の前処理や後処理時において、同様の問題は発生するかと思います。
実運用においては想定外の入力がつきまとうため、エラー監視という手段も安定運用のためにいい一手ではないかと思います。
▼本連載のほかの記事はこちら
執筆者プロフィール
高橋寛治 Sansan株式会社 DSOC (Data Strategy & Operation Center) R&Dグループ研究員
阿南工業高等専門学校卒業後に、長岡技術科学大学に編入学。同大学大学院電気電子情報工学専攻修了。在学中は、自然言語処理の研究に取り組み、解析ツールの開発や機械翻訳に関連する研究を行う。大学院を卒業後、2017年にSansan株式会社に入社。キーワード抽出など自然言語処理を生かした研究開発に取り組む。