---
type: worklog
tags: [worklog, rb8001, intent, llm, pydantic, intent-classifier]
work_date: 2026-03-23
---

# 260323 의도 분류 LLM-first(v2) 전환

## 배경

- 기존 의도 분류(v1): 키워드 정규식 FastPath → Naive Bayes → LLM 순차
- 202개 질문 테스트 결과: 키워드 **27%** 정확도
- 사용자 질문이 키워드에 안 걸리면 UNKNOWN → 일반 LLM 경로로 빠짐

## 변경

### 새 의도 분류기: `intent_classifier.py`

- **LLM-first**: 키워드 없이 LLM이 바로 의도 판단
- **Pydantic 검증**: `IntentResult(intent, confidence, slots, reasoning, needs_clarify)`
- **JSON 강제**: `response_format={"type": "json_object"}`
- **SKILL_REGISTRY**: OpenClaw 스타일 스킬 목록 (트리거 + 예시)
- **키워드 폴백**: LLM 실패 시에만 기존 DecisionEngine 사용

### 스킬 레지스트리 (10개 의도)

| intent | 설명 |
|--------|------|
| self_inspect | 시간, 코드 탐색, 드래프트, 대화 이력 |
| companyx_rag | Company X 내부 문서 |
| web_search | 날씨, 주가, 환율, 실시간 정보 |
| calendar_event | 일정 등록 |
| calendar_query | 일정 조회 |
| email_read | 이메일 읽기 |
| email_send | 이메일 발송 |
| news_fetch | 뉴스 |
| greeting | 인사 |
| general_chat | 일반 대화 |

### 환경변수

- `INTENT_ENGINE=v2` → LLM-first (현재 활성)
- `INTENT_ENGINE=graph` → 기존 IntentGraph (폴백/롤백)

## 테스트 결과 (202개 질문)

| 방식 | 정확도 |
|------|--------|
| OLD (키워드) | 27% (56/202) |
| **NEW (LLM)** | **94% (191/202)** |

## 커밋

- `5f18a9a`: intent_classifier.py 신규
- `ac3e617`: message_service v2 전환 + INTENT_ENGINE=v2

## 관련 파일

- `rb8001/app/services/brain/intent_classifier.py`
- `rb8001/app/services/message_service.py`
- `rb8001/docker-compose.yml`
