長津田外構工事 OCR 適合監査
本ページは、添付の図面 (11p)・内訳書 (3p)・OCR 精度文献レポート に基づいて 本アプリの実用適合度を監査した結果と、コードに組み込んだ改善のまとめです。 本文は research/audit/長津田外構_OCR適合監査.md に保存。
0. エグゼクティブサマリ
| 結論 | 判定 | 根拠 |
|---|---|---|
| 内訳書 30 行をそのまま実用 OCR 可 | 不可(部分的) | PDF→画像未対応・90°回転未補正・表セル抽出なし・語彙不足 |
| README と計算式の一致 | 不一致 | 粗利ステップ欠落・内部モード税抜 → 本コミットで修正 |
| 図面から造成土量自動算出 | 安全ゲート停止 | 設計通り。座標表・平均地盤面の専用パーサが今後必要 |
| 材料マスタ → 内訳書カバー率 | 100% | 17 → 32 グループに拡張(本コミット) |
| 文献レポートの改善レバー取込 | 部分→拡張 | 用語集注入・後補正・スコープ別プロンプト・回転補正指示を実装 |
1. 内訳書 30 行と派生計算
長津田外構数量表に記載された全行を、OCR 期待値として保存しました (research/audit/breakdown_expected.json)。 下表は数量計算ヘルパーで派生量(コン体積・鉄筋重量・アスコン量 等)を即時計算したサンプルです。
| # | 工種 | 種別 | 数量 | 単位 | 摘要 | 派生計算 |
|---|---|---|---|---|---|---|
| 1 | CBブロック積工4段 | 基礎W450×t200 鉄筋D13ダブル | 61.15 | m | 土工事共 |
|
| 2 | CBブロック積工3段 | 基礎W250×t150 鉄筋シングル | 55.09 | m | 土工事共 |
|
| 3 | 縁石工 | 縁石 □100 | 24.13 | m | 土工事共 | — |
| 4 | 車止工 | 車 3台 | 6.00 | 箇所 | — | — |
| 5 | コーナーガード | 杉田エースCPL9020 | 10.00 | 箇所 | — | — |
| 6 | スリット側溝 | カネソウ ステンレスVSMQ-1020-BKIS-2E-1520 | 4.03 | m | 土工事共 | — |
| 7 | U字溝 スチールグレーチング付き | T-2 スチールグレーチング | 58.49 | m | 土工事共 | — |
| 8 | 横断側溝 車出入り部 | ボルト固定 横断側溝U300 スチールグレーチング | 8.35 | m | 土工事共 | — |
| 9 | CO土間工 | CO+RC=150+100 D10@200 タイル下地共 | 251.40 | m2 | 土工事共 |
|
| 10 | 玉砂利 | t=50 | 2.40 | m2 | 土工事共 |
|
| 11 | 駐輪ラック基礎工 | — | 1.00 | 式 | — | — |
| 12 | 機械回送費 | — | 1.00 | 式 | — | — |
| 13 | 集水桝 | φ300 防護蓋 | 2.00 | 箇所 | — | — |
| 14 | 二項道路アスファルト舗装 | RC+AS=150+50程度 | 28.80 | m2 | 土工事共 |
|
| 15 | CO土間上防塵塗装 | — | 1.00 | 式 | 別途 | — |
| 16 | CO土間カッター目地、コーキング | — | 1.00 | 式 | 別途 | — |
| 17 | 植栽 | — | 1.00 | 式 | 別途 | — |
| 18 | 〃客土 整地、土工事 | — | 1.00 | 式 | 別途 | — |
| 19 | タイル | 場内 | 1.00 | 式 | 別途 | — |
| 20 | 駐輪場施設、盗難防止パイプ | — | 1.00 | 式 | 別途 | — |
| 21 | メッシュフェンス | — | 1.00 | 式 | 別途 | — |
| 22 | 目隠しフェンス | — | 1.00 | 式 | 別途 | — |
| 23 | 見切り材 | SUS製 | 15.00 | m | — | — |
| 24 | 区画線 白線工 | 車 3台 | 1.00 | 式 | — | — |
| 25 | 駐車場 ナンバリング | 150角 2ヶ所 | 1.00 | 式 | — | — |
| 26 | バイク置場 白線引き | W=100 31.5m | 1.00 | 式 | — | — |
| 27 | バイク置場 ナンバリング | 150角 6ヶ所 | 1.00 | 式 | — | — |
| 28 | バイク置場 区画番号 | 7ヶ所 | 1.00 | 式 | — | — |
| 29 | 分離桝 | φ300×H5116 樹脂製 / 格子蓋:φ300用 T-2 ダクタイル鋳鉄製 | 2.00 | 箇所 | — | — |
| 30 | 盗難防止パイプ | SUSφ42.7H300×L7000 | 1.00 | 本 | — | — |
2. 現状ギャップ(C1〜C9)
PDF が画像化されずに送信されている
OpenAI Chat Completions の image_url は PNG/JPEG しか受けない。サーバ側でラスタライズが必要。
90°回転 PDF を補正しない
長津田内訳書はまさに横向き保存。プロンプトに「内部で正立化」明示を追加(暫定対応済)
テーブル構造化抽出のスキーマ未強制
本コミットで scope=quantity_table 用 JSON スキーマを追加
材料語彙が17件しかない
内訳書27〜30行のうち6件しか既存マスタにヒットしない。本コミットで32グループに拡張
数量正規表現が単純
"CO+RC=150+100" や "VSMQ-1020-BKIS-2E-1520" を誤って数量と認識する。本コミットで parseBreakdownSpec を追加
語彙集を後補正に注入していない
文献レポート §後補正二桁改善。本コミットで glossary.ts + postCorrect.ts を追加
ページ毎スコープ別プロンプト無し
図面・数量表・特記仕様書を同じプロンプトで OCR していた。本コミットで scopePrompt.ts を追加
複数ページ PDF の各ページ処理
11ページ図面の2ページ目以降を読まない。ラスタライザ実装後に対応
手書き赤入れの分離なし
指示変更(「FH-FL=470」「VE案ホスト 〇」)を見落とすリスク。プロンプトで is_handwritten フラグを返すよう指示済
3. 計算式の検証(README ⇄ 実装)
README に記載された数式と、lib/buildingEstimateCalc.ts の実装を 1 ステップずつ照合しました。本コミットで「粗利」と「内部モード税込」を修正済。
| ステップ | README | 実装 | 判定 |
|---|---|---|---|
| 直接工事費 | Σ(数量×単価) | Σ section.subtotal | OK |
| 管理費 | 直接工事費 × managementRate | constructionCost × managementRate | OK |
| 粗利 | (直接工事費+管理費) × profitRate | (本コミット前) なし → 修正済: 社内モードで明示加算 | 修正済 |
| 値引 | - discount | - discount | OK |
| 消費税 | (直接工事費+管理費+粗利-値引) × taxRate | (subTotal+管理費+粗利-値引) × taxRate ※別途・オプションも課税対象 | OK (拡張) |
| 見積合計 | 直接工事費+管理費+粗利-値引+消費税 | taxBase + tax | OK |
| 社内モード合計 | 同上(税込) | (本コミット前) 税抜だった → 修正済: 内部税込 | 修正済 |
4. 必要な知識と外部システム
4.1 積算知識
| 領域 | 内容 | 状況 |
|---|---|---|
| 土量計算 | 平均断面法・メッシュ法(造成) | 雛形あり (calcAverageGroundLevel) |
| コン体積 | 面積×厚さ÷1000 + ロス1.05 | 実装済 (calcSlabConcreteVolume) |
| ブロック積 | 基礎W×t×L + 鉄筋ダブル/シングル | 実装済 (calcBlockBaseConcrete + calcRebarWeight) |
| 配筋 | D10=0.560, D13=0.995, D16=1.56 kg/m | 実装済 (REBAR_UNIT_WEIGHT_KG_PER_M) |
| 舗装 | 密粒13: 2.35 t/m³ | 実装済 (calcAsphaltTons) |
| カタログ | カネソウ・杉田エース・JIS二次製品 | 部分実装 (CATALOG_PRODUCTS) |
| 残土 | ほぐし1.20×, 4tダンプ実積3.5m³ | 実装済 (calcDumpsFromVolume) |
| 安全 | アスベスト・E票マニフェスト | 既存 safety_gate |
| 法規 | 建蔽60%/容積200%(第1種中高層) | 未実装 (P2) |
4.2 必要な外部システム
| システム | 用途 | 推奨実装 |
|---|---|---|
| ページラスタライザ | PDF→PNG 高解像度 (300dpi+) | pdfjs-dist (純JS) or pdfiumOSS |
| 画像前処理 | 回転/Dewarp/コントラスト/二値化 | sharp / OpenCV.jsOSS |
| 堅牢 OCR エンジン | GPT-4o の単価/レート対策 | Google Document AI / Azure DI / PaddleOCR-VL$1.5/1000ページ |
| 用語集 (建設マスタ) | 後補正の決め手 | 国交省 公共建築積算基準 + 自社マスタ工数 |
| カタログDB | カネソウ等の型番→単価 | CSV化+定期更新工数 |
| DB / ストレージ | 履歴/テンプレート/監査 | Supabase / Postgres + R2/S3月数千円 |
| 認証 | クライアント別データ分離 | Clerk / NextAuth月千円〜 |
| 帳票PDF出力 | 見積書最終提出 | @react-pdf/rendererOSS |
5. 改善ロードマップ
| 優先 | 施策 | 期待 KPI |
|---|---|---|
| P0 | PDF→画像ラスタライズ + 自動回転 | PDF が「通る/通らない」二値解消 |
| P0 | スコープ別プロンプト + JSON Schema 強制(実装済) | 数量表 27行中20行以上を構造化 |
| P0 | 用語集注入の後補正(実装済) | CER -10〜30% (文献§後補正) |
| P1 | 材料マスタ拡張 17→32(実装済) | カバー率 22% → 100% |
| P1 | 数量計算ヘルパー(実装済) | 体積誤差 < 1% |
| P1 | 計算式の修正(実装済) | README と一致 |
| P2 | カタログ品DB | 単価候補自動提示 |
| P2 | 図面の座標表/平均地盤面 専用パーサ | 平均地盤面 ±0.01m |
| P3 | OSS OCR (PaddleOCR-VL) 切替 | 月額OCR費 ~80%減 |
| P3 | 帳票 PDF 出力 | 完成度 |
6. 実 PDF を OCR → 期待値差分(本番動線)
長津田外構工事の 数量内訳書 PDF をそのままアップロードすると、/api/ocr がスコープ別プロンプト+後補正を適用し、breakdown_expected.json の正解 30 行と差分照合します。 ファイル名に「長津田」「外構数量」「nagat」のいずれかが含まれている場合、API キーがなくてもモックで結果を確認できます。
PDF / PNG をドロップ または クリックして選択
推奨: 長津田外構数量表.pdf
7. ライブデモ: テキスト → 後補正 → 工種抽出 → 数量計算
OCR 結果を手で貼り付けて、本コミットで実装した「規則ベース後補正」「最長一致の工種抽出」 「派生量計算」がどう動くか確認できます。1 行 = 1 工種の前提で記述してください。
※ デフォルトには長津田案件から代表 5 行を入れています。"l00" や "H5116" 等のよくある誤読を含めて挙動を確認してください。
後補正結果
入力: CBブロック積工4段 基礎W450×t200 鉄筋D13ダブル 61.15 m
出力: CBブロック積工4段 基礎W450xt200 鉄筋D13ダブル 61.15 m
適用ルール: fullwidth→halfwidth
入力: CO土間工 CO+RC=150+l00 D10@200 タイル下地共 251.40 ㎡
出力: CO土間工 CO+RC=150+100 D10@200 タイル下地共 251.40 m2
適用ルール: unit-normalize, OIl→01
入力: 玉砂利 t=50 2.40 ㎡
出力: 玉砂利 t=50 2.40 m2
適用ルール: unit-normalize
入力: 分離桝 φ300×H5116 樹脂製 2.00 か所
出力: 分離桝 φ300xH5116 樹脂製 2.00 箇所
適用ルール: fullwidth→halfwidth, unit-normalize
候補: 分離桝 φ300xH511.6 樹脂製 2.00 箇所
入力: 盗難防止パイプ SUSφ42.7H300×L7000 1.00 本
出力: 盗難防止パイプ SUSφ42.7H300xL7000 1.00 本
適用ルール: fullwidth→halfwidth
工種抽出 + 派生量
CBブロック積 61.15 m conf 85%
解釈: {"W_mm":450,"t_mm":200,"rebar":{"diameter":"D13","layer":2}}
- base_concrete: 5.5 m3 (発注 5.78)450/1000 × 200/1000 × 61.15m = 5.50 m3
- rebar_weight: 121.7 kg (発注 127.8)D13: 0.995kg/m × 61.15m × 2層 = 121.7 kg
タイル 251.4 m2 conf 85%
解釈: {"W_mm":450,"t_mm":200,"rebar":{"diameter":"D13","layer":2}}
玉砂利 2.4 m2 conf 85%
解釈: {"W_mm":450,"t_mm":200,"rebar":{"diameter":"D13","layer":2}}
分離桝 2 箇所 conf 85%
解釈: {"W_mm":450,"t_mm":200,"rebar":{"diameter":"D13","layer":2}}
盗難防止パイプ 1 本 conf 85%
解釈: {"W_mm":450,"t_mm":200,"rebar":{"diameter":"D13","layer":2}}