Files
sam-docs/sam/docs/plans/ai-quotation-engine-plan.md
김보곤 f8c4536331 docs: [ai-quotation] STT/음성 녹음 현황 반영 — 미구현→구현완료 업데이트
- 음성 녹음 섹션: 기초만→구축 완료로 변경 (GoogleCloudService, AiVoiceRecordingService 등)
- Phase 2: 기존 STT 인프라 재사용 반영, 기간 2주→1주 단축
- 참조 구현 파일 목록 추가
2026-03-02 15:27:41 +09:00

43 KiB

AI 견적서 자동생성 엔진 개발 계획

작성일: 2026-03-02 상태: 기획 초안 프로젝트: SAM API + MNG 우선순위: 🔴 필수 참조: docs/features/ai/README.md, docs/features/quotes/README.md, docs/rules/customer-pricing.md


1. 개요

1.1 목적

SAM 계약 완료 후 매니저가 고객사 직원과 인터뷰를 진행할 때, 인터뷰 내용을 AI가 분석하여 SAM 표준 견적서 형태로 자동 변환하는 엔진을 구축한다.

현재 매니저가 수동으로 수행하는 프로세스:

┌──────────────┐    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│  SAM 계약    │ →  │  현장 인터뷰  │ →  │  업무 파악    │ →  │  견적서 작성  │
│  완료        │    │  (매니저+직원)│    │  (수동 정리)  │    │  (수동 작성)  │
└──────────────┘    └──────────────┘    └──────────────┘    └──────────────┘

AI 엔진 도입 후:

┌──────────────┐    ┌──────────────┐    ┌──────────────────────┐    ┌──────────────┐
│  SAM 계약    │ →  │  현장 인터뷰  │ →  │  AI 엔진              │ →  │  견적서 초안  │
│  완료        │    │  (매니저+직원)│    │  (음성/텍스트 분석)    │    │  (자동 생성)  │
│              │    │              │    │  (업무 매핑)           │    │  (매니저 확인)│
└──────────────┘    └──────────────┘    └──────────────────────┘    └──────────────┘

1.2 핵심 원칙

원칙 설명
자체 AI 엔진 Claude API 기반으로 SAM 전용 AI 서비스 구축
기존 인프라 활용 ai_configs, ai_token_usages, ai_pricing_configs 테이블 재사용
견적 시스템 연동 기존 quotes, quote_items 테이블과 직접 연동
Multi-tenant 모든 데이터에 tenant_id 격리 적용
점진적 확장 Phase 1 텍스트 → Phase 2 음성 (STT 구현 완료, 통합만 필요) → Phase 3 학습 고도화

1.3 기존 인프라 현황

AI 인프라 (구축 완료)

구성요소 상태 비고
ai_configs 테이블 완료 Claude provider 설정 가능
ai_token_usages 테이블 완료 토큰/비용 자동 추적
ai_pricing_configs 테이블 완료 Claude 모델 단가 등록
AiTokenHelper 완료 saveClaudeUsage() 메서드 존재
MNG AI 설정 UI 완료 /system/ai-config

견적 시스템 (구축 완료)

구성요소 상태 비고
quotes 테이블 완료 견적 마스터
quote_items 테이블 완료 견적 품목 상세
QuoteService 완료 견적 CRUD, 상태 관리
QuoteCalculationService 완료 BOM 10단계 계산
견적 API 엔드포인트 완료 REST API 전체

음성 녹음/STT (구축 완료)

구성요소 상태 비고
ai_voice_recordings 테이블 완료 DB 스키마 + CRUD
GCS 업로드 완료 GoogleCloudService — GCS 저장/조회/삭제
Google Cloud STT 변환 완료 GoogleCloudService::speechToText() — LongRunningRecognize, ko-KR
Web Speech API (브라우저 STT) 완료 voice-recorder.blade.php — 실시간 음성→텍스트 (무료)
STT + Gemini AI 분석 완료 AiVoiceRecordingService — 음성→STT→AI 분석 파이프라인
화자 분리 (Diarization) 완료 MeetingMinuteService — Speaker Diarization
영업 상담 음성 녹음 완료 ConsultationController — MediaRecorder + STT + GCS 백업

참조 구현 파일:

  • mng/app/Services/GoogleCloudService.php — Google Cloud STT/GCS 통합 서비스
  • mng/app/Services/AiVoiceRecordingService.php — STT + Gemini 분석
  • mng/app/Services/MeetingMinuteService.php — 회의록 STT + 화자분리
  • mng/app/Http/Controllers/Sales/ConsultationController.php — 영업 상담 음성
  • mng/resources/views/sales/modals/voice-recorder.blade.php — 브라우저 음성 녹음 UI
  • docs/features/voice-input-stt-guide.md — STT 기술 가이드

