LayerX エンジニアブログ

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

読み取りの精度の先の体験を追求するバクラクのAI-OCR

こんにちは、全ての経済活動をデジタル化したいTomoakiです。 推しのコンビニスイーツはセブンイレブンの草もちです。 今回は読み取りの精度の先の体験を追求するバクラクのAI-OCR機能について紹介します。

TL;DR

  • バクラクでは国税関係書類に対してOCRを実行し、書類の内容の入力作業の負担を減らしている
  • お客様の業務をラクにするには、帳票に記載されている値をそのままサジェストするのでは不十分
  • バクラクのAI-OCR機能では、読み取った帳票に記載の値を活用しつつ、お客様の業務に寄り添った形に変換してサジェストすることで、なめらかなプロダクト体験を提供している

バクラクのOCR

会社の営みにはファイルが溢れています。

取引先から届く請求書、会食で利用したレストランの領収書、業務委託メンバーに毎月渡す支払通知書など、会社規模によっては毎月何十万、何百万という枚数の書類が扱われています。そしてそれらのファイルに対しては、その内容を入力するというプロセスがつきもので、多くの人がデータの入力作業に追われています。

バクラクでは請求書や領収書をはじめ、見積書、納品書など国税関係書類に対してOCRを実行し入力のサジェストを行うことで、ユーザーが書類の内容を手入力する手間を省いています。

経費精算で入力項目がOCRで読み取られて色塗りされ、入力のサジェストがされる

例えばこちらは私が先日移動に利用したタクシーの領収書です。日付、金額、支払先を自動で読み取ってサジェストをしているため簡単に経費精算できました。 お客様の手入力を削減するには「精度が高い」OCRを作ることが重要です。

経理業務における書類のOCRは難しい

では「精度が高い」OCRとはなんでしょうか?

帳票に記載されている金額や日付を正確に全部読み取れれば良いのでしょうか?

例えば上のような請求書があり、取引先名、支払金額、支払期日の3項目のOCRを実行し、OCRの読み取った値が以下だったとします。

  • 支払金額:55,000円
  • 支払期日:2023年3月31日
  • 取引先名:バクラク弁護士法人

ほとんどの場合これで問題ありません。

しかし、お客様によっては本当にサジェストして欲しい値は別の場合があります。 以下に例を示します。

金額の場合、請求書記載の金額から源泉徴収税を差し引くかもしれません。この時、経理担当者は請求額から源泉徴収税と実際に振り込む額を計算し、それぞれに金額で仕訳を作る必要があります。

上記の例の場合、「55,000円」ではなく、税抜価格の50000円の10.21%に相当する5105円を差し引いて「49385円」を入力するといった具合です。個人事業主と取引が多い会社によってはこのような請求書を毎月何百枚も処理する必要があります。

支払期日の場合、支払業務の都合で支払日を25日など特定の日付に固定して入力しているかもしれません。

上記の例の場合、「2023年3月31日」ではなく、「2023年3月25日」を入力するといった具合です。請求書に記載されている支払期日に関して全て25日に統一するのであれば、ほぼ全ての請求書の支払期日に関して修正が必要になります。

取引先名の場合、請求書記載の法人名ではなくお客様が普段接している担当者の名前を入力しているかもしれません。また、個人事業主の取引先が屋号の名前で発行している請求書に対して、個人事業主の名前と入力しているかもしれません。

上記の例の場合、「バクラク弁護士法人」ではなく、担当弁護士名の「田中太郎」と入力するといった具合です。個人事業主と取引が多い会社や慣習的に担当者を取引先名として登録している場合には都度修正が必要になります。

このように愚直に書いてある文字列をお客様に返してしまうと、読み取り自体の精度が高くても場合によっては都度修正が発生してしまい、残念ながら業務はラクにならず、体験が悪くなってしまいます。 経理業務におけるOCRは意外と奥深くそして難しいですね。

読み取りとサジェストのタスクを分離する

では、どのようにすればお客様の業務はラクになるでしょうか。

バクラクでは、帳票に書いてある文字列を読み取るタスクと、ユーザーが実際に欲しい値をサジェストするタスクを分離しています。

問題を分解した上で、難易度や精度、コストのバランスを鑑みた上で適切な処理に機械学習を適用することが重要だと考えています。 「機械学習」という技術で価値を創出する技術 / techniques-to-create-values-with-ml-layerx - Speaker Deck

今回は実際に読み取った後に実際にユーザーが実際に欲しい値をサジェストするための後処理を紹介します。

請求書の例に戻りましょう。

支払金額

支払金額の場合、読み取った金額が「源泉所得税が差し引かれた後の金額か否か」も読み取ることで適宜サジェストする支払金額を変更しています。

今回の例の場合、請求書記載の金額は源泉徴収税が差し引かれていません。一方で取引先として判定された「バクラク弁護士事務所」は毎月源泉徴収税を差し引く必要がある取引先です(源泉徴収税を差し引く必要があるかは取引先登録時に設定される)。

ということは、支払金額として読み取った「55000円」から源泉徴収税を差し引いた「49385円」を自動計算して支払金額としてサジェストすることでお客様の計算や入力作業の負担を軽減します。

※実際はもう少し複雑ですが説明のために簡略化してます

支払期日

支払期日の場合、支払期日のルールを設定できるようにしています。 例えば、「請求書に記載されている支払期日に対して、当月の25日に支払期日を設定する」などと設定すれば、読み取り値の「2023年3月31日」を当月の25日である「2023年3月25日」に変換してサジェストがされます。

当然、当月ではなく翌月にしたり、25日ではなく27日にしたり、土日祝日の場合翌営業日にずらしたりすることもできます。 こうすることで、読み取った値を活用しつつ、お客様の業務に沿った値をサジェストすることができます。 bakuraku.jp

取引先名

取引先名の場合、複数の名称を取引先として登録することができるようにし、「田中太郎」という取引先には「バクラク弁護士法人」というサブの名前も登録できるようにしておきます。 そうすることで、お客様が請求書をアップロードしたときには「バクラク弁護士法人」という読み取り値から、取引先を検索し「田中太郎」をサジェストすることができます。

さいごに

このように、バクラクでは読み取った帳票に記載の値を活用しつつ、お客様の業務に寄り添った形に変換してサジェストすることで、なめらかなプロダクト体験を提供しています。

今回は読み取りの後処理について紹介しましたが、読み取り自体が失敗してしまったケースにおいても体験をなるべく損なわないようにするための工夫もしています。

tech.layerx.co.jp

LayerXでは単純な読み取り精度の一歩先の体験を追求することで、経理業務にワクワクするような体験を届けられるように日々開発しています。 一緒にワクワクを届けるエンジニア大募集しておりますので、興味が湧いた方はOpendoorで是非メンバーとお話ししましょう!

jobs.layerx.co.jp

私のはこちらになるのでお気軽にどうぞ(タイトルに関係ない内容でも全然OKです)

jobs.layerx.co.jp