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
- ラベル自体が誤読された場合は欠損として扱われ、検出できない。
- JSON Schema は部分実装で、未対応キーワードは fail-fast。
- blocked はデモ経路が無くユニットテストのみ。
- 実プロバイダに差し替えれば通信は発生する。
- 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)。追加インストールなしで再実行できる。
| 領域 | 内容 |
|---|---|
| extractor | tests/extractor.test.js(境界打ち切り) |
| normalizer | 日付の Date.UTC 往復・tri-state の語境界 |
| confidence | block 解決・欠損 0 |
| review-gate | 4 状態と理由コード・30% 閾値の blocked |
| schema-validator | 部分実装。未対応キーワードは失敗させる |
| safe-errors | assertSafeErrorShape |
| no-network | tests/no-network.test.js:22-140(毒化 + ソース走査 + 依存ゼロ検証) |
| golden | fixtures/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 レスポンス起点の数え方 |
| 抽出項目 | 12 | src/field-definitions.js の定義数 |
| 実装 | src/ の JavaScript 12 ファイル | src 配下の JavaScript 12 ファイル(src/providers/mock-provider.js を含む) |
| テスト | 157 passed / 40 suites / 0 failed | npm test(2026-08-15 実行。2026-08-20 に再実行し同数を確認)/ CI run 32023326504 |
| 依存パッケージ | 0 | package.json に dependencies / devDependencies のキー自体が無い。tests/no-network.test.js が検証 |
10Links
Links
document-field-extraction-demo/src/extractor.js:27-72document-field-extraction-demo/src/normalizer.js:19-104document-field-extraction-demo/src/confidence.js:35-99document-field-extraction-demo/src/review-gate.js:42-87document-field-extraction-demo/src/schema-validator.jsdocument-field-extraction-demo/src/safe-errors.js:12-93tests/fixtures/expected-output.json
設計文書の読む順
docs/architecture.md