📍 현재 진행 상태

항목 내용
마지막 완료 작업 기획 초안 작성
다음 작업 Phase 1 상세 설계 → 구현
진행률 0/4 Phase (0%)
마지막 업데이트 2026-03-02

2. 시스템 아키텍처

2.1 전체 구조

┌─────────────────────────────────────────────────────────────────┐
│                        SAM AI 견적 엔진                          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌───────────────┐    ┌───────────────────────┐                │
│  │  입력 채널     │    │  AI 분석 파이프라인     │                │
│  │               │    │                       │                │
│  │  📝 텍스트    │───→│  1. 인터뷰 전처리      │                │
│  │  🎤 음성(P2)  │    │  2. 업무 도메인 분류    │                │
│  │  📄 문서(P3)  │    │  3. SAM 모듈 매핑      │                │
│  └───────────────┘    │  4. 견적 항목 추출      │                │
│                       │  5. 금액 산출           │                │
│                       └──────────┬────────────┘                │
│                                  │                              │
│                                  ▼                              │
│  ┌───────────────────────────────────────────────┐             │
│  │              견적서 생성기                       │             │
│  │                                               │             │
│  │  SAM 표준 모듈 카탈로그  ←──→  Claude API     │             │
│  │  고객 요금 정책           ←──→  프롬프트 엔진  │             │
│  │  기존 견적 템플릿          ←──→  결과 파서     │             │
│  └──────────────────────┬────────────────────────┘             │
│                         │                                       │
│                         ▼                                       │
│  ┌───────────────────────────────────────────────┐             │
│  │              출력                               │             │
│  │                                               │             │
│  │  📊 견적서 초안 (quotes 테이블)                │             │
│  │  📋 업무 분석 리포트                           │             │
│  │  💡 추천 모듈 목록                             │             │
│  └───────────────────────────────────────────────┘             │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

2.2 Claude API 연동 구조

┌──────────────────┐         ┌──────────────────┐
│  SAM API Server  │         │  Claude API      │
│  (Laravel)       │         │  (Anthropic)     │
│                  │         │                  │
│  AiQuotation     │ ──HTTP──→  Messages API   │
│  Service         │ ←─JSON──  (claude-sonnet)  │
│                  │         │                  │
│  ┌────────────┐  │         │  System Prompt:  │
│  │ Prompt     │  │         │  - SAM 모듈 목록 │
│  │ Engine     │  │         │  - 요금 정책     │
│  │            │  │         │  - 견적 구조     │
│  │ - 모듈목록 │  │         │  - 출력 형식     │
│  │ - 요금표   │  │         │                  │
│  │ - 템플릿   │  │         │                  │
│  └────────────┘  │         │                  │
└──────────────────┘         └──────────────────┘

2.3 데이터 흐름

매니저 인터뷰 입력
    │
    ▼
┌──────────────────────────────────────────────────┐
│  Step 1: 인터뷰 전처리                             │
│  - 텍스트 정규화 (불필요한 표현 제거)               │
│  - 핵심 키워드 추출                                │
│  - 업무 도메인 태깅                                │
└──────────────────────┬───────────────────────────┘
                       ▼
┌──────────────────────────────────────────────────┐
│  Step 2: Claude API 1차 호출 — 업무 분석            │
│  - 고객사 업종/규모 파악                            │
│  - 현재 업무 프로세스 분석                          │
│  - 디지털화 필요 영역 식별                          │
│  - Pain Point 도출                                │
│  출력: 구조화된 업무 분석 JSON                      │
└──────────────────────┬───────────────────────────┘
                       ▼
┌──────────────────────────────────────────────────┐
│  Step 3: SAM 모듈 매핑                             │
│  - 업무 분석 결과 ↔ SAM 모듈 카탈로그 대조          │
│  - 필수/선택 모듈 분류                              │
│  - 사용자 수, 데이터량 추정                         │
│  출력: 추천 모듈 목록 + 근거                        │
└──────────────────────┬───────────────────────────┘
                       ▼
┌──────────────────────────────────────────────────┐
│  Step 4: Claude API 2차 호출 — 견적 생성            │
│  - SAM 요금 정책 적용                               │
│  - 모듈별 개발비 + 월 구독료 계산                   │
│  - 추가 옵션 (AI 토큰, 저장공간) 산출              │
│  - 할인 정책 적용 (통합 패키지 등)                  │
│  출력: 견적서 JSON (SAM 표준 형식)                  │
└──────────────────────┬───────────────────────────┘
                       ▼
