メインコンテンツへスキップ

Difyで作る、書類読み取りアプリの失敗しやすいポイント全部のせ

    画像

    「全部目視」が終わらない問題

    「AIで書類を読ませたい。でも間違いが怖い」。
    わかります。私も同じでした。

    今回やってみて分かったのは、
    怖さの正体は「読み取り精度」ではなく
    「どう整理するか」の設計不足だったこと。

    失敗込みで全部書きます。


    つらいのは「読む」じゃなくて「写す」だった

    業務書類から必要な項目を拾ってCSVにする。
    地味に時間が溶けます。

    しかも1案件に複数書類。
    見落としが怖くて、結局「全部目視」に戻りがちです。

    つらいのは、実は「読む」ことではありませんでした。

    • 目的の項目を探す

    • それを別ファイルへ写す

    この2つが延々と続く。
    これが摩擦の正体でした。

    欲しい項目は、だいたい固定です。
    管理番号A、管理番号B、受付番号、照合番号。
    明細番号、確認番号、規格区分。

    1枚だけなら何とかなります。
    でも現実は、1案件に複数書類。

    同じ情報が重複したり。
    片方にしか無かったり。
    番号が微妙に違ったり。

    だから最後に、全部を見直してしまう。
    ここが一番時間を使います。


    カギは「読み取り」より「構造化」

    今回の学びはこれでした。
    AIで解くべきは「読み取り」ではなく「構造化」。

    具体的には、3段に分けると安定します。

    1. 書類ごとに抽出する

    2. 案件単位で統合する

    3. 明細単位でCSV行に展開する

    ここで要になるのが、CSV設計です。
    私は 「1行=明細単位」 にしました。

    現場で確認したい単位が、明細だからです。
    複数件が当たり前なら、最初からリスト形式で扱う。
    これが自然でした。

    もう1つ。
    推測させない。

    AIは空欄を埋めたがります。
    でも業務では、埋めるほど事故が増えます。

    • 見つかったら入れる

    • 無ければ空欄(null)

    • 不一致なら warnings に残す

    このルールに寄せました。


    ワークフローを3段に分けてみた

    ワークフロー型のAIツールで
    「案件単位で回る流れ」を作ってみました。

    ① 入力を"案件"として受け取る

    入力は複数ファイル。
    まとめて受け取ります。

    加えて、案件ID(case_id)を付けます。
    フォルダ名相当でOK。

    可能なら、書類種別のヒントも付けます。
    (例:請求書 / 照合書類 / 予約書類 のような扱い)

    このヒントがあるだけで、後工程が安定しました。

    ② 繰り返し処理で「1ファイルずつ」抽出する

    複数ファイルを一気に読ませると崩れやすい。
    なので 1ファイル=1回抽出 にしました。

    流れはこうです。

    • メタ情報取得(ファイル名など)

    • 種別判定(ヒント優先)

    • 画像も読めるモデルで抽出

    • 軽い整形(リスト形式を保証)

    出力は必ずデータの入れ物(JSON形式)で返します。
    明細はリスト形式。0件でもOK。

    案件共通になりやすい項目は上に。
    明細はリストにまとめる。

    この形にすると、あとで統合がラクになります。

    ③ 案件単位で"統合"する

    ここが今回の肝でした。

    書類ごとの結果を、案件として1つにまとめます。
    統合ルールは「安全優先」。

    • 複数書類で一致 → 採用

    • 候補が複数で不一致 → 値は空欄、warningsへ

    • 明細の識別番号をキーに重複排除

    • 確認番号が食い違う → warningsへ

    最頻値で強引に埋める方法もあります。
    でも今回は、まず事故を避ける設定にしました。

    ④ 明細単位に行展開してCSV生成

    統合結果の明細をひとつずつ展開。
    1明細=1行です。

    どの書類から拾ったかも残します。
    複数なら「;」区切りで並べます。

    最後にCSVを生成して返す。
    ここまで来ると、目視は「warningsの行だけ」で済みます。


    効いたこと・失敗したこと

    効いたこと

    一番効いたのは、リスト形式前提。
    明細が複数でも崩れにくくなり、取りこぼしが減りました。

    次に効いたのは、統合ステップ。
    書類単体では正しく見えても、案件で矛盾が出ます。

    それを機械的に検知して warnings に出す。
    これが「最後に全部目視」を減らしてくれました。

    失敗したこと

    失敗は3つありました。

    1つ目。CSVの形を決めずに進めた。
    最初は「1案件=1行」で考えました。
    でも明細が複数で破綻。
    途中で設計変更になり、手戻りしました。

    教訓:「1行=何か」を最初に決める。
    おすすめは、現場で確認したい単位に合わせることです。

    2つ目。書類種別の判定を軽く見た。
    ヒントが無い場合に、抽出の指示を共通化しました。
    すると拾い方が混ざります。
    ある番号を別の番号として拾うことが起きました。

    教訓:種別ヒントを渡す導線を最初から用意する。

    3つ目。「推測禁止」の指示が弱かった。
    「値が無ければ空欄にして」と指示したつもりでした。
    でもAIは空欄が嫌いらしく、前後の文脈から
    それっぽい値を補ってきます。

    見た目は正しそう。
    でも元の書類のどこにもその番号がない。
    気づくのが遅れたら、そのまま通っていたかもしれません。

    以来、「無ければ空欄」ではなく
    「無ければ"該当なし"と書け」 に変えました。


    明日から試すなら

    いきなり全部自動化は不要です。
    まず「案件→抽出→CSV」を1回通す。

    そのための最小チェックはこれです。

    • CSVの1行単位を決める(おすすめ:1行=明細単位)

    • 抽出結果はデータの入れ物(JSON形式)で固定する

    • 推測禁止を明文化する(無ければ「該当なし」、不一致はwarnings)

    • 明細は必ずリスト形式(0件でもOK)

    • 書類ごとの結果を、案件で統合するステップを入れる

    • 不一致や欠損は warnings に残す

    • 目視は「warningsの行だけ」に寄せる


    次は、投入側の運用も含めて整えます。

    今の「種類別フォルダ保存」を活かしたまま、
    案件単位で投げられる形に寄せたい。

    外側で case_id と document_type_hint を付けて渡す。
    ここができると、判定が安定して warnings も減るはずです。


    関連記事


    #AI活用100本ノック 進捗:11/100
    次回の実験:フォルダ運用を変えずに、案件単位で自動投入できる"投入フロー"を作る(hint付きで渡す)
    ツール紹介してます:


    このnoteでは、現場改善・AI活用・小さな自作ツールの試行錯誤を記録しています。
    初めての方はこちらからどうぞ。
    ▶ はじめての方へ|このnoteで書いていること




    あなたへのおすすめ