Sansan Builders Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【Techの道も一歩から】第35回「ルールベース手法の運用時のエラーを的確に把握する」

f:id:kanjirz50:20190104142720j:plain

こんにちは。 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 を送出します。

f:id:kanjirz50:20210104165259p:plain

このエラーが起きた状況を事細かくログから知ることができます。 例えば、 logger には logzero が使われていたり、 Python ランタイムは CPython 3.8.3 であることがわかります。

f:id:kanjirz50:20210104165711p:plain

次に、実際のエラー内容が整形された状態で表示されます。 strptime の想定外の入力となり、例外が送出されていることがわかります。

f:id:kanjirz50:20210104165324p:plain

エラーは呼び出し元まで遡ることができ、ここでは worker.py の 92 行目となります。 インターフェースとして AnalysisRequest というオブジェクトを process メソッドが受け取るようになっています。

どのような request においてエラーが発生したかという詳細を把握することができます。

f:id:kanjirz50:20210104165336p:plain

このシステムでは、ある解析リクエストに対して、入力されるデータは別のストレージから取得されます。 今回のエラー要因は、ストレージに格納されたデータを目視することで、エラーが起きる根本原因が判明しました。 想定外の入力として、テキスト中に 1999年0月1日 のような無効な表記が見られました。

この想定外の入力に対して、どのような対処を行うかは、タスクに依存しているかと思います。 ここでは、無効な日付は採用しない、という対処を取りました。

このようにルールベース手法における考慮漏れを的確に把握し、すぐに修正対応を行うことができます。

しっかり監視して継続した改善へ

ルールベースということで、ソフトウェア開発におけるエラー監視をそのまま活かすことができました。 ルールベースのみならず機械学習を用いる場合でも、入力の前処理や後処理時において、同様の問題は発生するかと思います。

実運用においては想定外の入力がつきまとうため、エラー監視という手段も安定運用のためにいい一手ではないかと思います。

▼本連載のほかの記事はこちら

buildersbox.corp-sansan.com

執筆者プロフィール

高橋寛治 Sansan株式会社 DSOC (Data Strategy & Operation Center) R&Dグループ研究員

阿南工業高等専門学校卒業後に、長岡技術科学大学に編入学。同大学大学院電気電子情報工学専攻修了。在学中は、自然言語処理の研究に取り組み、解析ツールの開発や機械翻訳に関連する研究を行う。大学院を卒業後、2017年にSansan株式会社に入社。キーワード抽出など自然言語処理を生かした研究開発に取り組む。

© Sansan, Inc.