見出し画像

【生成AI×事務】DifyでOCR&見積自動化アプリを作ってみた!

「生成AIの使い所がなかなか見つからない……」「生成AIって具体的に何ができるの?」

と、お悩みの方におすすめしたいのが、プログラミング不要で生成AIアプリを作れるプラットフォーム「Dify」です。

こちらのDifyは、各社の生成AIモデルや外部ツールを自由に組み込んで本格的なアプリを作れるのが魅力で、リコーやサイバーエージェントも絶賛活用中のソリューションとなっています。

今回は、そんなDifyの使い心地・手触り感をお伝えするべく、実際にDify上で「請求書のOCRアプリ」と「見積もりアプリ」を作って使ってみます。

本noteは「Difyの実際の使用感を知っておきたい方」におすすめです。完読いただくと、以下のことがわかるようになるでしょう!

1️⃣ Difyの実際の活用イメージ
設定の方法から実際の活用シーンまで実演を交えてご紹介します。

2️⃣ Difyでのアプリの作例
記帳や見積もり等、実際の業務にすぐ活用できるアプリを作成します。

3️⃣ 業務効率化におけるDifyの実力
作ったアプリを実際に使ってみて、その威力をお見せします。


📌 Noteをご覧になっている方へ
WEELでは、生成AIを業務や事業に取り入れたい方向けの各種セミナーを開催しています。
「どんな活用ができるのか知りたい」「自社でどう始めればいい?」という方に向けて、現場視点のノウハウや最新事例をご紹介しています。
セミナーに参加する


まずはDifyの概要から

Difyは、ノーコードでRAGチャットボットやAIエージェント等の本格的な生成AIアプリを開発できるプラットフォームです。

このDifyの特徴は下記のとおり。専門知識がなくても、さまざまな要件・環境に適した生成AIアプリを用意できます。


このDifyなら、委託・フルスクラッチでの生成AIアプリ開発は不要で、生成AIによる業務効率化・DXを手軽に実現できちゃいます。

今回はそんなDifyを使って下記のアプリ2種を実際に作成。Difyの使用感をお届けします。

  • 請求書の写真から品名等を抽出してくれるOCRアプリ

  • 過去の取引事例から見積もりを生成してくれるアプリ

なお、Difyでできることについて詳しく知りたい方は、下記の記事も併せてご確認ください。


DifyでOCRアプリを作ってみた

今回は、Difyのワークフローを使って「請求書の写真から品名等を抽出してくれるOCRアプリ」を作っていきます。

はじめに、今回制作するOCRアプリの全容は下記のとおりです。

  1. ユーザー入力:請求書の画像・PDFを取得

  2. LLM:請求書中の品名・個数・単価・合計金額等を抽出してMarkdown化

  3. コード実行:MarkdownをJSONにパース(変換)

  4. コード実行2:単価×個数と合計金額がイコールになるかを検算

  5. テンプレート:スプレッドシートにペーストしやすい形に加工

  6. 出力

それでは以下、各ブロックの詳細をみていきましょう!

1.ユーザー入力

まずは、Difyのワークフローの起点となる、「ユーザー入力」の設定についてです。

今回は、「ドキュメント」または「画像」の単一ファイルを受け付けるように指定しました。これで、手書きを撮影したものからPDFまで、幅広い請求書の読み取りが可能となります。

「ドキュメント」または「画像」の単一ファイルを受け付けるように指定

2.LLM

次にDifyの「LLM」ブロックでは、ビジョン(画像認識)機能を活用して、請求書から品名・個数・単価・合計金額・日付・発行元を抽出しています。

ここでは小型LLM(今回はGemini 2.5 Flash-Lite)でも動作を安定させるため、「パラメータ抽出」ブロックをあえて不採用に。要素の抽出とMarkdown形式での整理だけを行う形としました。

LLM

3.コード実行

続いては「コード実行」にて、先ほど抽出・Markdown化した請求書の各要素を、Dify内で扱いやすいJSON形式へと変換(パース)します。

コード実行

ここでは、下記のPythonコードを使用しました。出力は「品名・個数・金額・合計金額からなる配列」と「発行元名の文字列」、「発行日時の文字列」の3種類としています。

