【Difyアプリ】社内向けに請求書画像から勘定科目を自動で判定するアプリを構築しました

経費精算、ほんとに面倒ですよね。特に、請求書や領収書を手作業で仕分けるのは一苦労。そんな悩みを解決するために、Difyアプリを使って、請求書画像から勘定科目を自動で判定するアプリを作ってみました!


経費精算でよくある課題

自分で仕訳をしている場合、領収書や請求書を経費として計上していいのか悩ましい

毎回、これは経費に入れていいのか迷ってしまいますよね。特に税理士に仕訳を依頼していない個人事業主にとっては判断が難しく、本来経費として計上できないものを計上してしまうことは避けたいものです

勘定科目が分からない。結果として仕訳がぐちゃぐちゃになる

仕訳の知識がないと、どの勘定科目を選べばいいのか分からなくて、いつもぐちゃぐちゃに。経営管理の観点でも、何にどれくらい費用が掛かっているのかわかりづらい状況になってしまいます

同じ取引先なのに、過去に登録した勘定科目と異なる勘定科目で登録してしまう

取引先は同じなのに、前回と違う勘定科目で登録してしまったり、これまた混乱のもとに。

Difyとは

AI言語モデルを用いてチャットボットなどの独自アプリを開発できるオープンソースのツール」です。

このツールを使えば、専門知識がなくても簡単に高機能なアプリを作成できます。

今回構築したアプリはPythonコードやGASなどを使用するので多少プログラミングの知識は必要になりますが、だいたいのアプリはノーコードで実装可能です

今回実装したDifyアプリでできること


請求書/領収書画像をアップロードすると、勘定科目を自動で判定してくれる

画像をアップロードするだけで、勘定科目を自動で判定。もう悩む必要なし!

判断の根拠は過去の仕訳データをベースにしているため、仕訳データに一貫性を保てる

過去の仕訳データを元にしているので、いつも一貫性のある仕訳が可能になります。

Difyアプリ構築の流れ

開始

右上の「機能」を選択し、「画像アップロード」をオンにしてください。

使用している会計ソフトから過去の仕訳データを出抑し、スプレッドシートに転記

弊社ではfreeeを使っているのですが、過去の仕訳データはCSVで出力することが可能です。そのデータを学習させるため、データをスプレッドシートに吐き出します。
各項目は以下のような形になっており、今回は「借方勘定科目」「借方金額」「借方取引先名」を学習させ、アップロードされた請求書/領収書の勘定科目を判定させるようにします

GASでスプレッドシートからDifyへデータ連携する準備

スプレッドシートの拡張機能からApp Scriptを選択します

コード.gsにJSON形式でレスポンスを返すプログラムを実装

function doGet(e) {
  let responseData = getSheetData(); 

  // JSON形式でレスポンスを返却
  return ContentService
    .createTextOutput(JSON.stringify({ "response": responseData }))
    .setMimeType(ContentService.MimeType.JSON);
}

function getSheetData() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1");
  const data = sheet.getRange("D2:D" + sheet.getLastRow()).getValues().flat();
  const dataH = sheet.getRange("H2:H" + sheet.getLastRow()).getValues().flat();
  const dataO = sheet.getRange("O2:O" + sheet.getLastRow()).getValues().flat();
  
  let combinedData = [];
  for (let i = 0; i < data.length; i++) {
    combinedData.push({
      勘定科目: data[i],  // D列を「勘定科目」として取得
      金額: dataH[i],     // H列を「金額」として取得
      取引先名: dataO[i]  // O列を「取引先名」として取得
    });
  }
  
  return combinedData;
}

「デプロイ」>「新しいデプロイ」を選択

「次のユーザとして実行」に「自分」を選択し、アクセスできるユーザに「全員」を設定します。
※ここの設定を間違えるとDifyからGASで出力したJSON形式のデータにアクセスできなくなるので注意!

「ウェブアプリ」のURLをコピーして「完了」を選択

これで学習用データをDifyへ連携する準備が整いました!

コードブロックでスプレッドシートのデータを読み込む

ここからDifyへ戻り、コードブロックのPythonコードでGASで吐き出されたデータを読み込む処理を作成します

「高度な依存関係」にPythonで使用しているパッケージ「request」を選択肢、出力変数に「result」と入力します

コードは以下の通りです

import urllib.request
import json
import ssl

def fetch_data():
    url = "ここにGASで作成した「ウェブアプリ」のURLをペースト"
    context = ssl._create_unverified_context()  # SSL証明書の検証を無効にする
    with urllib.request.urlopen(url, context=context) as response:
        if response.status == 200:
            data = response.read().decode('utf-8')
            return data  # 文字列データとして返す
        else:
            return None

def main():
    # データを取得してresult変数に格納
    result = fetch_data()
    return {
        "result": result,
    }

if __name__ == "__main__":
    output = main()
    print(output)

LLMでアップロードされた請求書画像をデータ化します

LLMでGASで出力されたデータをもとに、アップロードされた請求書データの勘定科目を判断します

テンプレートブロックでアウトプットデータを整形、終了ブロックを追加

実際に請求書画像をアップロードして判定させてみる

いざ実行!過去に何度かやり取りさせていただいているWeb制作会社さんの請求書を使ってみました。過去の仕訳では税理士に相談の上、広告宣伝費として計上しています

無事正しく広告宣伝費として計上されました!

今後の展開

今回は勘定科目の判定のみにとどまりましたが、今後はアップロードした請求書・領収書を経費として計上できるかどうか判定する機能も付け加えていきたいと思います。

まだ弊社は人数が少ないので顕在化していませんが、社員が増えてくると経費計上してもよいかどうかいちいち問合せが発生して面倒になるので、このアプリで一元的に管理していけたらと思ってます。

参考にしたサイトなど

池田朋弘のワーク実況_リモ研サブチャンネル


この記事が気に入ったらサポートをしてみませんか?