┌──────────────────────────────────────────────────┐
│  Step 5: 견적서 초안 저장                           │
│  - quotes 테이블에 저장 (status: draft)             │
│  - quote_items에 모듈별 항목 저장                   │
│  - 업무 분석 리포트 첨부                            │
│  - 매니저에게 알림 → 검토/수정 → 확정               │
└──────────────────────────────────────────────────┘

3. SAM 모듈 카탈로그 (AI 프롬프트용)

참조: docs/rules/customer-pricing.md

AI가 인터뷰 내용을 SAM 견적으로 변환하려면, SAM이 제공하는 모듈과 요금을 정확히 알아야 한다. 이 데이터는 DB 테이블로 관리하여 프롬프트에 동적 주입한다.

3.1 모듈 카탈로그 테이블 설계

CREATE TABLE ai_quotation_modules (
    id              BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id       BIGINT UNSIGNED NOT NULL,
    module_code     VARCHAR(50) NOT NULL,          -- 'HR', 'SALES', 'FINANCE' 등
    module_name     VARCHAR(100) NOT NULL,         -- '인사관리', '영업관리', '재무관리'
    category        ENUM('basic', 'individual', 'addon') NOT NULL,
    description     TEXT,                          -- 모듈 기능 설명
    keywords        JSON,                          -- AI 매핑용 키워드 목록
    dev_cost        DECIMAL(12,0) DEFAULT 0,       -- 개발비 (원)
    monthly_fee     DECIMAL(10,0) DEFAULT 0,       -- 월 구독료 (원)
    is_active       BOOLEAN DEFAULT TRUE,
    sort_order      INT DEFAULT 0,
    created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_tenant (tenant_id),
    INDEX idx_category (category),
    UNIQUE KEY uk_tenant_module (tenant_id, module_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.2 초기 데이터 (customer-pricing.md 기준)

module_code module_name category dev_cost monthly_fee
BASIC_PKG 기본 패키지 (인사+근태+급여+게시판) basic 5,000,000 200,000
HR 인사관리 individual 2,000,000 80,000
ATTENDANCE 근태관리 individual 1,500,000 60,000
PAYROLL 급여관리 individual 2,500,000 100,000
BOARD 게시판/공지사항 individual 500,000 20,000
SALES 영업관리 (CRM+견적+수주) individual 5,000,000 150,000
PURCHASE 구매/자재관리 individual 3,000,000 100,000
PRODUCTION 생산관리 (MES) individual 8,000,000 250,000
QUALITY 품질관리 individual 4,000,000 120,000
FINANCE 재무/회계관리 individual 5,000,000 150,000
LOGISTICS 물류/출하관리 individual 3,000,000 100,000
APPROVAL 전자결재 individual 3,000,000 80,000
DOCUMENT 문서관리 (전자서명) individual 2,000,000 60,000
EQUIPMENT 설비관리 individual 3,000,000 100,000
INTEGRATED 통합 패키지 basic 30,000,000 800,000
AI_TOKEN AI 토큰 추가 addon 0 별도
STORAGE 파일 저장공간 추가 addon 0 별도
CUSTOM_DEV 커스텀 개발 addon 별도 협의 0

3.3 keywords 필드 예시

// HR 모듈
{
    "keywords": ["직원", "사원", "인사", "조직도", "부서", "입퇴사", "인력"],
    "pain_points": ["엑셀로 직원 관리", "입퇴사 관리가 번거로움", "조직도 없음"],
    "business_needs": ["직원 정보 통합", "조직 구조 관리", "인력 현황 파악"]
}

// PRODUCTION 모듈
{
    "keywords": ["생산", "제조", "작업지시", "공정", "LOT", "불량", "MES"],
    "pain_points": ["생산 현황을 수기로 기록", "불량 추적 불가", "납기 관리 어려움"],
    "business_needs": ["실시간 생산현황", "불량률 관리", "작업지시 자동화"]
}

4. AI 프롬프트 엔진

4.1 시스템 프롬프트 구조

┌─────────────────────────────────────────────────────┐
│                  System Prompt                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  [역할 정의]                                         │
│  너는 SAM ERP/MES 솔루션의 컨설팅 AI이다.            │
│  고객 인터뷰를 분석하여 맞춤형 견적서를 작성한다.      │
│                                                     │
│  [SAM 모듈 카탈로그] ← DB에서 동적 로드              │
│  각 모듈의 기능, 키워드, 가격 정보                    │
│                                                     │
│  [요금 정책] ← customer-pricing 기반                 │
│  기본패키지, 개별모듈, 추가옵션 요금 체계             │
│  할인 정책 (통합 패키지 할인 등)                      │
│                                                     │
│  [출력 형식]                                         │
│  JSON Schema 명시 (견적서 구조)                      │
│                                                     │
│  [분석 지침]                                         │
│  - 고객 업종/규모별 권장 모듈 기준                    │
│  - 우선순위 결정 기준 (필수 vs 선택)                  │
│  - 비용 최적화 원칙 (패키지 vs 개별)                  │
│                                                     │
└─────────────────────────────────────────────────────┘

4.2 프롬프트 템플릿 (1차: 업무 분석)

당신은 SAM(Smart Automation Management) ERP/MES 솔루션의 전문 컨설턴트입니다.

아래는 고객사 직원과의 인터뷰 내용입니다. 이를 분석하여 구조화된 업무 분석 보고서를 작성하세요.

## 고객 정보
- 회사명: {company_name}
- 업종: {industry}
- 직원 수: {employee_count}
- 인터뷰 대상: {interviewee_role}

## 인터뷰 내용
{interview_content}

## 분석 기준
다음 SAM 모듈 영역에 맞춰 분석하세요:
{module_catalog_json}

## 출력 형식 (JSON)
{
  "company_analysis": {
    "industry": "업종 분류",
    "scale": "소규모/중소/중견",
    "current_systems": ["현재 사용 중인 시스템"],
    "digitalization_level": "상/중/하"
  },
  "business_domains": [
    {
      "domain": "인사/급여",
      "current_process": "현재 처리 방식 설명",
      "pain_points": ["문제점 1", "문제점 2"],
      "improvement_needs": ["개선 필요사항"],
      "priority": "필수/높음/보통/낮음",
      "matched_modules": ["HR", "PAYROLL"]
    }
  ],
  "recommendations": {
    "essential_modules": ["반드시 필요한 모듈 코드"],
    "recommended_modules": ["권장 모듈 코드"],
    "optional_modules": ["선택 모듈 코드"],
    "package_suggestion": "BASIC_PKG 또는 INTEGRATED 또는 individual",
    "reasoning": "패키지 추천 근거"
  }
}

4.3 프롬프트 템플릿 (2차: 견적 생성)

아래 업무 분석 결과를 바탕으로 SAM 견적서를 생성하세요.

## 업무 분석 결과
{analysis_result_json}

## SAM 요금 정책
{pricing_policy_json}

## 견적 생성 규칙
1. 필수 모듈은 반드시 포함
2. 통합 패키지가 개별 합산보다 저렴하면 패키지 추천
3. 직원 수 기반 사용자 라이선스 산출
4. AI 토큰은 월 기본 100만 토큰 포함, 초과분 별도
5. 파일 저장공간은 기본 10GB, 초과분 별도

## 출력 형식 (JSON)
{
  "quotation": {
    "title": "견적서 제목",
    "client_name": "고객사명",
    "valid_until": "견적 유효기간",
    "items": [
      {
        "category": "기본서비스/추가모듈/추가옵션",
        "module_code": "모듈코드",
        "module_name": "모듈명",
        "description": "포함 기능 설명",
        "dev_cost": 0,
        "monthly_fee": 0,
        "quantity": 1,
        "note": "비고"
      }
    ],
    "summary": {
      "total_dev_cost": 0,
      "total_monthly_fee": 0,
      "discount_type": "패키지할인/볼륨할인/없음",
      "discount_rate": 0,
      "final_dev_cost": 0,
      "final_monthly_fee": 0
    },
    "implementation_plan": {
      "estimated_months": 0,
      "phases": [
        {
          "phase": 1,
          "name": "단계명",
          "modules": ["모듈코드"],
          "duration_weeks": 0
        }
      ]
    },
    "analysis_summary": "업무 분석 요약 (고객 설명용)"
  }
}

5. API 설계

5.1 엔드포인트

Method Path 설명
POST /api/v1/ai/quotation/analyze 인터뷰 분석 (1차)
POST /api/v1/ai/quotation/generate 견적서 생성 (2차)
POST /api/v1/ai/quotation/generate-full 분석+생성 통합 (원스텝)
GET /api/v1/ai/quotation/{id} AI 견적 상세 조회
GET /api/v1/ai/quotation AI 견적 목록
PUT /api/v1/ai/quotation/{id} AI 견적 수정 (매니저)
POST /api/v1/ai/quotation/{id}/confirm 정식 견적으로 전환
DELETE /api/v1/ai/quotation/{id} AI 견적 삭제

5.2 요청/응답 예시

POST /api/v1/ai/quotation/analyze

Request:

{
    "client_id": 15,
    "client_name": "(주)대한기계",
    "industry": "기계제조업",
    "employee_count": 45,
    "interviewee_role": "관리부 팀장",
    "interview_content": "현재 직원 관리는 엑셀로 하고 있어요. 출퇴근도 수기로 기록하고... 영업팀에서는 견적서를 한글 프로그램으로 만들어서 이메일로 보내는데, 이력 관리가 안 돼요. 생산 현장에서는 작업일보를 종이에 쓰고 있고, 불량이 나면 어디서 발생했는지 추적이 안 됩니다. 재고도 실사를 해봐야 알 수 있어요...",
    "interview_type": "text"
}

Response:

{
    "success": true,
    "data": {
        "id": 1,
        "analysis": {
            "company_analysis": {
                "industry": "기계제조업",
                "scale": "중소기업 (45명)",
                "current_systems": ["엑셀", "한글 프로그램", "종이 문서"],
                "digitalization_level": "하"
            },
            "business_domains": [
                {
                    "domain": "인사/급여",
                    "current_process": "엑셀로 직원 관리, 수기 출퇴근 기록",
                    "pain_points": ["인사정보 분산", "출퇴근 수기 기록"],
                    "priority": "필수",
                    "matched_modules": ["HR", "ATTENDANCE", "PAYROLL"]
                },
                {
                    "domain": "영업관리",
                    "current_process": "한글 프로그램 견적서, 이메일 발송",
                    "pain_points": ["견적 이력 관리 불가", "영업 현황 파악 어려움"],
                    "priority": "높음",
                    "matched_modules": ["SALES"]
                },
                {
                    "domain": "생산관리",
                    "current_process": "종이 작업일보, 수동 불량 관리",
                    "pain_points": ["불량 추적 불가", "생산현황 실시간 파악 불가"],
                    "priority": "필수",
                    "matched_modules": ["PRODUCTION", "QUALITY"]
                },
                {
                    "domain": "재고/물류",
                    "current_process": "실사로만 재고 파악",
                    "pain_points": ["실시간 재고 파악 불가"],
                    "priority": "높음",
                    "matched_modules": ["PURCHASE", "LOGISTICS"]
                }
            ],
            "recommendations": {
                "essential_modules": ["HR", "ATTENDANCE", "PAYROLL", "PRODUCTION", "QUALITY"],
                "recommended_modules": ["SALES", "PURCHASE", "LOGISTICS"],
                "optional_modules": ["APPROVAL", "DOCUMENT"],
                "package_suggestion": "INTEGRATED",
                "reasoning": "8개 이상 모듈이 필요하므로 통합 패키지(30,000,000원)가 개별 합산(34,500,000원)보다 경제적"
            }
        },
        "token_usage": {
            "prompt_tokens": 1250,
            "completion_tokens": 890,
            "cost_krw": 45
        }
    }
}

5.3 컨트롤러 / 서비스 구조

app/Http/Controllers/Api/V1/
└── AiQuotationController.php
    ├── analyze()          ← 인터뷰 분석
    ├── generate()         ← 견적 생성
    ├── generateFull()     ← 통합 (분석+생성)
    ├── index()            ← 목록
    ├── show()             ← 상세
    ├── update()           ← 수정
    ├── confirm()          ← 정식 견적 전환
    └── destroy()          ← 삭제

app/Services/
└── AiQuotationService.php
    ├── analyzeInterview()         ← 1차: 인터뷰 분석
    ├── generateQuotation()        ← 2차: 견적 생성
    ├── generateFull()             ← 통합 처리
    ├── confirmToQuote()           ← quotes 테이블로 전환
    │
    ├── buildAnalysisPrompt()      ← 분석 프롬프트 조립
    ├── buildQuotationPrompt()     ← 견적 프롬프트 조립
    ├── loadModuleCatalog()        ← DB에서 모듈 카탈로그 로드
    ├── loadPricingPolicy()        ← DB에서 요금 정책 로드
    ├── callClaudeApi()            ← Claude API 호출
    ├── parseResponse()            ← 응답 JSON 파싱
    └── saveTokenUsage()           ← 토큰 사용량 기록

app/Http/Requests/V1/AiQuotation/
├── AiQuotationAnalyzeRequest.php
├── AiQuotationGenerateRequest.php
├── AiQuotationUpdateRequest.php
└── AiQuotationConfirmRequest.php

6. 데이터베이스 설계

6.1 신규 테이블

ai_quotations (AI 견적 마스터)

CREATE TABLE ai_quotations (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id           BIGINT UNSIGNED NOT NULL,

    -- 고객 정보
    client_id           BIGINT UNSIGNED NULL,
    client_name         VARCHAR(200) NOT NULL,
    industry            VARCHAR(100) NULL,
    employee_count      INT NULL,
    interviewee_role    VARCHAR(100) NULL,

    -- 인터뷰 데이터
    interview_content   TEXT NOT NULL,
    interview_type      ENUM('text', 'voice', 'document') DEFAULT 'text',
    voice_recording_id  BIGINT UNSIGNED NULL,       -- ai_voice_recordings 참조

    -- AI 분석 결과
    analysis_result     JSON NULL,                  -- 1차 분석 결과
    quotation_result    JSON NULL,                  -- 2차 견적 결과

    -- 상태 관리
    status              ENUM('analyzing', 'analyzed', 'generating', 'generated',
                             'confirmed', 'failed') DEFAULT 'analyzing',
    error_message       TEXT NULL,

    -- 연결
    quote_id            BIGINT UNSIGNED NULL,        -- 정식 견적 전환 시 quotes.id

    -- 금액 요약
    total_dev_cost      DECIMAL(12,0) DEFAULT 0,
    total_monthly_fee   DECIMAL(10,0) DEFAULT 0,
    discount_rate       DECIMAL(5,2) DEFAULT 0,
    final_dev_cost      DECIMAL(12,0) DEFAULT 0,
    final_monthly_fee   DECIMAL(10,0) DEFAULT 0,

    -- 토큰 사용
    total_tokens        INT DEFAULT 0,
    total_cost_krw      DECIMAL(12,2) DEFAULT 0,

    -- 감사
    created_by          BIGINT UNSIGNED NULL,
    updated_by          BIGINT UNSIGNED NULL,
    created_at          TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at          TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at          TIMESTAMP NULL,

    INDEX idx_tenant_status (tenant_id, status),
    INDEX idx_tenant_client (tenant_id, client_id),
    INDEX idx_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ai_quotation_items (AI 견적 항목)

CREATE TABLE ai_quotation_items (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ai_quotation_id     BIGINT UNSIGNED NOT NULL,

    category            ENUM('basic', 'module', 'addon') NOT NULL,
    module_code         VARCHAR(50) NOT NULL,
    module_name         VARCHAR(100) NOT NULL,
    description         TEXT NULL,

    dev_cost            DECIMAL(12,0) DEFAULT 0,
    monthly_fee         DECIMAL(10,0) DEFAULT 0,
    quantity            INT DEFAULT 1,
    priority            ENUM('essential', 'recommended', 'optional') DEFAULT 'recommended',

    ai_reasoning        TEXT NULL,                  -- AI가 이 모듈을 추천한 근거
    matched_pain_points JSON NULL,                  -- 매칭된 고객 Pain Point

    sort_order          INT DEFAULT 0,
    created_at          TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at          TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    INDEX idx_quotation (ai_quotation_id),
    FOREIGN KEY (ai_quotation_id) REFERENCES ai_quotations(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

6.2 기존 테이블 활용

테이블 용도 연동 방식
ai_configs Claude API 키/모델 설정 provider='claude' 조회
ai_token_usages 토큰 비용 추적 menu_name='AI견적'
ai_pricing_configs Claude 모델 단가 provider='claude'
quotes 정식 견적 전환 대상 confirm 시 생성
clients 고객사 정보 client_id 참조

7. Phase별 개발 계획

Phase 1: 텍스트 인터뷰 → AI 견적 (MVP)

목표: 텍스트 인터뷰 입력 → Claude 분석 → 견적서 자동생성 기간: 2~3주 우선순위: 🔴 필수

단계 작업 프로젝트 상태
1-1 ai_quotation_modules 마이그레이션 + 시더 API
1-2 ai_quotations, ai_quotation_items 마이그레이션 API
1-3 모델 생성 (AiQuotation, AiQuotationItem, AiQuotationModule) API
1-4 AiQuotationService — Claude API 연동 API
1-5 프롬프트 엔진 구현 (분석 + 견적 템플릿) API
1-6 AiQuotationController + FormRequest API
1-7 API 라우트 등록 (routes/api/v1/common.php) API
1-8 정식 견적 전환 로직 (confirmToQuote) API
1-9 MNG AI 견적 관리 화면 (목록/상세/수정) MNG
1-10 테스트 (인터뷰 샘플 3건 이상) API

Phase 2: 음성 인터뷰 연동

목표: 현장에서 녹음한 음성 → STT 변환 → AI 분석 → 견적 생성 기간: 1주 (기존 STT 인프라 재사용으로 단축) 선행 조건: Phase 1 완료

단계 작업 프로젝트 상태 비고
2-1 Google STT 서비스 구현 MNG 완료 GoogleCloudService::speechToText() 재사용
2-2 음성 업로드 API (GCS 저장) MNG 완료 AiVoiceRecordingService, ConsultationController 재사용
2-3 STT → 텍스트 변환 파이프라인 MNG 완료 LongRunningRecognize + 폴링 패턴 구현됨
2-4 음성 인터뷰 → AI 견적 통합 플로우 API 기존 STT 결과를 Claude 분석에 연결
2-5 MNG 음성 녹음 업로드 UI MNG 완료 voice-recorder.blade.php 재사용 가능

핵심: Google Cloud STT, GCS, 브라우저 음성 녹음 UI가 모두 구현 완료 상태. Phase 2에서는 기존 STT 결과를 AI 견적 파이프라인(Claude API)에 연결하는 통합 플로우(2-4)만 신규 개발하면 된다.

Phase 3: 학습 데이터 고도화

목표: 과거 견적 데이터를 활용하여 AI 정확도 향상 기간: 2주 선행 조건: Phase 1 + 실제 사용 데이터 축적

단계 작업 프로젝트 상태
3-1 과거 견적 데이터 → 프롬프트 Few-shot 예시 구성 API
3-2 확정된 AI 견적 → 학습 데이터 피드백 루프 API
3-3 업종별 견적 패턴 분석 → 추천 정확도 향상 API
3-4 프롬프트 A/B 테스트 프레임워크 API

Phase 4: 고객 셀프서비스 (확장)

목표: 고객이 직접 간단한 질문에 답변하면 견적 자동 생성 기간: 3주 선행 조건: Phase 1~3 안정화

단계 작업 프로젝트 상태
4-1 고객용 인터뷰 설문 폼 설계 React
4-2 단계별 질문 → AI 분석 통합 API + React
4-3 견적서 미리보기 + PDF 다운로드 React
4-4 매니저 알림 → 후속 상담 연결 API + MNG

8. Claude API 연동 상세

8.1 SDK 설치

# API 프로젝트에 Anthropic SDK 설치
docker exec sam-api-1 composer require anthropic-ai/laravel

참고: anthropic-ai/laravel 패키지는 Laravel용 공식 래퍼로, HTTP Client 기반으로 Claude API를 호출한다. 미출시/미지원 시 GuzzleHttp로 직접 HTTP 호출한다.

8.2 Claude API 호출 패턴

// app/Services/AiQuotationService.php

class AiQuotationService
{
    private function callClaudeApi(string $systemPrompt, string $userMessage): array
    {
        // 1. ai_configs에서 Claude 설정 로드
        $config = AiConfig::where('provider', 'claude')
            ->where('is_active', true)
            ->first();

        // 2. HTTP 호출
        $response = Http::withHeaders([
            'x-api-key' => $config->api_key,
            'anthropic-version' => '2023-06-01',
            'content-type' => 'application/json',
        ])->post($config->base_url . '/messages', [
            'model' => $config->model,       // claude-sonnet-4-20250514
            'max_tokens' => 4096,
            'temperature' => 0.3,            // 견적은 일관성 중요
            'system' => $systemPrompt,
            'messages' => [
                ['role' => 'user', 'content' => $userMessage]
            ],
        ]);

        // 3. 토큰 사용량 기록
        $usage = $response->json('usage');
        AiTokenHelper::saveClaudeUsage(
            tenantId: auth()->user()->tenant_id,
            menuName: 'AI견적',
            promptTokens: $usage['input_tokens'],
            completionTokens: $usage['output_tokens'],
            model: $config->model,
        );

        // 4. 응답 파싱
        $content = $response->json('content.0.text');
        return json_decode($content, true);
    }
}

8.3 비용 예측

항목 토큰 비용 (USD) 비용 (KRW)
1차 분석 프롬프트 (시스템+사용자) ~2,000 입력 $0.0005 ~1원
1차 분석 응답 ~1,500 출력 $0.0019 ~3원
2차 견적 프롬프트 ~3,000 입력 $0.0008 ~1원
2차 견적 응답 ~2,000 출력 $0.0025 ~4원
견적 1건 합계 ~8,500 ~$0.006 ~9원

Claude Sonnet 기준. 1건당 약 9원으로 매우 경제적이다.


9. MNG 관리 화면

9.1 화면 목록

화면 URL 설명
AI 견적 목록 /ai-quotation 생성된 AI 견적 목록
AI 견적 생성 /ai-quotation/create 인터뷰 입력 폼
AI 견적 상세 /ai-quotation/{id} 분석 결과 + 견적서 조회
AI 견적 수정 /ai-quotation/{id}/edit 매니저가 수정
모듈 카탈로그 관리 /ai-quotation/modules SAM 모듈 목록 관리

9.2 AI 견적 생성 화면 구성

┌─────────────────────────────────────────────────────┐
│  AI 견적서 생성                                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  [고객 정보]                                         │
│  ┌─────────────┐  ┌─────────────┐                  │
│  │ 고객사 선택  ▼│  │ 업종        │                  │
│  └─────────────┘  └─────────────┘                  │
│  ┌─────────────┐  ┌─────────────┐                  │
│  │ 직원 수      │  │ 인터뷰 대상  │                  │
│  └─────────────┘  └─────────────┘                  │
│                                                     │
│  [인터뷰 내용]                                       │
│  ┌─────────────────────────────────────────────┐   │
│  │                                             │   │
│  │  (텍스트 입력 또는 음성 녹음 업로드)          │   │
│  │                                             │   │
│  │                                             │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  [🔄 분석 시작]  [📊 분석+견적 한번에]              │
│                                                     │
├─────────────────────────────────────────────────────┤
│  [분석 결과] (Ajax 응답)                             │
│                                                     │
│  📊 업무 도메인 분석                                 │
│  ┌──────────┬──────────┬──────────┬──────────┐     │
│  │ 도메인    │ 현재상태  │ 문제점    │ 추천모듈  │     │
│  ├──────────┼──────────┼──────────┼──────────┤     │
│  │ 인사/급여 │ 엑셀관리  │ 분산관리  │ HR,PAYROLL│     │
│  │ 생산관리  │ 종이기록  │ 추적불가  │PRODUCTION │     │
│  └──────────┴──────────┴──────────┴──────────┘     │
│                                                     │
│  💰 견적서 초안                                      │
│  ┌──────────┬──────────┬──────────┬──────────┐     │
│  │ 모듈      │ 개발비    │ 월구독료  │ 우선순위  │     │
│  ├──────────┼──────────┼──────────┼──────────┤     │
│  │ 통합패키지 │30,000,000│  800,000 │ 필수     │     │
│  │ AI토큰    │         0│   50,000 │ 선택     │     │
│  └──────────┴──────────┴──────────┴──────────┘     │
│  합계: 개발비 30,000,000원 / 월 850,000원           │
│                                                     │
│  [✅ 정식 견적으로 전환]  [✏️ 수정]  [🗑️ 삭제]     │
│                                                     │
└─────────────────────────────────────────────────────┘

10. 보안 및 운영

10.1 보안 고려사항

항목 대책
API 키 노출 ai_configs 테이블에 암호화 저장, .env 폴백
인터뷰 데이터 보호 tenant_id 격리, 접근 권한 제어
Claude API 비용 제어 일일/월별 토큰 한도 설정 (ai_configs.options)
프롬프트 인젝션 사용자 입력 sanitize, 시스템 프롬프트 분리

10.2 모니터링

항목 방법
API 호출 성공/실패 ai_quotations.status + error_message
토큰 사용량 ai_token_usages 테이블 (기존 인프라)
비용 추적 MNG /system/ai-token-usage (기존 UI)
견적 전환율 ai_quotationsquotes 전환 비율 통계

10.3 에러 처리

try {
    $result = $this->callClaudeApi($systemPrompt, $userMessage);
} catch (ConnectionException $e) {
    // Claude API 연결 실패
    $aiQuotation->update(['status' => 'failed', 'error_message' => 'Claude API 연결 실패']);
} catch (JsonException $e) {
    // 응답 JSON 파싱 실패
    $aiQuotation->update(['status' => 'failed', 'error_message' => 'AI 응답 파싱 실패']);
}

11. 기대 효과

항목 Before (현재) After (AI 엔진)
견적 작성 시간 2~4시간 (수동) 5~10분 (AI 초안 + 검토)
모듈 누락 위험 매니저 경험 의존 AI가 체계적으로 분석
고객 맞춤화 표준 템플릿 복사 인터뷰 기반 맞춤 견적
비용 최적화 수동 비교 AI가 패키지 vs 개별 자동 비교
견적 1건 AI 비용 ~9원 (Claude Sonnet)

변경 이력

날짜 내용
2026-03-02 기획 초안 작성

관련 문서

문서 경로
SAM 프로젝트 개요 docs/SAM_PROJECT_OVERVIEW_FOR_AI.md
견적 기능 상세 docs/features/quotes/README.md
견적 시스템 분석 docs/data/견적/견적시스템_분석문서.md
AI 기능 현황 docs/features/ai/README.md
AI 설정 가이드 docs/guides/ai-config-settings.md
고객 요금 안내 docs/rules/customer-pricing.md
내부 과금 정책 docs/rules/billing-policy.md
단가 정책 docs/rules/pricing-policy.md
Plans 가이드 docs/plans/GUIDE.md

최종 업데이트: 2026-03-02