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

「全部目視」が終わらない問題
「AIで書類を読ませたい。でも間違いが怖い」。
わかります。私も同じでした。
今回やってみて分かったのは、
怖さの正体は「読み取り精度」ではなく
「どう整理するか」の設計不足だったこと。
失敗込みで全部書きます。
つらいのは「読む」じゃなくて「写す」だった
業務書類から必要な項目を拾ってCSVにする。
地味に時間が溶けます。
しかも1案件に複数書類。
見落としが怖くて、結局「全部目視」に戻りがちです。
つらいのは、実は「読む」ことではありませんでした。
目的の項目を探す
それを別ファイルへ写す
この2つが延々と続く。
これが摩擦の正体でした。
欲しい項目は、だいたい固定です。
管理番号A、管理番号B、受付番号、照合番号。
明細番号、確認番号、規格区分。
1枚だけなら何とかなります。
でも現実は、1案件に複数書類。
同じ情報が重複したり。
片方にしか無かったり。
番号が微妙に違ったり。
だから最後に、全部を見直してしまう。
ここが一番時間を使います。
カギは「読み取り」より「構造化」
今回の学びはこれでした。
AIで解くべきは「読み取り」ではなく「構造化」。
具体的には、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 も減るはずです。
関連記事
FAQを作ったのに同じ質問が来る本当の理由:https://note.com/clean_whale1844/n/n2d7163c51a42
担当者の感覚に頼らない在庫管理へ。定期レポートで負担を削る:https://note.com/clean_whale1844/n/naa8fa1b86d11
#AI活用100本ノック 進捗:11/100
次回の実験:フォルダ運用を変えずに、案件単位で自動投入できる"投入フロー"を作る(hint付きで渡す)
ツール紹介してます:
このnoteでは、現場改善・AI活用・小さな自作ツールの試行錯誤を記録しています。
初めての方はこちらからどうぞ。
▶ はじめての方へ|このnoteで書いていること