LayerX エンジニアブログ

LayerX の エンジニアブログです。

〜OCR戦記〜適格事業者登録番号との戦い🔥🔥🔥

この記事はLayerXテックアドカレ2023の5日目の記事です。 昨日はmakogaさんがEngineering Career Ladderを作るときに気をつけたこと 其の一を書いてくれました。 次回はyuya-takeyamaさんがMicrosoft Graph APIについて書いてくれます!乞うご期待!

こんにちは、機械学習を通じて誰かをラクにしたい yakipuです。

今回は、10月から始まったインボイス制度に伴う適格請求書発行事業者登録番号(以下「登録番号」と表記します)のOCR読み取りの戦いについて記したいと思います。

インボイス制度は、売手が買手に対して正確な税率や消費税額を示す適格請求書(インボイス)を交付することで、買手が仕入税額控除の適用を受けるために必要な制度です。売手側は登録事業者として登録番号などが記載されたインボイスを交付し、買手側はインボイスを保存する必要があります。詳しくは国税庁 -インボイス制度の概要をご参照ください。

登録番号のOCR読み取り対応

LayerXが提供しているバクラクは書類をアップロードするだけで支払金額や支払期日などを自動で読み取り補完してくれるOCR機能があります。このOCR機能の読み取り項目の一つに登録番号があります。

インボイス制度に対応した適格請求書には発行者の登録番号が記載されており、そこを読み取ってくれます。

バクラク請求書発行で出力した適格請求書サンプル

支払金額や支払期日などの既存の読み取り項目は機械学習モデルを使用していますが、登録番号の読み取りは人間が設定したルールに基づく処理(ルールベースロジック)を採用しました。

ルールベースロジックを採用したポイントは以下の通りです。

  • 適格番号は"T"に続く13桁の数字という認識しやすい文字・固定されたフォーマットであるため、文字認識や登録番号かどうかの判断が容易
  • インボイス制度開始後、想定外のパターンが来た場合でも柔軟にアドホックな対応が行える
  • 制度開始前には登録番号が記載されたデータが少ないため、そもそも機械学習モデルを構築しようとしても難しい

事前に想定できた対応(ハイフンの有無、'登録番号'というラベルの有無など)は行っていましたが、インボイス制度が始まるまでは正直どうなるかわからない状態でした。

いざインボイス制度が開始…!!!

10月のインボイス制度スタートに伴い、大量の適格請求書がバクラクにアップロードされるようになりました。(もちろん事前にインボイス対応を完了されていた企業様もいらっしゃいましたが、10月に入ってきて一気に増えました)

「なるほど、そうきたか〜」と思うような様々なパターンが出てきたため、多くの企業様がどれだけ試行錯誤してインボイス対応をしてきたのかが伝わりました。対応された方々、お疲れ様です…!!

今回はその登録番号の一部をご紹介しようと思います!

エントリーNo.1 登録番号ハンコ

インボイス制度開始前、ハンコ業界がざわざわしていたのをご存知でしょうか

news.yahoo.co.jp

飲食店などで市販の複写式領収書などをご利用されている方の場合、新たに適格番号を領収書に印字しなければなりませんが、市販の領収書のため一枚ずつ記載する必要があります。

そこで店名や住所などと同様に、適格番号のハンコを押せばいいじゃないか!という発想です。なるほどですね!!

一方でハンコを導入したはいいものの、ハンコを押せるスペースが限られていたためか、こんなパターンもありました

領収書に記載されている登録番号が直角になっている
領収書に記載されている登録番号が直角になっている

領収書に記載されている登録番号が斜めになっている
領収書に記載されている登録番号が斜めになっている

※実際に存在する適格請求書を元にLayerXで作成した領収書サンプル画像です
※画像内で色付けされている箇所が実際に「バクラク経費精算」が読み取っている箇所です

この件については、特に問題なく読み取ることができました。

というのも、バクラクのOCRは最初に文字認識を行っているのですが、この段階で文字の向きが異なっていても読み取れるようになっていました。そのため、登録番号が直角や斜めに表示されていても問題なく読み取ることができました!

エントリーNo.2 レシートの台紙に適格番号が印字されている

これも一部界隈で話題になったので、ご存じの方もいるのではないでしょうか

レシートの台紙に登録番号が印字されている
台紙に印字されている…!!

レシートの台紙の紙に印刷してしまえば、プリントする内容は何も変更しなくてよくなります!

こちらに関しても、登録番号はどこかしらの部分ではっきり印字できているものがあるため、その部分を読めれば問題ありませんでした。

(一方でこのタイプは、他の読み取りたい項目に被ってしまうと悪影響が出る可能性があり、登録番号の読み取りとは別の観点で辛いところがあったりします)

エントリーNo.3 登録番号が改行されている

登録番号が改行されている
登録番号が改行されている

これを見た時は、事前に想定していなかったパターンだったため驚きました…!

