- 음성 녹음 섹션: 기초만→구축 완료로 변경 (GoogleCloudService, AiVoiceRecordingService 등) - Phase 2: 기존 STT 인프라 재사용 반영, 기간 2주→1주 단축 - 참조 구현 파일 목록 추가
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— 브라우저 음성 녹음 UIdocs/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_quotations → quotes 전환 비율 통계 |
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