-
Notifications
You must be signed in to change notification settings - Fork 0
04 AI Adapter
hywznn edited this page Jul 21, 2026
·
6 revisions
AI Adapter는 모델 자체가 아니라 Spring Boot와 모델 Provider 사이의 안전한 연결 계층입니다.
TaskService
→ AiTaskAnalyzer 인터페이스
→ 개인정보 제거
→ Context와 버전 주입
→ 모델 호출
→ JSON Schema 검증
→ 핵심값 보존 검증
→ 안전한 결과 또는 검토 필요 반환
TaskService는 OpenAI, Gemini, HyperCLOVA 같은 특정 업체의 Request/Response를 알지 않습니다.
| 환경 | 구현 | 목적 |
|---|---|---|
| 자동 테스트 | FakeTaskAnalyzer | 성공·오류를 결정적으로 재현 |
| 개발·실험 | LmStudioTaskAnalyzer | 로컬 모델과 Prompt 후보 비교 |
| 데모 배포 | ExternalLlmTaskAnalyzer | 외부 LLM API 또는 Cloud Endpoint |
| 운영 고도화 | Agent Router | Blue/Green과 자체 Inference Server |
LM Studio는 최종 데모 의존성이 아닙니다.
public interface AiTaskAnalyzer {
TaskAnalysisResult analyze(TaskAnalysisCommand command);
}Command에는 업무에 필요한 최소 정보만 포함합니다.
{
"requestId": "uuid",
"companyId": "uuid",
"inputText": "응웬반A 체류연장 준비하고 여권 사본도 요청해줘",
"workers": [
{
"workerId": "uuid",
"displayName": "응웬반A",
"language": "vi",
"expiryDate": "2026-09-30"
}
],
"versions": {
"agent": "task-agent-v1",
"prompt": "task-analysis-v1",
"contextPack": "context-v0.2",
"workflowCatalog": "workflow-v1"
}
}여권번호, 외국인등록번호, 전화번호, 계좌번호는 DTO에 넣지 않습니다.
{
"tasks": [
{
"taskType": "EXPIRY_RENEWAL",
"workerId": "uuid",
"title": "체류기간 연장 준비",
"requiredInformation": [],
"missingFields": [],
"confidence": 0.94
},
{
"taskType": "DOCUMENT_REQUEST",
"workerId": "uuid",
"title": "여권 사본 요청",
"documentType": "PASSPORT_COPY",
"missingFields": [],
"confidence": 0.97
}
]
}모델이 상태를 반환해도 서버가 최종 상태를 결정합니다. AI 후보는 HR 승인 이전 상태만 가질 수 있습니다.
- 인증 사용자와 사업장 Context 확인
- 민감정보 패턴 제거·거부
- Prompt·Context Pack·Workflow 버전 주입
- Timeout이 있는 Provider 호출
- JSON 파싱
- JSON Schema 자료형·필수 필드 검사
- 허용 TaskType과 worker_id 검사
- 날짜·금액·서류명·대상자 보존 검사
- 누락정보와 신뢰도 정책 적용
- Task 후보와 AiInvocation 기록을 같은 요청 ID로 저장
| 상황 | 서버 처리 | 자동 발송 |
|---|---|---|
| JSON 파싱 실패 | 오류 저장, REVIEW_REQUIRED 성격의 안전 결과 | 금지 |
| Schema 위반 | validation_errors 저장 | 금지 |
| 필수정보 누락 | Task를 NEEDS_INFO로 저장 | 금지 |
| 낮은 신뢰도 | HR 재확인 요청 | 금지 |
| Provider Timeout | 제한적 Retry 후 안전한 오류 | 금지 |
| worker_id 불일치 | 후보 생성 거부 | 금지 |
| 날짜·금액 손실 | 후보 생성 거부 또는 NEEDS_INFO | 금지 |
| 민감정보 탐지 | 모델 호출 전 제거·차단 기록 | 금지 |
Provider 오류를 일반 서버 장애로 숨기지 않되, 외부 응답 전문이나 Secret을 사용자에게 노출하지 않습니다.
| 필드 | 이유 |
|---|---|
| request_id | API·Task·AI 로그를 함께 추적 |
| agent_version | Agent 동작 버전 재현 |
| model_provider/name/version | 모델 변경 영향 확인 |
| prompt_version | Prompt 회귀 확인 |
| context_pack_version | 업무 지식 버전 확인 |
| workflow_catalog_version | 상태·필수정보 기준 확인 |
| latency_ms | 지연과 Timeout 분석 |
| parsing_error | JSON 안정성 분석 |
| validation_errors | 핵심값·Schema 실패 분석 |
| created_at | 배포·장애 시점 비교 |
품질개선 로그에는 비식별 입력 요약과 검증 결과만 저장합니다. 원본 민감정보, 전체 Authorization 헤더, API Key는 저장하지 않습니다.
MVP에서도 버전 필드를 저장하면 나중에 다음 흐름으로 확장할 수 있습니다.
Spring Boot → Agent Router → Blue Agent
→ Green Agent
Green은 staging Smoke Evaluation 후 0% → 10% → 50% → 100%로 이동하고, 문제 시 Blue로 되돌립니다. 실제 Router와 트래픽 분할은 MVP 범위 밖입니다.