테마
Story: LLM 연동 & 프롬프트 엔진
메타
| 항목 | 값 |
|---|---|
| Story ID | E-04-S-01 |
| Epic | E-04 AI 진단 엔진 |
| 상태 | draft |
| 우선순위 | P0 |
| 규모 | M |
| 담당 개발자 | BE (하록님) |
사용자 스토리
As a 장사왕 시스템, I want LLM API 연동 및 프롬프트 관리 엔진, So that 광고 데이터를 기반으로 AI 진단을 생성할 수 있다.
수락 기준 (Acceptance Criteria)
AC-01: LLM 클라이언트 설정
| 항목 | 내용 |
|---|---|
| Given | LLM API 키 설정 완료 |
| When | 진단 요청 |
| Then | LLM API 호출 및 응답 수신 |
상세 스펙:
- API 선택: Claude API 또는 OpenAI (환경변수로 전환 가능)
- 타임아웃: 5초
- 재시도: 1회 (실패 시 폴백)
- 온도: 0.3 (일관성 확보)
AC-02: 프롬프트 템플릿 관리
| 항목 | 내용 |
|---|---|
| Given | 캠페인 데이터 + 셀러 컨텍스트 |
| When | 프롬프트 생성 요청 |
| Then | 완성된 프롬프트 문자열 반환 |
프롬프트 구조:
[시스템 프롬프트] - 고정
[셀러 컨텍스트] - 동적 (적용 이력, 성과 패턴)
[광고 데이터] - 동적 (캠페인 정보, 지표)
[출력 형식] - 고정 (JSON 스키마)AC-03: 응답 파싱 및 검증
| 항목 | 내용 |
|---|---|
| Given | LLM 응답 수신 |
| When | 파싱 시도 |
| Then | 유효한 DiagnosisResult 객체 반환 |
응답 스키마:
typescript
interface DiagnosisResult {
badge: "🟢" | "🟡" | "🔴";
diagnosis: string; // 2-3문장
suggestion: {
type: string; // bid_reduction, budget_realloc 등
action: string; // 구체적 행동
expectedEffect: string; // 예상 효과
} | null;
}검증 항목:
- badge: 유효한 이모지 3종 중 하나
- diagnosis: 빈 문자열 아님, 최대 200자
- suggestion.type: 허용된 타입 목록 내
AC-04: 할루시네이션 가드레일
| 항목 | 내용 |
|---|---|
| Given | LLM 응답에 비정상 내용 포함 |
| When | 검증 실패 |
| Then | 폴백 결과 반환 + 로깅 |
가드레일:
- 숫자 검증: 입력 데이터에 없는 구체적 수치 언급 시 경고
- 길이 제한: diagnosis 200자 초과 시 truncate
- 금지어: "확실히", "반드시", "100%" 등 과장 표현 필터링
태스크 분해
Task 1: LLM 클라이언트 설정 AC-01
- [ ] 1.1: LLM SDK 설치 (Anthropic/OpenAI)
- [ ] 1.2: 환경변수 설정 (API 키, 모델명, 타임아웃)
- [ ] 1.3: 기본 호출 함수 생성
- [ ] 1.4: 재시도 로직 구현
Task 2: 프롬프트 엔진 AC-02
- [ ] 2.1: 시스템 프롬프트 템플릿 작성
- [ ] 2.2: 셀러 컨텍스트 주입 함수
- [ ] 2.3: 광고 데이터 포맷팅 함수
- [ ] 2.4: 프롬프트 조합 함수
Task 3: 응답 파싱 AC-03
- [ ] 3.1: JSON 파싱 로직
- [ ] 3.2: DiagnosisResult 타입 정의
- [ ] 3.3: 스키마 검증 (Zod)
Task 4: 가드레일 AC-04
- [ ] 4.1: 응답 검증 함수
- [ ] 4.2: 필터링/정제 로직
- [ ] 4.3: 폴백 결과 생성
Task 5: 테스트
- [ ] 5.1: 단위 테스트 (프롬프트 생성, 파싱)
- [ ] 5.2: 통합 테스트 (실제 API 호출 - 샌드박스)
Dev Notes (AI Agent 최적화)
영향 받는 소스 트리
src/
├── ai/
│ ├── llm-client.ts # 🆕 LLM API 클라이언트
│ ├── prompt-engine.ts # 🆕 프롬프트 생성 엔진
│ ├── response-parser.ts # 🆕 응답 파싱 + 검증
│ ├── templates/
│ │ └── diagnosis.prompt.ts # 🆕 진단 프롬프트 템플릿
│ └── types/
│ └── diagnosis.ts # 🆕 타입 정의
└── tests/
└── ai/
└── llm-client.spec.ts # 🆕 테스트프롬프트 템플릿 (초안)
typescript
const SYSTEM_PROMPT = `
당신은 쿠팡 광고 분석 전문가입니다.
셀러의 광고 데이터를 분석하여 Status Badge와 진단 메시지를 생성합니다.
규칙:
1. Badge는 🟢(양호), 🟡(주의), 🔴(위험) 중 하나만 사용
2. 진단은 2-3문장으로 간결하게, 한국어로 작성
3. 가능하면 구체적인 행동 제안 포함
4. 순이익 관점에서 판단
5. 입력 데이터에 없는 수치를 만들어내지 마세요
출력 형식 (JSON):
{
"badge": "🟢" | "🟡" | "🔴",
"diagnosis": "진단 메시지",
"suggestion": {
"type": "bid_reduction" | "budget_realloc" | "campaign_pause" | null,
"action": "구체적 행동",
"expectedEffect": "예상 효과"
}
}
`;충돌 감지
| 항목 | 상태 | 설명 |
|---|---|---|
| 기존 코드 충돌 | ✅ 없음 | 신규 모듈 |
| 패키지 의존성 | 🟡 추가 | @anthropic-ai/sdk 또는 openai |
의존성
| 의존 | 설명 | 상태 |
|---|---|---|
| LLM API 선정 | Claude / GPT 결정 필요 | 미정 |
| API 키 발급 | 환경변수 설정 | 미완 |
Dev Agent Record
| 항목 | 값 |
|---|---|
| 생성 Agent | Claude Opus 4.5 |
| 생성일 | 2026-01-27 |
| 마지막 수정 | 2026-01-27 |
| 검증자 | - |
검증 결과: 🔄 PENDING (PO 승인 대기) 검증일: -
생성일: 2026-01-27마지막 수정: 2026-01-27
