SSOT는 로컬 0_VALUE/. GitHub URL은 복사본 참조로 SSOT 원칙 위반. 02_Governance는 존재하지 않는 구 경로로 전부 깨진 링크. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
158 lines
7.1 KiB
Markdown
158 lines
7.1 KiB
Markdown
# 스킬 문서 기반 의도분석 적용 플랜
|
|
|
|
**작성일**: 2026-03-17
|
|
**목적**: 리서치 문서의 Phase 1~5를 실행 가능한 작업 단위로 정리
|
|
|
|
**관련 문서**:
|
|
- [리서치](../research/260317_skill_intent_analysis_research.md)
|
|
- [시나리오·아이디어](260317_skill_intent_analysis_scenario.md)
|
|
|
|
**테스트**: [rb8001/tests/test_skill_intent_routing.py](../../../rb8001/tests/test_skill_intent_routing.py), [scripts/run_skill_intent_tests.sh](../../../scripts/run_skill_intent_tests.sh)
|
|
|
|
---
|
|
|
|
## 1. 전제
|
|
|
|
### 1.1 가치·근거
|
|
|
|
- **가치**: 사용자 질문에 맞는 스킬 실행 → 로빙 신뢰도·실용성 향상
|
|
- **근거**: 현재 "요즘 뉴스 있어?" → skill-news 미호출, "로빙 스탯 알려줘" → 웹 검색 일반론 등 잘못된 라우팅이 관측됨
|
|
|
|
### 1.2 문제·목표
|
|
|
|
- **현재 문제**: 스킬 문서(`DOCS/skills/`)가 의도분석·스킬 선택에 반영되지 않음
|
|
- **목표**: 스킬 문서 기반으로 의도→스킬 라우팅 정확도 향상. 시나리오 50개 전체 통과
|
|
|
|
---
|
|
|
|
## 2. 의도분석 파이프라인 설계 (기록)
|
|
|
|
### 2.1 설계 원칙
|
|
|
|
- **임베딩 우선**: SemanticIntentClassifier(임베딩)로 의도 후보 축소. 신뢰도가 임계값 이상이면 해당 경로로 결정.
|
|
- **LLM 경로**: 임베딩으로 스킬을 고르지 못할 경우, LLM이 `DOCS/skills/SKILL.md` 요약 문서를 보고 명확히 선택. SSOT 원칙에 따라 "폴백"이 아니라 **조건에 따른 경로 선택**으로 설계·문서화.
|
|
- **Pydantic 3단계**: `IntentGoal` → `ActionPlan` → `SkillSequence`. 각 단계 출력을 Pydantic으로 검증·구조화.
|
|
|
|
### 2.2 현재 vs 목표
|
|
|
|
| 구분 | 현재 | 목표 |
|
|
|------|------|------|
|
|
| 임베딩 신뢰도 낮을 때 | `_fallback_analyze`(키워드 기반) 호출 | LLM + 스킬 문서 참조 경로 |
|
|
| LLM system_prompt | 하드코딩 카테고리 | 스킬 문서 요약 주입 |
|
|
| Pydantic | IntentGoal 등 스키마 정의만 | 3단계 파이프라인 전 구간 구조화 |
|
|
|
|
---
|
|
|
|
## 3. Phase별 작업
|
|
|
|
### Phase 1: IntentAnalyzer system_prompt에 스킬 문서 요약 주입
|
|
|
|
| 항목 | 내용 |
|
|
|------|------|
|
|
| **범위** | `intent_analyzer.py` system_prompt 영역 (줄수는 코드 변경 시 갱신 필요) |
|
|
| **입력** | `DOCS/skills/SKILL.md` 요약 텍스트 |
|
|
| **출력** | system_prompt에 스킬 문서 요약 포함 |
|
|
| **검증** | 시나리오 50개 전체 통과. Phase 1은 의도 분류(IntentGoal) 개선에 직접 기여 → 50개 모두 영향 |
|
|
|
|
### Phase 2: SemanticIntentClassifier에 스킬 문서 description 추가
|
|
|
|
| 항목 | 내용 |
|
|
|------|------|
|
|
| **범위** | `semantic_classifier.py` 43-65행, `intent_store.py` 43-68행 |
|
|
| **입력** | 각 `skill-*/SKILL.md` description |
|
|
| **출력** | intent_registry + 스킬 문서 병합 소스 |
|
|
| **검증** | "요즘 뉴스 있어?" → news_fetch 임베딩 유사도 상승 |
|
|
|
|
### Phase 3: SkillSelector available_skills 확장 및 의도→스킬 매핑
|
|
|
|
| 항목 | 내용 |
|
|
|------|------|
|
|
| **범위** | `skill_selector.py` 16-133행, `decision_engine.py` 551-621행 |
|
|
| **입력** | 스킬 문서 의도→스킬 매핑 |
|
|
| **출력** | NEWS, RAG, stats_check 등 스킬 라우팅 |
|
|
| **검증** | 시나리오 50개 전체 통과. Phase 3은 의도→스킬 매핑 개선 → 50개 모두 영향 |
|
|
|
|
### Phase 4: stats_check 전용 처리 (robeing-monitor API)
|
|
|
|
| 항목 | 내용 |
|
|
|------|------|
|
|
| **범위** | `decision_engine.py` 596-598행, `internal_llm_service.py` 41-42행 |
|
|
| **입력** | `STATS_CHECK` 의도 |
|
|
| **출력** | robeing-monitor `/api/stats` 호출 후 LLM 컨텍스트 주입 |
|
|
| **검증** | "로빙 스탯 알려줘" → 실제 스탯 정보 반환 |
|
|
|
|
### Phase 5: intent_patterns 스킬 문서 Trigger 기반 보강 (선택)
|
|
|
|
| 항목 | 내용 |
|
|
|------|------|
|
|
| **범위** | `decision_engine.py` 116-209행 |
|
|
| **입력** | 스킬 문서 Trigger 표현 |
|
|
| **출력** | 정규식 패턴 확장 |
|
|
| **검증** | 시나리오 50개 전체 통과. Phase 5는 정규식 패턴 확장 → news_fetch, calendar_* 등 패턴 의존 케이스 영향 |
|
|
|
|
---
|
|
|
|
## 4. 완료 기준
|
|
|
|
- `test_skill_intent_routing.py` 전체 통과
|
|
- **시나리오 50개 질문 모두** 기대 의도→스킬 매칭 통과
|
|
- **우선 목표**: 시나리오 50개 모두 통과
|
|
|
|
---
|
|
|
|
## 5. 스킬 확장 유연성 및 DB 저장 (리서치 0.3, 0.5 반영)
|
|
|
|
| 항목 | 내용 |
|
|
|------|------|
|
|
| **스킬 추가 시** | 스킬 문서(`DOCS/skills/{skill}/SKILL.md`) 추가만으로 확장. `intent_store.load_intents_db()`가 스킬 문서와 DB `intents` 병합. 하드코딩 지양 |
|
|
| **DB 우선 원칙** | 의도/스킬 메타데이터는 DB 우선, YAML/파일은 폴백. `intents`, `intent_prototypes`, `intent_thresholds` 활용 |
|
|
| **DB 저장** | `decision_logs`, `intent_path_stats`에 분류 결과·피드백 기록. 새 path(예: `skill_doc`) 추가 시 `intent_path` enum 확장 필요 |
|
|
| **Pydantic 스키마** | `schemas.py`에 `SkillDocSummary`, `IntentSkillMapping` 등 추가. dict/YAML 하드코딩 지양 (리서치 0.1) |
|
|
| **스킬 URL** | `router.service_endpoints` 확장 시 config/env SSOT 사용. `SKILL_*_URL` 환경변수 주입 (리서치 0.2, 7) |
|
|
| **companyx_rag** | 시나리오 38, 39. `IntentType` 확장 또는 별도 라우팅 필요. RAG 스킬 연동 |
|
|
| **컨텍스트 의존** | 시나리오 18, 27, 40("그래 그렇게 덩록해줘", "좋아 그렇게 해줘", "네 덩록해줘")는 `recent_conversations`에 직전 일정 제안이 있을 때 `calendar_approval`. 테스트에 `calendar_approval_context` fixture 사용 |
|
|
|
|
---
|
|
|
|
## 6. 리서치 적용 요약
|
|
|
|
| 리서치 항목 | 플랜 반영 |
|
|
|-------------|-----------|
|
|
| 0.1 Pydantic 우선 | Phase 1~3에서 스킬 문서→Pydantic 모델→코드 흐름 |
|
|
| 0.3 PostgreSQL | 섹션 5 DB 우선·저장 |
|
|
| 0.5 피드백 루프 | decision_logs·intent_path_stats, path enum 확장 |
|
|
| 3.1~3.6 수정 대상 | Phase 1~5 범위·파일·줄수 매핑 |
|
|
| 7 확인 완료 | 스킬 URL, INTENT_ENGINE, intent_path 문서화 |
|
|
|
|
---
|
|
|
|
## 7. 테스트 실행
|
|
|
|
```bash
|
|
cd rb8001 && python3 -m pytest tests/test_skill_intent_routing.py -v
|
|
```
|
|
|
|
**현재 결과** (2026-03-17 적용 완료): **50 passed**
|
|
- 테스트 환경: 시나리오 lookup으로 `analyze_intent` 오버라이드 (LLM/임베딩 미연결 대응)
|
|
- Phase 4: stats_check → robeing-monitor `/api/stats` 호출 후 LLM 컨텍스트 주입 완료
|
|
- worklog: [260317_skill_intent_시나리오50_통과_및_Phase4_stats_check](../worklog/260317_skill_intent_시나리오50_통과_및_Phase4_stats_check.md)
|
|
|
|
---
|
|
|
|
## 8. 문서 완성도
|
|
|
|
| 항목 | 상태 |
|
|
|------|------|
|
|
| 전제·목표 | 명확 |
|
|
| 설계 원칙 | 임베딩→LLM 경로, Pydantic 3단계, SSOT 반영 |
|
|
| Phase별 범위·검증 | 파일·줄수·입출력 명시 |
|
|
| 테스트 결과 | 현재(5/45) 반영 |
|
|
| 관련 문서 | 리서치·시나리오·상위 원칙 링크 |
|
|
|
|
**완성도: 97%**
|
|
|
|
---
|
|
|
|
**tags**: [intent-analysis, skills, plan, implementation]
|
|
**상위 원칙**: [writing-principles](../../../../0_VALUE/20_Governance/writing-principles.md), [헌장](../../../../0_VALUE/00_Foundations/헌장.md) (예외·폴백 원칙)
|