import unicodedata
import re
def normalize_number(value: str) -> int:
    value = unicodedata.normalize("NFKC", value)
    value = value.replace(",", "").strip()
    value = re.sub(r"[^\d]", "", value)
    return int(value) if value else 0
def is_separator_row(row: str) -> bool:
    stripped = row.replace("|", "").replace("-", "").replace(" ", "")
    return stripped == ""
def extract_basic_info(md: str):
    client = re.search(r"発行元名:\s*(.+)", md)
    date = re.search(r"日付:\s*([\d\-]+)", md)
    client_name = client.group(1).strip() if client else ""
    invoice_date = date.group(1).strip() if date else ""
    return client_name, invoice_date
def main(vision_output: str):
    md = vision_output or ""
    md = re.sub(r"```.*?```", "", md, flags=re.S)
    # ===== 基本情報抽出 =====
    client_name, invoice_date = extract_basic_info(md)
    # ===== 明細抽出 =====
    rows = md.split("\n")
    items = []
    for row in rows:
        if "|" not in row:
            continue
        if "品名" in row:
            continue
        if is_separator_row(row):
            continue
        cols = [c.strip() for c in row.split("|")[1:-1]]
        if len(cols) >= 4:
            name = cols[0].strip()
            if not name or set(name) == {"-"}:
                continue
            items.append({
                "name": name,
                "quantity": normalize_number(cols[1]),
                "unit_price": normalize_number(cols[2]),
                "total_price": normalize_number(cols[3]),
            })
    return {
        "client_name": client_name,
        "invoice_date": invoice_date,
        "items": items
    }

4.コード実行 2

今度は2つ目の「コード実行」について。ここでは、LLMで抽出した内容の正しさを確認するため、各品目の個数×単価と合計金額がイコールになるかを検算しています。

コード実行 2

使用したPythonコードは以下のとおりで、「エラーの有無」と「品名・個数・金額・合計金額からなる配列」、「エラー箇所の配列」を返すようにしました。

def main(items: list):
    errors = []
    for i, item in enumerate(items):
        expected = item["quantity"] * item["unit_price"]
        if expected != item["total_price"]:
            errors.append({
                "row": i,
                "name": item["name"],
                "expected": expected,
                "actual": item["total_price"]
            })
    return {
        "is_valid": len(errors) == 0,
        "errors": errors,
        "items": items
    }

5.テンプレート

次に、文字の表示スタイルを整える「テンプレート」ブロックでは、抽出した品名・個数・単価・合計をスプレッドシートへの転記が容易なTSV形式に整理させています。

テンプレート

6.出力

最後に「出力」ブロックでは、請求書から抽出・整理した要素を以下の順番で表示するよう設定しています。

  • 品名・個数・単価・合計の表(TSV)

  • 請求書の発行元名

  • 請求書の発行日時

出力

Difyで見積もり自動化アプリも作ってみた

次に、「過去の取引事例から見積もりを生成してくれるアプリ」についても、Difyのワークフローで作成します。こちらの全容は下記のとおりです。

  1. ユーザー入力:見積もる案件を受付

  2. LLM:案件名に関連するワードを生成して検索精度を向上

  3. 知識検索:過去の取引例を検索

  4. LLM 2:知識検索の結果から案件に合った見積もりを生成

  5. 出力

「過去の取引事例から見積もりを生成してくれるアプリ」

それでは、当アプリについても設定をみていきましょう。

1.ユーザー入力

まずは「ユーザー入力」について。今回は見積もりの題材を短文でDifyへ入力できるようにしました。

ユーザー入力

2.LLM

次に、最初の「LLM」ブロックではユーザーから与えられたお題について、関連ワードを生成します。

ここで得た関連ワードは、次の知識検索でより確実に関連する知識を見つけるために活用されます。

.LLM

3.知識検索

続いて、「知識検索」ブロックでは、先ほどのお題&生成ワードに関連する過去の取引事例(品目と相場)を検索します。

知識検索

なお、登録しているナレッジベースの元データは下記のとおりです。

