Synthetic data / Demo掲載している画面はすべて合成データです。実顧客・実案件・本番運用の記録ではありません。
TTECHNICALDocument Field Extraction Demo

帳票の OCR 後処理パイプライン(CLI)

Document Field Extraction Demo

設備点検票の OCR レスポンスから 12 項目を取り出し、項目ごとに確信度を出し、弱いものだけを理由つきで人へ戻す。

01このページについて

このページについて

対象Document Field Extraction Demo(document-field-extraction-demo/)
公開 claim の正本document-field-extraction-demo/README.md
実装形態個人開発です。項目の取り出し・正規化・自信度・振り分け・形式検証・合成データの生成・テストまでを 1 人で実装しました。読み取りサービス本体は含めておらず、入力は合成された読み取り結果です。

含めていないもの

  • 元となった業務フローは OCR プロバイダを組み込んでいる。このデモはその後半(抽出・正規化・確信度・検証・レビューゲート)だけを対象にする。
02Architecture

Architecture

Synthetic OCR Response → Mock OCR Provider → OCR Response Validation → Field Extraction → Normalization → Confidence Scoring → Review Gate → Schema Validation → Structured JSON の 9 段。合成 PDF は VISUAL ONLY の別枠で、PDF → OCR の矢印は存在しない。

03Why this architecture

Why this architecture

段ごとに入出力を固定し、プロバイダ境界を src/ocr-response.js の検証済み形状へ寄せた。これにより ①帳票を変える変更は field-definitions.js + schema に閉じる ②読み取りサービスの差し替えは annotate() 1 メソッドに閉じる。

  • confidence をページ単位で持つ設計

    低品質項目が平均に埋もれる。

  • normalizer が値を補修する設計

    誤りが不可視化する。

  • レビュー UI まで含める設計

    実装範囲が誤読される。

04Failure modes

Failure modes

  1. ラベル自体が誤読された場合は欠損として扱われ、検出できない。
  2. JSON Schema は部分実装で、未対応キーワードは fail-fast。
  3. blocked はデモ経路が無くユニットテストのみ。
  4. 実プロバイダに差し替えれば通信は発生する。
  5. empty_text は exit code 1 を返す(scripts/demo.js:83。失敗経路の期待値であってテスト失敗ではない)。
05Trade-offs

Trade-offs

  • 依存ゼロを優先したため Schema 検証は部分実装にとどまる。
  • 決定性のためクロックを固定しており、実運用では実時刻を渡す。
  • 補正しない方針は review_required の件数を増やす方向に働く。
06Tests

Tests

157 passed / 40 suites(2026-08-15 に npm test)。追加インストールなしで再実行できる。

157 passed / 40 suitesnpm test(2026-08-15)

領域内容
extractortests/extractor.test.js(境界打ち切り)
normalizer日付の Date.UTC 往復・tri-state の語境界
confidenceblock 解決・欠損 0
review-gate4 状態と理由コード・30% 閾値の blocked
schema-validator部分実装。未対応キーワードは失敗させる
safe-errorsassertSafeErrorShape
no-networktests/no-network.test.js:22-140(毒化 + ソース走査 + 依存ゼロ検証)
goldenfixtures/expected-output.json との照合
07Security / Data handling

Security / Data handling

  • safe-errors.js:12-93 が 4 キー固定のエラー形状を保証。
  • プロバイダ例外は wrap せず discard。
  • no-network テストが fetch / XMLHttpRequest / WebSocket を毒化して全シナリオを走らせる。
08Limitations

Limitations

できること・含めていないことの各行に対応。README「Scope」「No network access」「Synthetic data」を正本とする。

この公開デモに含めていない

  • OCR の精度の証拠にはならない。この作品は OCR を実行していない。
  • レビュー画面は含めていない。判定を返すところまでの実装。
  • passed は「確認済み」ではなく「レビュー不要」。値は人が受け入れるまで候補のまま。
09Scale

Scale

項目実測値取得方法
パイプライン9 段(合成 OCR レスポンス → 構造化 JSON)DFE-V04 の 9 ボックス。合成 OCR レスポンス起点の数え方
抽出項目12src/field-definitions.js の定義数
実装src/ の JavaScript 12 ファイルsrc 配下の JavaScript 12 ファイル(src/providers/mock-provider.js を含む)
テスト157 passed / 40 suites / 0 failednpm test(2026-08-15 実行。2026-08-20 に再実行し同数を確認)/ CI run 32023326504
依存パッケージ0package.json に dependencies / devDependencies のキー自体が無い。tests/no-network.test.js が検証
10Links

Links

  • document-field-extraction-demo/src/extractor.js:27-72
  • document-field-extraction-demo/src/normalizer.js:19-104
  • document-field-extraction-demo/src/confidence.js:35-99
  • document-field-extraction-demo/src/review-gate.js:42-87
  • document-field-extraction-demo/src/schema-validator.js
  • document-field-extraction-demo/src/safe-errors.js:12-93
  • tests/
  • fixtures/expected-output.json
設計文書の読む順
  1. docs/architecture.md

Case Study を読む→

原寸表示。掲載側の crop はレイアウト上の切り抜きで、ここでは全体を表示している。