1. はじめに
福祉業界で管理・営業・運営に携わりながら、生成AIエンジニアコースを受講してアプリを作りました。今回は建設業界の「見積書づくりに時間がかかりすぎる」という課題をAIで解決します。
建設会社の見積書作成は、想像以上に時間と手間がかかる業務です。
- 図面を印刷して広げ、寸法を一つひとつ手計算する
- 根切り・砕石・型枠・鉄筋・コンクリートそれぞれの数量を電卓で拾い出す
- 自社の単価表を参照しながらExcelに手入力する
- 上司のチェック → 修正 → 再計算の繰り返し
「図面を見て積算してExcelに打ち込む」この工程だけで、熟練の積算担当者でも1案件あたり数時間かかります。小規模な工務店では、営業担当者が兼務でこなすケースも多い。
そこで作ったのが、図面をアップロードするだけでAIが積算し、見積書を自動生成するアプリです。
このシステムが実現したこと:
- 数時間 → 数分: 図面アップロードからExcel出力まで自動化
- 属人化の解消: 熟練者でなくても同じ精度で積算できる
-
カスタマイズ性: 自社の単価マスターExcelをアップロードするだけで対応
開発期間・工数:
| フェーズ | 内容 | 工数 |
|---|---|---|
| 要件定義・設計 | 課題の整理、技術選定 | 約5時間 |
| AI プロンプト設計 | GPT-4o Visionの精度調整 | 約10時間 |
| システム実装・デバッグ | UI構築、単価マスター連携、Excel出力 | 約25時間 |
| 合計 | 総開発期間:約2週間 | 約40時間 |
現場業務の隙間時間で構築しました。
2. 作ったもの
デモURL
https://construction-estimate-ai.streamlit.app
GitHub
https://github.com/lifectai/construction-estimate-ai
▼ アプリのトップ画面:単価マスターと図面をアップロードするだけ
▼ 単価マスターExcelをアップロードすると工事種別と単価が自動で読み込まれる
▼ GPT-4o が図面を解析して数量を自動抽出(信頼度・根拠も表示)
▼ 材料費・労務費・機械経費の内訳付き見積書が自動生成される
▼ 見積書をExcelでダウンロード
アプリの流れ
- 自社の単価マスター(Excel)をアップロード
- 図面・仕様書(PDF/画像)をアップロード
- 会社名・工事名・諸経費率を入力
- 「AI積算を実行」ボタンを押す
- GPT-4o が図面を解析して数量を抽出
- 単価マスターと掛け合わせて見積書を生成
- Excelでダウンロード
システム全体の流れ(アーキテクチャ)
工務店・建設会社
↓
Streamlit Webアプリ
├─ ① 単価マスターExcel(自社の単価を読み込む)
├─ ② 図面・仕様書(PDF/PNG/JPG)
└─ ③ 工事情報(会社名・工事名・諸経費率)
↓
OpenAI API(GPT-4o Vision)
└─ 図面から工事種別・数量・仕様を自動抽出
↓
積算エンジン(Python)
└─ 数量 × 単価マスター = 見積金額を計算
↓
Excel出力(openpyxl)
└─ 材料費・労務費・機械経費の内訳付き見積書
3. システム構成
| 技術 | 用途 |
|---|---|
| Python | バックエンド全般 |
| Streamlit | WebアプリUI |
| OpenAI API (GPT-4o Vision) | 図面の画像解析・数量抽出 |
| openpyxl | 単価マスターの読み込み・見積書のExcel出力 |
| PyMuPDF (fitz) | PDFを画像に変換してGPT-4oに送信 |
app.py 1ファイルで完結する構成にしました。Streamlit Cloudにデプロイしているため、サーバー管理も不要です。
4. なぜこの技術を選んだか
GPT-4o Vision を選んだ理由
図面は「テキスト」ではなく「画像」です。寸法・配筋・仕様などの情報が図面上に視覚的に記載されている。ルールベースのOCRでは対応しきれない複雑な情報を、GPT-4o Visionなら自然言語で読み取れます。
また「1案件ごとに図面の書き方が異なる」という建設業界の現実にも、汎用的なVisionモデルが最も柔軟に対応できると判断しました。
単価マスターをExcelで管理する理由
建設会社が既に持っている単価表は、そのままExcelで管理されていることがほとんどです。新しいツールに移行させるのではなく、「今使っているExcelをそのまま使える」設計にすることで、現場への導入障壁を下げられます。
クライアントが単価を変えたいときはExcelを更新するだけ。AIの役割は「数量を読み取ること」で、単価の責任はクライアントが持つ。この役割分担が実務的な設計です。
Streamlit を選んだ理由
ファイルアップロード・スライダー・ダウンロードボタンなど、このアプリに必要なUI部品がすべて揃っている。Pythonだけで完結するため、フロントエンドの知識なしで実用的なWebアプリが作れます。
5. 実装のポイント
GPT-4o Vision への図面送信
PDFはそのままでは画像として送れないため、PyMuPDFで1ページずつPNG画像に変換してからAPIに送信しています。
import fitz # PyMuPDF
def pdf_to_images_b64(pdf_bytes: bytes) -> list[tuple[str, str]]:
"""PDFの各ページをPNG画像に変換してbase64リストを返す"""
doc = fitz.open(stream=pdf_bytes, filetype="pdf")
results = []
for page in doc:
pix = page.get_pixmap(dpi=150)
img_bytes = pix.tobytes("png")
b64 = base64.b64encode(img_bytes).decode()
results.append((b64, "image/png"))
doc.close()
return results
単価マスターの柔軟な読み込み
Excelの「使い方」シートのようなタイトル行だけのシートを自動スキップし、「工事項目」と「単価」列が揃っているシートだけを工事種別として読み込みます。
def load_unit_price_master(excel_file) -> dict:
wb = openpyxl.load_workbook(excel_file, data_only=True)
master = {}
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
header = None
rows_out = []
for row in ws.iter_rows(values_only=True):
if all(c is None for c in row):
continue
if header is None:
candidate = [str(c).strip() if c is not None else "" for c in row]
# 「項目」と「単価」を両方含む行をヘッダーとして採用
if any("項目" in c for c in candidate) and any("単価" in c for c in candidate):
header = candidate
continue
# データ行の処理...
if rows_out:
master[sheet_name] = rows_out
return master
AI に「工事項目一覧」を渡す設計
単価マスターから読み込んだ工事項目名をそのままプロンプトに埋め込み、GPT-4oに「この項目の数量を読み取れ」と指示します。これにより、カスタムの単価マスターにも対応できます。
items_desc = "\n".join(
f" - {item['工事項目']}(単位: {item['単位']})"
for item in master_items
)
system_prompt = f"""あなたは建設積算の専門家AIです。
【工事種別】{construction_type}
【積算対象の工事項目一覧】
{items_desc}
以下のJSON形式のみで回答してください:
{{
"quantities": {{
"<工事項目名>": {{"quantity": <数値>, "unit": "<単位>", "basis": "<算出根拠>"}}
}},
"confidence": "<解析信頼度: 高/中/低>",
"summary": "<図面解析の要約>",
"notes": [<特記事項のリスト>]
}}"""
AIがやること・やらないことの設計
このアプリで生成AIが担当しているのは1点だけです。
- ✅ AIがやること: 図面から工事項目の数量を読み取る
- ❌ AIがやらないこと: 単価を決める、最終的な見積もりの責任を持つ
数量の計算は確実なプログラムで行い、単価はクライアントが自社の単価マスターで管理する。AIに任せるべき部分と任せるべきでない部分を明確に分けた設計です。
6. デプロイ手順(Streamlit Cloud)
① .gitignoreの設定(最重要)
APIキーや単価マスターが誤ってGitHubにアップされないよう、必ずコミット前に設定します。
.streamlit/secrets.toml
.DS_Store
*.xlsx
*.png
*.jpg
files.zip
② GitHubにpush
git init
git add app.py requirements.txt README.md
git commit -m "first commit"
git push origin main
③ Streamlit Cloudで接続
share.streamlit.io にアクセスし、「Create app」→「Deploy a public app from GitHub」を選択。
④ Secretsを登録
管理画面の「Settings > Secrets」に以下を入力します。
OPENAI_API_KEY = "sk-..."
7. つまずいたポイント(全記録)
(1)単価マスターの「使い方」シートが誤読される
Excelの先頭に説明用の「使い方」シートを入れていたところ、タイトル行をヘッダーと誤認識してエラーが発生。
解決策:「項目」と「単価」の両方を含む行だけをヘッダーとして採用するロジックに変更。タイトル行は自動スキップされるようになりました。
(2)GPT-4oが空レスポンスを返す
図面画像によってはGPT-4oが空のレスポンスを返し、JSONパースエラーが発生。
解決策:finish_reasonをチェックしてエラーメッセージを分けて表示。コンテンツフィルタに引っかかっている場合と、画像が認識できていない場合で原因を切り分けられるようにしました。
(3)PDFをGPT-4oに直接送れない
PDFをそのまま画像として送信しようとしたところエラーが発生。
解決策:PyMuPDFでPDFを1ページずつPNG画像に変換してからAPIに送信。DPI=150で変換することで、文字や図面の細部も認識できる解像度を確保しました。
(4)Streamlit CloudでのPyMuPDFインストールエラー
requirements.txtにPyMuPDFと記載したところ、デプロイ時にエラーが発生するケースがありました。
解決策:PyMuPDF>=1.24.0と明示的にバージョンを指定して解決。ローカルでは動くのにクラウドで動かない場合はrequirements.txtのバージョン指定を疑いましょう。
8. 今後の展望
- 過去見積書の学習: 実際に使われた見積書データをFine-tuningに活用して精度向上
- 見積書フォーマットのカスタマイズ: クライアントの既存Excelテンプレートに自動適用
- 複数図面の一括処理: 大型案件の複数図面をまとめて積算
- 地域別・時期別の単価自動更新: 市場の資材価格変動に対応
- 工事進捗管理との連携: 見積もりから発注・原価管理までの一元化
9. おわりに
このアプリを作って改めて感じたのは、「現場を知っているからこそ作れるAIがある」ということです。
「積算に時間がかかる」という課題は、建設業界にいない人間には見えにくい。でも現場の業務フローを知っていれば、どこにAIを入れると効果的かが自然と見えてくる。
技術は手段であって目的ではない。「AIで何かを作りたい」ではなく、「この課題をAIで解決したい」という発想が、実際に使われるプロダクトを生む。
福祉・建設・医療など、アナログな業務が多く残る業界ほど、AIの活躍余地は大きいと感じています。同じような課題を抱えている方の参考になれば嬉しいです。
GitHub: https://github.com/lifectai/construction-estimate-ai
デモ: https://construction-estimate-ai.streamlit.app