🤖

LLMを用いてレシートからの情報抽出を始めようとする話

2024/07/18に公開

WEDでMLエンジニアやDSもしている園芸係です。普段は、社内の窓際と家のベランダでたくさんの植物を育てています。

WEDでは、お客さんからレシートを買い取るサービスONEを開発運用しています。
そして、買い取ったレシート毎に、店舗情報や購買時間、商品名やその値段などの情報を抽出します。
それらの抽出・集積した情報は、他社の商品開発や分析マーケティングに使用されます。

ONEでのレシートからの情報抽出は大きく2段階に分けて処理されます。さらに、後者は3つの記事に分かれています。

これまで

店舗情報や商品名の抽出は正規表現を使って取得していました。
チェーン店毎に、表記の仕方、印刷名が違い、それらに合わせて表記を調整するということを行なっていました。

問題点

正規表現の例1 正規表現の例2

正規表現が多くなってくると、その管理が難しいという問題が起こってきました。また、正規表現を使う限り、どうみても不要な情報も抽出してしまうという問題も見つかりました。

  • ある正規表現の変更が、別の場所にどう影響するか分からなくなる
  • 正規表現が長すぎて読めない、理解できない
  • 商品名に複数の商品が入ってしまう
  • 商品名に「おにぎり」とあれば取得したいけど、「クーポン」や「ありがとうございます」は不要
  • 値段に「120円」とあれば取得したいけど、「10円引」は不要

改善案

そう空気読んで意味を意味を考えてくれるもの、と言えば、AI です。
今回、レシートからの情報抽出にも長けていそうということで、LLM モデルを採択しました。
レシートは、独特の表記が多く、これに対応するため、配布されている日本語モデルに対し、Fine Tuning を行いました。

Fine Tuning に使用した教師データは以下のように実データではなく、レシートっぽいデータを作成しました。

  • 入力
    • 表記は各チェーン店の形式に合わせて作ったテキストデータ
    • 商品名、個数、値段は出力と合うように。
  • 出力
    • 次の集合のリスト
      • 商品名
      • 個数
      • 値段
        このデータで Fine Tuning した結果はというと・・・

結果

これによって、商品名は1行毎に区切られ、かつ「クーポン」「10円引」など明らかに商品名や値段とも違うものは含まれないようになりました。
以下の例は、上のレシートの OCR, Annotate の結果となります。

WED Engineering Blog

Discussion