← 목록
기타 2026-05-27 7KB 읽기 7분

견적 기반 사양서/제안서 도구 (Phase 1~3 완료, 2026-05-27 트랙4 머지)

⚠️ 정리 이력

처음에 작업을 /견적서/ 모듈 안에 만들었으나, INVENTORY.md 의 5트랙 구조상 트랙4 /제안서/ 디렉토리가 이미 존재했음. 같은 날 4번째 중복 트랙을 만든 실수.

머지 작업 (2026-05-27):

  • 데이터·한선씨·HTML 6개·API 전부 /제안서/ 안으로 이전
  • 트랙4 기존 제안편집기.html, 제안서출력.html, 제안엔진.rpn.한선 보존
  • 충돌 회피 이름:
  • 내 통합 양식 HTML: 제안서_*.html제안빌더_*.html, 제안편집기.html제안빌더_편집기.html
  • 내 통합 엔진: 제안엔진.{한선,rpn.한선}제안빌더.{한선,rpn.한선}
  • API namespace: /견적서/api/제안서/제안서/api/빌더
  • 견적서 모듈의 사양서·제안서·build·tools 분기 전체 삭제 (server-docs.js 810줄 감소)
  • 데이터 마커: 빌더로 생성된 제안서는 _빌더:true 로 구분
  • 개요

    docs.crowny.org/제안서 안에서 견적서 → 사양서 → (통합) 제안서를 자동 생성하는 도구 체인. 제미나이 플래시라이트 같은 약한 LLM이 호출하기만 해도 고품질 결과물이 나오도록 결정론적 도구로 설계.

    견적서 (사람 입력)
      └─ 공종/항목/단가/공급자/발주처
            │
            ▼  공종 1:1 → 섹션, 사양사전 키워드 매칭
       사양서 (도구 자동 생성)
      └─ 표준사양·인증·시공조건 자동 채움
            │
            ▼  + 회사정보DB + LLM 입력(대상분석·추천사유)
       제안서 (도구 자동 생성)
      └─ 표지·요약·회사·분석·솔루션·사양·일정·견적요약 통합
    

    무엇을 했나

    Phase 1 — 사양서 (5 산출물)

    • data/사양사전.json — 14 카테고리, 15 규칙. 품명 키워드 → 표준사양·인증·시공조건
    • 한선씨/사양엔진.한선, 사양엔진.rpn.한선 — RPN 정통 동반 (헌법)
    • /제안서/api/사양서/* — from-quote, save, load, list, delete, dict
    • 사양서_가로.html, 사양서_세로.html — A4 출력. 세로형은 1품 1면 모드 토글
    • 사양편집기.html — 견적 선택 → 자동 생성 → 사양 키:값/인증/시공조건 편집

    Phase 2 — 제안서 (6 산출물)

    • data/회사정보DB.json — 공급자 풀 정보 (소개/역량/차별점/실적/인증/보증)
    • 한선씨/제안엔진.한선, 제안엔진.rpn.한선 — 동반
    • /제안서/api/빌더/* — from-quote(GET/POST), save, load, list, delete, companies
    • 제안서_가로.html, 제안서_세로.html — 8 페이지 구성 (표지·요약·회사·분석·솔루션·사양·일정/견적·결제)
    • 제안편집기.html — 견적+회사+양식 선택 → 자동 → 대상분석·추천사유 편집

    도구화의 핵심

    LLM(제미나이 플래시)이 채울 것은 4개 필드 + 2개 텍스트만:

    bashPOST /제안서/api/빌더/from-quote
    {
      "id": "<견적ID>",
      "회사슬러그": "crowny-media",
      "대상분석": {
        "현황": "...", "요구사항": "...", "제약조건": "...", "기대효과": "..."
      },
      "차별점": ["...", "..."],
      "추천사유": "..."
    }
    

    도구가 결정론적으로 채우는 부분:

    • 표지 (제안번호·제목·부제·발주처·발행자)
    • 요약 (한줄·핵심수치 4개: 공종수·기간·공급가액·합계)
    • 회사정보 (회사정보DB.json에서 일괄)
    • 핵심 사양 (사양사전.json 키워드 매칭 적용)
    • 견적 요약 (공종별 소계·공급가액·부가세·합계)
    • 일정 (6단계 표준)
    • 결제·보증·특기사항
    → LLM 의존도 최소화. 약한 LLM도 도구 호출만 잘 하면 고품질.

    관련 파일

    /Users/ef/CrownyDoc/
    ├── server-docs.js                       (1530-1860 라인 견적/사양/제안 API)
    ├── 견적서/
    │   ├── data/
    │   │   ├── 사양사전.json                 (14 카테고리, 15 규칙)
    │   │   ├── 회사정보DB.json               (crowny-media 1건)
    │   │   ├── 사양서/{id}.json              (저장소)
    │   │   └── 제안서/{id}.json              (저장소)
    │   ├── 한선씨/
    │   │   ├── 사양엔진.한선, .rpn.한선
    │   │   └── 제안엔진.한선, .rpn.한선
    │   ├── 사양서_가로.html, 사양서_세로.html
    │   ├── 사양편집기.html
    │   ├── 제안서_가로.html, 제안서_세로.html
    │   └── 제안편집기.html
    

    테스트 URL

    사양서:
      http://localhost:4100/제안서/사양편집기.html
      http://localhost:4100/제안서/사양서_가로.html?from=qmphs2sglbq4t
      http://localhost:4100/제안서/사양서_세로.html?from=qmphs2sglbq4t&일품일면=1
    
    제안서:
      http://localhost:4100/제안서/제안빌더_편집기.html
      http://localhost:4100/제안서/제안빌더_서_가로.html?from=qmphs2sglbq4t
      http://localhost:4100/제안서/제안빌더_서_세로.html?from=qmphs2sglbq4t
    
    도구 API (LLM용):
      GET  /제안서/api/사양서/from-quote?id=<견적ID>
      POST /제안서/api/빌더/from-quote  body:{id,대상분석,차별점,추천사유,...}
      GET  /제안서/api/빌더/companies
      GET  /제안서/api/사양서/dict
    

    Phase 3 — 도구화 (완료)

    tools.json 매니페스트

    /제안서/api/tools.json — 14개 도구 OpenAPI 풍 선언. LLM이 한 번에 읽어 어떤 도구가 있는지 파악. 필드 설명·예제·권장 흐름까지 포함.

    /build — 단일 진입점 ★★

    LLM이 단 한 번의 POST로 사양서+제안서 자동 생성+저장+URL 반환:

    bashPOST /제안서/api/build
    {
      "from_quote": "<견적ID>",
      "대상분석": { "현황":..., "요구사항":..., "제약조건":..., "기대효과":... },
      "차별점": ["...", "..."],
      "추천사유": "...",
      "적용기술": ["..."]
    }
    
    → {
      "ok": true,
      "견적": { "id":..., "합계":... },
      "사양서": { "id":..., "사양번호":..., "URL":{"편집기","세로","가로"}, "섹션수":6 },
      "제안서": { "id":..., "제안번호":..., "URL":{"편집기","세로","가로"}, "합계":... }
    }
    

    옵션:

    • type: 사양서|제안서|둘다 (기본: 둘다)
    • 회사슬러그: 회사정보DB 키 (기본: crowny-media)
    • 양식: 세로형|가로형 (기본: 세로형)
    • 저장: true|false (기본: true. false면 데이터만 반환)

    검증 시나리오 (3가지 모두 통과)

    1. 최소 입력 — 현황 1줄 + 추천사유 1줄 → 9페이지 제안서 완성
    2. 권장 입력 — 4필드 + 차별점 4개 + 추천사유 + 적용기술 5개 → 완전 제안서
    3. 데이터만저장:false로 호출 시 JSON만 반환 (저장 없음)

    LLM 입장에서의 흐름

    1. GET /제안서/api/tools.json     ← 도구 목록 1회 확인
    2. GET /견적서/api/list           ← 견적 ID 선택
    3. POST /제안서/api/build          ← 본문성 필드만 채워서 한 번 호출
    4. 반환된 URL을 사용자에게 안내
    

    약한 LLM(제미나이 플래시라이트)도 도구 호출만 하면 9페이지 고품질 제안서.

    잔여 이슈 / 다음 단계

    • 회사정보DB 다중 — crowny-media 외 다른 발행자 슬러그 추가
    • 사양사전 확장 — 음향·조명·CCTV·네트워크·공조 카테고리
    • 양식 추가 — 회신용 1페이지 요약, 입찰용 정식 양식
    • PDF 서버측 렌더 — Chromium headless로 인쇄 결과 동일 PDF 생성