初期リリースバージョンではさすがに読み取れていなかったため、改行しても判定できるようにシュッと修正して対応しました!

エントリーNo.4 自社の登録番号が記載されている

請求書には基本的に発行主の適格番号が記載されていれば良いのですが、親切にも宛先の適格番号=自社の適格番号が記載されるケースもありました(受け取り請求書の場合)

このパターンの請求書では、誤って自社の登録番号を読み取ってしまうケースが発生しました。

自社の登録番号も記載された請求書
自社の登録番号も記載された請求書

こちらに関しては、現在進行形で自社の登録番号が読み取られないように対応を進めています!(もし今すぐ除外できないと困る!とお困りの方がいらっしゃれば、サポートまでお問い合わせください)

11/30追記 自社の登録番号を読み取らない(読み取っても除外する)対応を行い、こちらリリースされました!

support-invoice.layerx.jp

エントリーNo.5 仲介業者様の登録番号が記載されている

請求書には通常、発行者と宛名(請求書を受け取った場合は自社)が記載されています。しかし、取引の間に仲介業者が介在すると、仲介業者が代理で請求書を発行することがあります。

(例えばECサイトを運営されている企業様(仲介業者)が、店舗出店されている企業様に代わって代理で請求書を発行されている、など)

このケースで仲介業者様の登録番号が記載されていると、誤って仲介業者様の登録番号を読み取ってしまうケースが発生しました。

仲介業者の登録番号が記載された請求書
仲介業者の登録番号が記載された請求書

こちらに関しては代理発行の場合は仲介業者様の登録番号を読み取らないように、アドホック対応を入れました…!!(一部の代理発行のパターンのみ対応)

まだまだあるよ、こんな登録番号!!!

未対応のものを含め、他にも様々なパターンが出てきました。

  • 登録番号は記載されているが適格請求書ではない(適格請求書としては使えません、という記載がある)
  • 登録番号が括弧()で囲われている
  • 登録番号のTが〒や別の数字として文字認識してしまう

今後もまだ出てくると思いますので、都度対応していこうと思います!!

爆速対応できた秘訣

今まで紹介してきたものの一部は、プレスリリースにも出ています!

bakuraku.jp

インボイス制度開始1ヶ月でこのような爆速対応が可能だった背後には、以下のような理由があります!!

OCRの技術選定が優れていた

高精度な文字認識を利用していたため、文字の向きが異なっていても読み取れ、想定外のパターンにも対応ができていました!また、登録番号の読み取りをルールベースで実装していたため、アドホックな対応を低コストで行えました!

インボイス制度開始直後の対応準備が整っていた

インボイス制度開始後、予期しないパターンによる対応する必要があると予測できたため、あらかじめリソースを確保しておきました。そのおかげで、最優先で登録番号の読み取り対応を行うことができました!

ファクトベースで優先度付けをした

インボイス制度開始直後は混乱もあって問い合わせ数が急増し、問い合わせに一つづつ対応するのが困難な状態でした。そのため、まずお問い合わせ内容やアップロードされた書類のデータを分析しました。それにより、どれだけのお客様に影響があるのか、どの程度事象が発生しているのかを分析し、重要度と優先度を判断しました。

この優先度順の対応により、よりインパクトの大きい問題から解決し、多くのお客様により早くバクラク体験を提供できました!

LayerX行動指針 FactBase
LayerX行動指針 FactBase

凡事徹底でやり切った

単体で見れば、単純な修正で改善できる事象が多かったのですが、とにかく量を捌く必要がありました!大量の問い合わせにもめげず、凡事徹底でやり遂げました!

リリースまでのフローが多く自動化されていた

開発から単体テスト、リグレッションテスト、デプロイまで、多くのフローが自動化されていました。そのため、素早く安全にデリバリーできる環境が整っていました!

まさに、LayerXの開発速度が速い #とは ですね!!

speakerdeck.com

ありがたいことに、アップデートの度に「読めるようになった!感動した!」「待ってました!」といった喜びの声をたくさんいただきました。

それほど多くのお客様がインボイス制度に非常に苦労されているのだなと実感し、引き続き爆速開発でバクラク体験を提供していこうと思います!!

さいごに

今回は様々な登録番号パターンの紹介をしてきましたが、いかがでしたでしょうか。

登録番号に関してはルールベースでアドホック対応をごりごりと進めましたが、タスクや項目によっては機械学習モデルが動いています。

お客様が真に求めるのはどのような体験なのか、そのためにはどういう手法でどのように開発したらお客様にバクラク体験が提供できるのか、それらを考え抜いて技術選定を行なっています。

一緒にお客様にバクラク体験を提供していきませんか?

We are hiring!!

LayerXでは一緒に働く仲間を募集しています!!

私個人でもカジュアル面談フォームを作っていますので、お気軽にどうぞ!!

jobs.layerx.co.jp

layerx.co.jp