ナレッジベースの元データ

4.LLM 2

2つ目の「LLM」ブロックでは、ここまでで得たお題と知識検索の結果をもとに、最適な見積もりを生成します。

なお、今回はスプレッドシートへの転記のしやすさを考えて、TSV形式で結果を表示させるようにしました。

LLM 2

5.出力

最後に、「出力」ブロックでは、2つ目のLLMブロックで生成した見積もりをそのままユーザーに表示させるように設定しました。

出力

なお、Difyと他の生成AIツールの違いについて詳しく知りたい方は、下記の記事も併せてご確認ください。


Dify製アプリ2種を使ってみた

ここからは、先ほど作成した2種のDifyアプリを実際に使ってみます。それでは以下、OCRアプリから詳細をみていきましょう。

OCRアプリ

今回はDify製OCRアプリに以下の見積書を読み込ませてみます。果たして、OCRアプリは品名・数量・単価・合計金額等を正確に抽出してくれるのでしょうか?

OCRアプリ

気になる結果は以下のとおり。会社名が発行元ではなく顧客側になってしまっていますが、それ以外は完璧に抽出できました。

結果

これなら、紙媒体の帳票をやり取りしている現場でも、記帳作業が大幅に効率化できそうですね。

見積もり自動化アプリ

次に、Difyで作った見積もり自動化アプリについても、「スチール棚のバリ取り」という題材でその性能を検証してみます。

見積もり自動化アプリ

それでは早速、下図で結果をお見せします。

結果

かなり現場感のある、実用的な見積もりになっているのではないでしょうか。ここからさらに、RAGのしくみやプロンプトを工夫すれば、実務で使えるレベルになりそうです。

なお、Difyの活用事例について詳しく知りたい方は、下記の記事も併せてご確認ください。


Difyのよくある質問・FAQ

最後に、Dify全般についてのよくある質問・FAQにお答えしていきます。

Q.Difyのローカル版とWeb版の違いは?

A.Difyのローカル版 / Web版の違いは下表のとおりです。

DifyのWeb版とローカル版の違い
DifyのWeb版とローカル版の違い

Q.Difyの料金は?無料で使える?

A.Difyはローカル版・Web版ともに、無料からでも利用可能です。ただし、生成AIモデルの使用や外部ツールとの連携に際しては別途、API等の追加料金が必要です。

また、Web版Difyでは無料プランのほかに2種類の有料プランが設定されており、アプリの利用回数やストレージの制限を緩和するには課金が必要となります。

Difyの料金
参考:https://dify.ai/jp/pricing

Q.使えるAIモデルは?

A.Difyでは、有名どころのAPIモデルから日本語特化のローカルモデルまで、幅広い生成AIモデルが利用可能です。以下にその例を示します。

  • OpenAI

  • Anthropic

  • Gemini

  • Llama

  • Ollamaモデル

  • Hugging Faceモデル 等


Difyで地味に面倒な作業を自動化しよう!

本noteでは、Difyで実際にOCRアプリ&見積もり自動化アプリを作ってみて、その使用感をお届けしました。

Difyなら、各社のLLMやオリジナルのコード&テンプレート、その他プラグインをフル活用してニッチな雑務も自動化できちゃいます。

みなさんもぜひ一度、身近なタスクでDifyの威力をお試しあれ!

なお、業務に特化したノーコードツールn8nの事を知りたい場合は以下の記事をご覧ください。


WEELでは、生成AIを業務や事業に取り入れたい方向けの各種セミナーを開催しています。

「どんな活用ができるのか知りたい」「自社でどう始めればいい?」という方に向けて、現場視点のノウハウや最新事例をご紹介しています。

生成AIの最新ニュース・事例・イベント情報をいち早く知りたい方は、ぜひWEELの無料メルマガをご購読ください!

💡 AI活用、どこから始めればいいかお悩みの方へ
「AIエージェントって実際にどう使うの?」
「チャットボット作ってみたいけど何から始めれば…?」

そんな方向けに、無料の個別相談をやってます!
現場での事例も交えて、わかりやすくお話しします。

いいなと思ったら応援しよう!