- 음성 녹음 섹션: 기초만→구축 완료로 변경 (GoogleCloudService, AiVoiceRecordingService 등) - Phase 2: 기존 STT 인프라 재사용 반영, 기간 2주→1주 단축 - 참조 구현 파일 목록 추가
929 lines
43 KiB
Markdown
929 lines
43 KiB
Markdown
# 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 모듈 카탈로그 테이블 설계
|
|
|
|
```sql
|
|
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 필드 예시
|
|
|
|
```json
|
|
// 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:**
|
|
```json
|
|
{
|
|
"client_id": 15,
|
|
"client_name": "(주)대한기계",
|
|
"industry": "기계제조업",
|
|
"employee_count": 45,
|
|
"interviewee_role": "관리부 팀장",
|
|
"interview_content": "현재 직원 관리는 엑셀로 하고 있어요. 출퇴근도 수기로 기록하고... 영업팀에서는 견적서를 한글 프로그램으로 만들어서 이메일로 보내는데, 이력 관리가 안 돼요. 생산 현장에서는 작업일보를 종이에 쓰고 있고, 불량이 나면 어디서 발생했는지 추적이 안 됩니다. 재고도 실사를 해봐야 알 수 있어요...",
|
|
"interview_type": "text"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"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 견적 마스터)
|
|
|
|
```sql
|
|
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 견적 항목)
|
|
|
|
```sql
|
|
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 설치
|
|
|
|
```bash
|
|
# 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 호출 패턴
|
|
|
|
```php
|
|
// 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 에러 처리
|
|
|
|
```php
|
|
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
|