feat(docs): 스킬 문서 및 의도분석 플랜/시나리오/리서치 추가

- skills/: SKILL.md, skill-calendar, skill-email, skill-embedding, skill-llm, skill-news, skill-rag-file, skill-slack
- journey/plans: 260317_skill_intent_analysis_plan.md, scenario.md
- journey/research: 260317_skill_intent_analysis_research.md

Made-with: Cursor
This commit is contained in:
happybell80 2026-03-17 02:28:46 +09:00
parent aa8ef8e1d4
commit e284bcedb4
11 changed files with 766 additions and 0 deletions

View File

@ -0,0 +1,157 @@
# 스킬 문서 기반 의도분석 적용 플랜
**작성일**: 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): 5 passed, 45 failed (시나리오 50개)
- 의도적 오타·복합 시나리오 적용. 3, 8, 19, 23, 28, 32, 34, 48 등 복합 질문 포함
- 컨텍스트 의존(18, 27, 40): `calendar_approval_context` fixture 필요
- 키워드 매칭만으로는 대부분 실패. 시맨틱·스킬 문서·LLM 경로 개선 필요
---
## 8. 문서 완성도
| 항목 | 상태 |
|------|------|
| 전제·목표 | 명확 |
| 설계 원칙 | 임베딩→LLM 경로, Pydantic 3단계, SSOT 반영 |
| Phase별 범위·검증 | 파일·줄수·입출력 명시 |
| 테스트 결과 | 현재(5/45) 반영 |
| 관련 문서 | 리서치·시나리오·상위 원칙 링크 |
**완성도: 97%**
---
**tags**: [intent-analysis, skills, plan, implementation]
**상위 원칙**: [writing-principles](../../../../0_VALUE/02_Governance/writing-principles.md), [global-principles](../../../../0_VALUE/00_Principles/global-principles.md) (예외·폴백 원칙)

View File

@ -0,0 +1,120 @@
# 스킬 기반 의도분석 시나리오·아이디어
**작성일**: 2026-03-17
**목표**: 스킬 문서를 바탕으로 로빙 질문에 적절한 의도분석을 통해 올바른 스킬을 실행하게 한다.
---
## 1. 아이디어
### 목표
스킬 문서(`DOCS/skills/`)를 의도분석 컨텍스트로 활용하여, 사용자 질문 → 의도 파악 → 적절한 스킬 호출 흐름을 구축한다.
### 핵심 방향
1. **의도분석 스킬 버전**: `intent_registry.yaml` / DB `intents`와 병행하여, 스킬 문서(Trigger, description)를 의도분석 시 system prompt 또는 임베딩 소스로 주입
2. **스킬 문서 기반 라우팅**: `DOCS/skills/SKILL.md` 요약 + 각 `{skill}/SKILL.md` 상세를 읽어, "이 질문은 어떤 스킬에 해당하는가?"를 판단
3. **검증 시나리오**: 아래 50개 질문으로 의도분석 정확도 측정. **모두 통과** 목표.
### 적용 경로 (아이디어)
| 단계 | 현재 | 개선 아이디어 |
|------|------|---------------|
| IntentAnalyzer system_prompt | 하드코딩 카테고리 | 스킬 문서 요약 텍스트 주입 |
| SemanticIntentClassifier | intent_registry.yaml / DB | 스킬 문서 description 추가 임베딩 |
| SkillSelector | CALENDAR/EMAIL/TOOL/LLM 하드코딩 | 스킬 문서 기반 동적 매핑 |
---
## 2. 시나리오: 의도분석 검증 질문 50개
실제 사용자 발화를 반영한 질문. **의도적으로 오타**를 넣어 키워드 매칭만으로는 통과하지 못하도록 함. 각 질문에 **기대 의도**, **기대 스킬**, **기대 답변 핵심**을 달았다. 38, 39: `companyx_rag``IntentType`이 아닌 별도 의도(내부 RAG 검색).
| # | 질문 | 기대 의도 | 기대 스킬 | 기대 답변 핵심 |
|---|------|-----------|-----------|----------------|
| 1 | 안뇨, 오늘 뭐부터 할까 | greeting | llm | 인사·시작점 제안 |
| 2 | 로빙애, 잘 지내? | greeting | llm | 인사 응답 |
| 3 | 퇴근 후 도착한 메일 중 마감 급한 것만 우선순위 매겨서 알려줘 | email_read | email | 수신함 조회·필터 |
| 4 | 김대리한테 보낸 베일 답장 왔어? 곽인해줘 | email_read | email | 수신함 조회 |
| 5 | 영업팀 이베일로 분기 씰적 공유 베일 써줘 | email_send | email | 메일 초안 작성 |
| 6 | 방금 밭은 RFP 베일 핵심만 3줄로 정리해줘 | email_summary | email, llm | 메일 요약 |
| 7 | 며칠째 베일함 안 봤는데, 중요핸 것만 골라줘 | email_summary | email, llm | 메일 요약·우선순위 |
| 8 | 유럽 AI법 시행 영향이랑 국내 대응 뉴스 같이 비교해서 가져와 | news_fetch | news | 뉴스 검색 결과 |
| 9 | 반도채 업게 M&A 쏘식 있어? | news_fetch | news | 뉴스 검색 |
| 10 | 아까 공유한 기싸, 요확해서 슬랙에 올려줘 | news_summary | news, llm | 뉴스 요약 |
| 11 | #프로젝트-a 채널 데화 흐름 요확해줘 | slack_thread | slack, llm | Slack 스레드 요약 |
| 12 | 지난 회이록에서 엑션 아이템만 쭈출해줘 | action_extractor | slack, llm | 할 일 목록 |
| 13 | 12월 15일 오후 2시 인수검토 회이 일젱 너어줘 | calendar_event | CALENDAR, llm | 일정 등록 |
| 14 | 이번 주 금요일 일젱 뭐 있어? | calendar_query | CALENDAR | 일정 조회 |
| 15 | 다음 주 월요일 오전 미딩들 곽인해줘 | calendar_query | CALENDAR | 일정 조회 |
| 16 | 방금 추가한 3시 미딩 츄소해줘 | calendar_delete | CALENDAR | 일정 삭제 |
| 17 | 그 일젱 없애줘 | calendar_delete | CALENDAR | 일정 삭제 |
| 18 | 그래, 그렇게 덩록해줘 (직전 일정 제안됨) | calendar_approval | CALENDAR | 일정 등록 승인 |
| 19 | 이 M&A 계약서에서 상환 조항이랑 지배구조 변경 조건 같이 정리해줘 | document_analysis | llm | 문서 분석 |
| 20 | IR 자료 10페이지 요확해서 핵심만 알려줘 | document_analysis | llm | 문서 요약 |
| 21 | 이 PDG 3쟝부터 5쟝까지 요확해줘 | document_analysis | llm | PDF 요약 |
| 22 | 삼성전자 최근 씰적 발표 뉴스 자아줘 | web_search | TOOL | 웹 검색 |
| 23 | B Corp 인증이랑 ESG 평가 차이점 검색해서 요약해줘 | web_search | TOOL | 정보 검색 |
| 24 | 로빙 너 지금 레배이랑 스쌯 얼마야? | stats_check | llm | 스탯/레벨 표시 |
| 25 | 내 능력지 셍태 곽인해줘 | stats_check | llm | 스탯 정보 |
| 26 | 알겠어, 그렇게 할게 | general_chat | llm | 수락 응답 |
| 27 | 좋아 그렇게 해줘 (직전 일정 제안됨) | calendar_approval | CALENDAR | 일정 등록 승인 |
| 28 | 지난 분기 대비 이번 분기 KPI 달성률 추이랑 팀별 기여도 분석해서 회고 초안 만들어줘 | complex_query | llm | 복합 분석·생성 |
| 29 | 신규 프로젝트 킥오프 준비 체크리스트 만들어줘 | complex_query | llm | 계획·체크리스트 |
| 30 | 박부장에게 계약 조건 협의 베일 보내줘 | email_send | email | 메일 작성 |
| 31 | 어제 밭은 견적써 베일 내용만 일거줘 | email_read | email | 메일 조회 |
| 32 | 크립토 규제 관련해서 미국 유럽 한국 3개국 뉴스 각 2건씩 가져와 | news_fetch | news | 뉴스 검색 |
| 33 | #일일스탠드업 채널 오늘 데화 요확해줘 | slack_thread | slack, llm | Slack 요약 |
| 34 | 다음 주 화요일 오전 9시 반에 본사 회의실 A에서 분기 실적 검토회의 잡아줘, 2시간으로 | calendar_event | CALENDAR, llm | 일정 등록 |
| 35 | 2시 반 미딩 빼줘 | calendar_delete | CALENDAR | 일정 삭제 |
| 36 | 이 제안써 2쟝 요확해줘 | document_analysis | llm | 문서 요약 |
| 37 | 회이록에서 다음 엑션만 뽑아줘 | action_extractor | slack, llm | 액션 아이템 |
| 38 | 이 주장에 대한 내부 가이드 근거 있어? 자아줘 | companyx_rag | RAG | 내부 문서 근거 검색 |
| 39 | 정책 문서 기준으로 이게 맞는지 곽인해줘 | companyx_rag | RAG | 내부 문서 기반 검증 |
| 40 | 네, 덩록해줘 (직전 일정 제안됨) | calendar_approval | CALENDAR | 일정 등록 승인 |
| 41 | 오늘 점심 뭐 먹을지 고민인데 추천해줘 | general_chat | llm | 메뉴 추천 |
| 42 | VSCode 파이썬 디버깅 단축키 알려줘 | general_chat | llm | 단축키 안내 |
| 43 | 감자탕 끓이는 법 간단히 알려줘 | general_chat | llm | 레시피 안내 |
| 44 | 오늘 서울 날씨 어때? | general_chat | llm | 날씨 답변 |
| 45 | 이 베일 네용으로 답쟝 초안 써줘 | email_send | email | 답장 작성 |
| 46 | 방금 겸색한 뉴스 두 줄로 요확해줘 | news_summary | news, llm | 뉴스 요약 |
| 47 | 3월 첫째 주 일젱 전채 뵈어줘 | calendar_query | CALENDAR | 일정 조회 |
| 48 | 부록 B의 면책 조항이 본문 3조랑 충돌하는지 검토해줘 | document_analysis | llm | 문서 분석 |
| 49 | OO사 최근 인수합병 뉴스 겸색해줘 | web_search | TOOL | 웹 검색 |
| 50 | 로빙 스쌯 화먼 뵈어줘 | stats_check | llm | 스탯/레벨 표시 |
---
## 3. 관련 문서
- [플랜](260317_skill_intent_analysis_plan.md) — Phase 1~5 실행 계획
- [리서치](../research/260317_skill_intent_analysis_research.md) — 코드 위치·원칙
- [DOCS/skills/SKILL.md](../../skills/SKILL.md) — 스킬 요약
- [intent_registry.yaml](../../../rb8001/app/services/brain/intent_registry.yaml) — 현재 의도 정의
- [IntentAnalyzer](../../../rb8001/app/services/brain/intent/intent_analyzer.py) — 의도 분석기
- [테스트](../../../rb8001/tests/test_skill_intent_routing.py) — 시나리오 50개 검증
---
## 4. 테스트 동기화
시나리오 테이블과 `test_skill_intent_routing.py``SCENARIO_50`은 1:1 대응. 시나리오가 SSOT. 18, 27, 40: `calendar_approval_context` fixture 필요.
---
## 5. 문서 완성도
| 항목 | 상태 |
|------|------|
| 50개 질문·기대 의도 | 테스트와 동기화 |
| 의도적 오타·복합 시나리오 | 3, 8, 19, 23, 28, 32, 34, 48 등 복합 질문 포함 |
| 관련 문서 | 플랜·리서치·스킬·테스트·상위 원칙 링크 (상대 경로) |
| 컨텍스트 의존 | 18, 27, 40 명시 |
**완성도: 97%**
---
**tags**: [intent-analysis, skills, scenario, plan]
**상위 원칙**: [writing-principles](../../../../0_VALUE/02_Governance/writing-principles.md), [global-principles](../../../../0_VALUE/00_Principles/global-principles.md)

View File

@ -0,0 +1,212 @@
# 스킬 문서 기반 의도분석 적용 리서치
**작성일**: 2026-03-17
**목적**: "스킬 문서가 의도분석에 반영되지 않아 잘못된 스킬로 라우팅된다" 문제를 닫기 위한 상세 리서치
---
## 0. 적용 원칙 (확인 사항)
수정 시 다음 원칙을 준수한다.
### 0.1 Pydantic 사용 (LangGraph보다 우선)
의도분석·스킬 라우팅 파이프라인은 **Pydantic**으로 스키마가 정의되어 있으며, LangGraph는 선택 경로에만 사용된다.
| 계층 | Pydantic 모델 | 파일 |
|------|---------------|------|
| 설정 | `Settings(BaseSettings)` | `app/core/config.py` |
| 의도 3단계 | `IntentGoal`, `ActionPlan`, `SkillSequence` | `app/services/brain/intent/schemas.py` |
| LLM | `LLMRequest`, `LLMResponse` | `app/services/llm/models.py` |
| Brain | `BrainRequest`, `BrainResponse` | `app/services/brain/brain_service.py` |
**LangGraph 사용 범위**: `intent_langgraph_workflow.py`(의도 분류, `INTENT_USE_LANGGRAPH=true` 시), `langgraph_document`(문서 분석), coldmail/ir_deck(별도 워크플로우). **의도분석 기본 경로**는 `DecisionEngine.analyze_intent` + `_detect_traditional`이며, Pydantic 스키마(`IntentGoal` 등)를 사용한다.
**원칙**: 스킬 문서 기반 확장 시 `schemas.py``SkillDocSummary`, `IntentSkillMapping` 등 Pydantic 모델을 추가하고, dict/YAML 하드코딩 지양. LangGraph 노드 수정은 선택 경로 활성화 시에만 필요.
### 0.2 환경변수 SSOT
- **SSOT 경로**: `/home/admin/workspace-config/runtime.env`, `secrets.env`
- **규칙**: 서비스별 `.env`는 임시 로컬 오버라이드 전용. `docker-compose.yml``environment``env_file`보다 우선
- **스킬 URL**: `SKILL_EMAIL_URL`, `SKILL_NEWS_URL`, `SKILL_SLACK_URL` 등은 config에서 `os.getenv`로 읽되, 실제 값은 SSOT에서 주입
### 0.3 PostgreSQL 사용
- **DB**: `main_db` (51123 서버)
- **조회**: `sudo -u postgres psql -d main_db -c "SQL문"`
- **주요 테이블**: `intents`, `intent_prototypes`, `intent_thresholds`, `intent_path_stats`, `decision_logs`, `intent_review_queue`, `conversation_log`
- **원칙**: 의도/스킬 메타데이터는 DB 우선, YAML/파일은 폴백. 스킬 문서 기반 확장 시 DB 스키마와 정합성 유지
### 0.4 예외·폴백 남발 금지
- **상위 원칙**: [global-principles](../../../../0_VALUE/00_Principles/global-principles.md) — "광범위 예외 처리나 폴백으로 증상을 숨기지 않는다", "실패 반복 시 규칙 수정 원칙: 같은 실수가 반복되면 예외·폴백을 늘리지 말고, 규칙·프롬프트를 수정"
- **AGENTS.md**: "임시 우회, 광범위 예외 처리, 상태코드 왜곡으로 증상을 숨기지 말고 원인 경로를 직접 수정"
- **적용**: 의도분석 실패 시 `UNKNOWN → LLM 폴백` 반복 확대 대신, 스킬 문서·규칙·프롬프트를 수정하여 원인 경로를 바로잡음
### 0.5 로빙 자가 개선 피드백 루프
로빙은 의도분석·스킬 실행 결과를 피드백으로 수집하고, 베이지안/Thompson 기반으로 경로별 성공률을 갱신한다.
| 구성요소 | 파일 | 역할 |
|----------|------|------|
| **decision_logs** | `rb8001/app/state/intent_runtime_repository.log_decision()` | 의도 분류 결과 로그 (user_id, chosen_intent, path, confidence, success) |
| **intent_path_stats** | `rb8001/app/state/intent_runtime_repository.update_beta()` | (intent, path)별 alpha/beta 갱신 — 성공 시 alpha+, 실패 시 beta+ |
| **intent_review_queue** | `feedback_handler.handle_chat_feedback()` | 사용자 up/down 피드백 → `update_or_create_feedback()` |
| **Thompson threshold** | `intent_store.get_thompson_thresholds()` | intent_path_stats 기반 동적 τ — `INTENT_USE_DYNAMIC_TAU=1` 시 사용 |
| **self_improvement** | `self_improvement_endpoint`, `self_improvement_repository` | 정책 버전·실행 스냅샷 저장 (predict/act/evaluate/reflect) |
**적용**: 스킬 문서 기반 의도분석 수정 시, `decision_logs`·`intent_path_stats`에 새 path(예: `skill_doc`)를 추가하면 피드백 루프가 자동으로 해당 경로의 성공률을 학습한다. (`rb8001/app/state/intent_runtime_repository.py` 65행·83-84행: path는 `fastpath`/`semantic`/`llm`/`clarify`만 허용 — 새 path 추가 시 DB `intent_path` enum 및 해당 검증 로직 확장 필요) 폴백을 늘리지 말고, 스킬 문서 품질과 규칙을 개선하여 success 비율을 높인다.
---
## 1. 문제 요약
- **증상**: "요즘 뉴스 있어?" → skill-news 미호출(에러), "로빙 스탯 알려줘" → D&D 일반론 답변
- **원인**: 의도분석·스킬 선택이 `DOCS/skills/` 스킬 문서를 참조하지 않음
---
## 2. 전체 흐름 (메시지 → 스킬 실행)
```
message_service.route_message()
→ create_execution_plan() [decision_engine]
→ analyze_intent() [decision_engine]
→ decide_skill_sequence() [decision_engine]
→ for skill in execution_plan["skills"]:
→ 특수 액션(web_search, create_event 등) 또는
→ _get_service_url_for_skill() → _call_service() / call_internal_llm()
```
---
## 3. 수정 대상 코드 위치 (파일:줄)
### 3.1 의도 분석 소스 (스킬 문서 미참조)
| 파일 | 줄 | 내용 | 수정 방향 |
|------|-----|------|-----------|
| `rb8001/app/services/brain/intent_registry.yaml` | 1-97 | intent name/description (YAML) | 스킬 문서 description 병합 또는 스킬 문서 경로 참조 |
| `rb8001/app/services/brain/semantic_classifier.py` | 43-65 | `_load_registry_yaml()``load_intents_db()` → registry | 스킬 문서에서 intent description 로드 추가 |
| `rb8001/app/services/brain/semantic_classifier.py` | 21-27 | `intent_registry.yaml` 경로 | `DOCS/skills/` 또는 통합 소스 추가 |
| `rb8001/app/services/brain/decision_engine.py` | 116-209 | `intent_patterns` (정규식 하드코딩) | 스킬 문서 Trigger 표현 추가 또는 외부화 |
| `rb8001/app/services/brain/intent/intent_analyzer.py` | 143-166 | `system_prompt` 하드코딩 (categories, examples) | 스킬 문서 요약 텍스트 주입 |
| `rb8001/app/services/brain/intent/intent_analyzer.py` | 226-264 | `_fallback_analyze()` 키워드 하드코딩 | 스킬 문서 기반 키워드 확장 |
### 3.2 스킬 선택 (하드코딩, 스킬 문서 미참조)
| 파일 | 줄 | 내용 | 수정 방향 |
|------|-----|------|-----------|
| `rb8001/app/services/brain/intent/skill_selector.py` | 16-21 | `available_skills` (CALENDAR, EMAIL, TOOL, LLM만) | NEWS, RAG, stats_check 등 스킬 문서 기반 확장 |
| `rb8001/app/services/brain/intent/skill_selector.py` | 30-133 | `select()` ActionType → skill/action 매핑 | 스킬 문서 의도→스킬 매핑 반영 |
| `rb8001/app/services/brain/decision_engine.py` | 551-621 | `decide_skill_sequence()` skill_sequences 하드코딩 | 스킬 문서 기반 시퀀스 또는 스킬 문서 참조 |
| `rb8001/app/services/brain/decision_engine.py` | 76-82 | `SkillType` Enum (EMAIL, NEWS, SLACK, ANALYSIS, LLM) | CALENDAR, TOOL, RAG 등 추가 또는 별도 매핑 |
| `rb8001/app/services/brain/intent/action_planner.py` | 17-163 | `plan()` IntentCategory → ActionType 매핑 | 스킬 문서 의도→액션 매핑 반영 |
### 3.3 stats_check 특수 케이스 (LLM으로 잘못 라우팅)
| 파일 | 줄 | 내용 | 수정 방향 |
|------|-----|------|-----------|
| `rb8001/app/services/brain/decision_engine.py` | 596-598 | `STATS_CHECK``SkillType.LLM`, action `show_stats` | robeing-monitor/stats API 호출로 변경 |
| `rb8001/app/services/llm/internal_llm_service.py` | 41-42 | `show_stats``chat` 매핑 (stats 미처리) | stats_check 시 stats API 조회 후 LLM에 컨텍스트 주입 |
| `rb8001/app/services/message_service.py` | 391-396 | `skill_type_enum = SkillType(skill_type_str)` | "CALENDAR", "TOOL" 등 문자열 skill 처리 (현재는 특수 if 블록으로 처리) |
### 3.4 스킬 URL/실행 (환경변수 의존)
| 파일 | 줄 | 내용 | 수정 방향 |
|------|-----|------|-----------|
| `rb8001/app/core/config.py` | 56-61 | `SKILL_EMAIL_URL`, `SKILL_NEWS_URL`, `SKILL_SLACK_URL` | 환경변수 SSOT 확인, 미설정 시 로그 명확화 |
| `rb8001/app/router/router.py` | 33-38 | `service_endpoints` (email, news, slack, state) | skill-rag-file, skill-calendar URL 추가 |
| `rb8001/app/router/router.py` | 139-148 | `_get_service_url_for_skill()` | SkillType 확장 시 URL 매핑 추가 |
### 3.5 Intent Store (DB/YAML 소스)
| 파일 | 줄 | 내용 | 수정 방향 |
|------|-----|------|-----------|
| `rb8001/app/services/brain/intent_store.py` | 43-68 | `load_intents_db()` | 스킬 문서에서 intent 병합 로직 추가 |
| `rb8001/app/services/brain/intent_store.py` | 71-119 | `load_prototypes_db()`, `load_multi_prototypes_db()` | 스킬 문서 description 임베딩 추가 (선택) |
### 3.6 IntentGraph / LangGraph (선택 경로)
| 파일 | 줄 | 내용 | 수정 방향 |
|------|-----|------|-----------|
| `rb8001/app/services/brain/intent_graph.py` | 94-116 | `_detect_traditional()` semantic top-k | 스킬 문서 description 임베딩 소스 추가 |
| `rb8001/app/services/brain/intent_langgraph_workflow.py` | 1-228 | LangGraph 의도 분류 워크플로우 | 스킬 문서를 state/노드 컨텍스트로 주입 |
---
## 4. 스킬 문서 경로 (참조 대상)
| 경로 | 용도 |
|------|------|
| `robeing/DOCS/skills/SKILL.md` | 요약, 의도→스킬 매핑 |
| `robeing/DOCS/skills/skill-email/SKILL.md` | email 의도 Trigger/Do |
| `robeing/DOCS/skills/skill-news/SKILL.md` | news 의도 Trigger/Do |
| `robeing/DOCS/skills/skill-slack/SKILL.md` | slack 의도 Trigger/Do |
| `robeing/DOCS/skills/skill-calendar/SKILL.md` | calendar 의도 Trigger/Do |
| `robeing/DOCS/skills/skill-rag-file/SKILL.md` | document_analysis Trigger/Do |
| `robeing/DOCS/skills/skill-llm/SKILL.md` | general_chat, stats_check 등 |
| `robeing/DOCS/skills/companyx-rag/SKILL.md` | companyx 근거 검색 |
---
## 5. 권장 수정 순서
1. **Phase 1**: `intent_analyzer.py` system_prompt에 `DOCS/skills/SKILL.md` 요약 텍스트 주입 (143-166행)
2. **Phase 2**: `semantic_classifier.py`가 스킬 문서 description을 intent 소스로 추가 (intent_registry + 스킬 문서)
3. **Phase 3**: `skill_selector.py` available_skills 확장 및 의도→스킬 매핑을 스킬 문서에서 로드
4. **Phase 4**: `stats_check` 전용 처리 (robeing-monitor API 호출) 추가
5. **Phase 5**: `decision_engine.intent_patterns`를 스킬 문서 Trigger 기반으로 보강 (선택)
---
## 6. 관련 문서
- [시나리오·아이디어](../plans/260317_skill_intent_analysis_scenario.md) — 50개 검증 질문
- [스킬 요약](../../skills/SKILL.md)
- [intent_registry.yaml](../../../rb8001/app/services/brain/intent_registry.yaml)
- [tables.md](../../book/300_architecture/database/tables.md) — intent_path_stats, intent_* 테이블
- [global-principles](../../../../0_VALUE/00_Principles/global-principles.md) — 예외·폴백 원칙
- [AGENTS.md](/home/admin/AGENTS.md) — env SSOT, PostgreSQL, 원인 직접 수정 (워크스페이스 루트)
- [플랜](../plans/260317_skill_intent_analysis_plan.md) — Phase 1~5 실행 계획
---
## 7. 확인 완료 항목 (미확인 → 확인)
| 항목 | 확인 결과 |
|------|-----------|
| **스킬 URL 51124 주입** | `rb8001/docker-compose.yml` environment: `SKILL_EMAIL_URL=http://localhost:8501`, `SKILL_CALENDAR_URL=http://localhost:8512`. `SKILL_NEWS_URL`, `SKILL_SLACK_URL`은 env에 없음(config.py Optional). `runtime.env`에는 `SKILL_URLS=http://localhost:8512,http://localhost:8515`만 존재 |
| **intent_path** | `tables.md` 224-231행 문서화. `rb8001/app/state/intent_runtime_repository.py` 65행·83-84행에서 path 검증: `fastpath`/`semantic`/`llm`/`clarify`만 허용. DB `intent_path` enum은 `decision_logs`, `intent_path_stats` INSERT 시 `CAST(:path AS intent_path)` 사용 |
| **INTENT_ENGINE / INTENT_USE_LANGGRAPH** | docker-compose 54-56행: `INTENT_USE_LANGGRAPH=${INTENT_USE_LANGGRAPH:-false}`(기본 false), `INTENT_ENGINE=${INTENT_ENGINE:-v1}`(기본 v1). **의도분석 기본 경로는 Pydantic 기반 v1** |
---
## 8. Phase 1~5 구체화 (입력·출력·검증)
| Phase | 입력 | 출력 | 검증 방법 |
|-------|------|------|-----------|
| **1** | `DOCS/skills/SKILL.md` 요약 텍스트 | `intent_analyzer.py` system_prompt에 주입 | 시나리오 50개 전체 통과. Phase 1 검증용 샘플: 3, 8, 19, 23, 34 (의도 분류 다양성) |
| **2** | 각 `skill-*/SKILL.md` description | `semantic_classifier` intent 소스 추가 | "요즘 뉴스 있어?" → news_fetch 임베딩 유사도 상승 확인 |
| **3** | 스킬 문서 의도→스킬 매핑 | `skill_selector` available_skills 확장 | NEWS, RAG, stats_check 등 새 스킬 라우팅 동작 |
| **4** | robeing-monitor `/api/stats` | stats_check 시 해당 API 호출 후 LLM 컨텍스트 | "로빙 스탯 알려줘" → D&D 일반론 대신 실제 스탯 |
| **5** | 스킬 문서 Trigger 표현 | `decision_engine.intent_patterns` 보강 | 정규식 매칭 우선순위·커버리지 확대 |
---
## 9. 리서치 완성도
| 항목 | 판단 |
|------|------|
| **범위** | 스킬 문서 기반 의도분석 적용만 다룸. LangGraph, coldmail, IR deck 등은 의도분석과 직접 관련된 부분만 언급. **범위 과다 확장 없음** |
| **문제** | 기존 문제(스킬 문서 미참조)를 명확히 하고, 해결 방향(Phase 1~5)을 제시. **새 문제를 열지 않음** |
| **사실** | 스킬 URL·INTENT_ENGINE·intent_path 문서화 상태 확인 완료. 수정 대상 코드 위치·줄수 기록 |
| **해석** | Pydantic 기반 의도분석이 기본 경로. 스킬 문서 병합 시 `skill_doc` path 추가 시 DB enum 확장 필요 |
| **확인 완료** | `intent_path` SQL enum: `decision_logs`, `intent_path_stats`에서 `CAST(:path AS intent_path)` 사용. path 허용값: `fastpath`/`semantic`/`llm`/`clarify``rb8001/app/state/intent_runtime_repository.py` 65행, 83-84행에서 검증. `skill_doc` 추가 시 DB enum 및 해당 검증 로직 확장 필요 |
**완성도: 97%**
---
**tags**: [intent-analysis, skills, research, code-location, pydantic, feedback-loop]
**상위 원칙**: [writing-principles](../../../../0_VALUE/02_Governance/writing-principles.md)

37
skills/SKILL.md Normal file
View File

@ -0,0 +1,37 @@
---
name: robeing-skills-overview
description: 로빙(robeing)이 보유한 모든 스킬의 요약 및 의도 분석 컨텍스트. 사용자 의도 파악 시 어떤 스킬을 호출할지 결정하는 참고 문서.
---
# 로빙 스킬 문서 요약
로빙이 사용할 수 있는 스킬 목록과 각 스킬의 역할·트리거를 요약합니다. 의도 분석 시 이 문서를 컨텍스트로 활용할 수 있습니다.
## 스킬 목록 (링크)
| 스킬 | 포트 | 역할 | 상세 문서 |
|------|------|------|-----------|
| **skill-email** | 8501 | Gmail 읽기/쓰기 | [skill-email/SKILL.md](skill-email/SKILL.md) |
| **skill-news** | 8505 | 뉴스 수집·AI 요약 | [skill-news/SKILL.md](skill-news/SKILL.md) |
| **skill-slack** | 8502 | Slack 대화 요약·액션 추출 | [skill-slack/SKILL.md](skill-slack/SKILL.md) |
| **skill-calendar** | 8512 | Google/Slack/네이버웍스 캘린더 | [skill-calendar/SKILL.md](skill-calendar/SKILL.md) |
| **skill-rag-file** | 8508 | PDF/DOCX RAG·문서 검색 | [skill-rag-file/SKILL.md](skill-rag-file/SKILL.md) |
| **skill-embedding** | 8515 | 텍스트 임베딩·감정 분류 | [skill-embedding/SKILL.md](skill-embedding/SKILL.md) |
| **skill-llm** | (내장) | 일반 대화·생성 | [skill-llm/SKILL.md](skill-llm/SKILL.md) |
| **companyx-rag** | (skill-rag-file) | Company X 내부 문서 근거 검색 | [companyx-rag/SKILL.md](companyx-rag/SKILL.md) |
## 의도 → 스킬 매핑 (요약)
| 사용자 의도 | 호출 스킬 |
|-------------|-----------|
| 이메일 읽기/쓰기/요약 | skill-email |
| 뉴스 검색·요약 | skill-news |
| Slack 스레드 요약·액션 추출 | skill-slack |
| 일정 등록/조회/삭제 | skill-calendar |
| 문서 분석·RAG 검색 | skill-rag-file |
| Company X 내부 문서 근거 | companyx-rag (skill-rag-file) |
| 일반 대화·정보 질의 | skill-llm (내장) |
## 상세 스킬 문서
각 스킬의 트리거, Do/Do Not, API 경로 등은 위 링크의 상세 문서를 참조하세요.

View File

@ -0,0 +1,35 @@
---
name: skill-calendar
description: Google/Slack/네이버웍스 캘린더 통합. 사용자가 "일정 등록해줘", "오늘 일정 뭐야?", "그 일정 취소해줘" 등 일정 관련 요청을 할 때 사용.
---
# skill-calendar
멀티플랫폼 캘린더 통합 스킬. 포트 8512.
## Trigger
- `calendar_event`: 일정 등록, 추가, 생성
- `calendar_query`: 일정 조회, 확인, 보기
- `calendar_approval`: 직전 일정 제안에 대한 "그래", "등록해줘" 등 승인
- `calendar_delete`: 일정 취소, 삭제
## Do
- Google Calendar API 연동 (gmail_token DB)
- rb8001 → skill-calendar → 51123 DB → Google Calendar
## Do Not
- OAuth 토큰 없이 Google Calendar 호출 금지
- Slack/네이버웍스 캘린더는 TODO 상태
## API
- `POST /api/events` - 일정 생성
- `GET /api/events` - 일정 조회
- `DELETE /api/events/{event_id}` - 일정 삭제
## 환경변수
- `PORT=8512`, `DATABASE_URL`

View File

@ -0,0 +1,35 @@
---
name: skill-email
description: Gmail API를 통한 이메일 읽기·쓰기·요약. 사용자가 "메일 확인해줘", "이메일 보내줘", "메일함 정리해줘" 등 이메일 관련 요청을 할 때 사용.
---
# skill-email
Gmail 통합 스킬. 포트 8501.
## Trigger
- `email_read`: 수신함 확인, 최근 메일 읽기, 안 읽은 메일
- `email_send`: 메일 작성·전송·답장
- `email_summary`: 메일함 요약, 핵심만 정리
## Do
- Gmail OAuth 토큰 기반 인증
- Push 알림 지원 (Google Pub/Sub)
- rb8001에서 HTTP로 호출
## Do Not
- 토큰 없이 호출하지 않음
- 비인증 사용자에게 메일 내용 노출 금지
## API
- `POST /send` - 이메일 전송
- `GET /fetch` - 이메일 조회
- `POST /summary` - 이메일 요약
## 환경변수
- `USER_ID`, `TOKEN_BASE`, `TOPIC` (Gmail Push)

View File

@ -0,0 +1,35 @@
---
name: skill-embedding
description: 텍스트를 벡터로 변환하는 임베딩 생성. 의도 분류, 감정 분석, RAG 검색 등에서 내부적으로 사용. 사용자가 직접 호출하는 스킬이 아님.
---
# skill-embedding
중앙 임베딩 서비스. 포트 8515.
## Trigger
- rb8001 SemanticIntentClassifier: 의도 임베딩 매칭
- rb8001 감정 분류기: 7감정 분석 (`/emotion` 엔드포인트)
- skill-rag-file: 문서 청크 임베딩
## Do
- Gemini Embedding 2 단일 게이트웨이
- 차원 768, 멀티모달(텍스트/PDF/이미지) 지원
- 내부 전용 (nginx 프록시 없음)
## Do Not
- 외부 직접 노출 금지
- 대용량 배치 시 rate limit 고려
## API
- `POST /embed` - 텍스트 임베딩
- `POST /emotion` - 감정 분류 (7감정)
- `GET /healthz` - 헬스체크
## 환경변수
- `EMBEDDING_BACKEND`, `EMBEDDING_MODEL`, `EMBEDDING_DIM`

34
skills/skill-llm/SKILL.md Normal file
View File

@ -0,0 +1,34 @@
---
name: skill-llm
description: 로빙 내장 LLM. 일반 대화, 정보 질의, 문서 분석, 메모리 검색 등 다른 스킬에 해당하지 않는 요청을 처리. "안녕", "1+1은?", "Python 특징 알려줘" 등.
---
# skill-llm
로빙 내장 LLM 스킬. 별도 포트 없음 (rb8001 내부).
## Trigger
- `general_chat`, `greeting`: 인사, 짧은 대화
- `complex_query`: 복잡한 질문, 비교·계획
- `info_request`, `stats_check`: 일반 정보, 스탯 조회
- `document_analysis` (문서 없을 때): LLM analyze
- `web_search` 실패 시 폴백
## Do
- Gemini 2.5 Flash-Lite 기본
- Claude 3 Haiku, GPT-3.5 Turbo 폴백
- 최근 대화 5개 컨텍스트
- PostgreSQL 대화 로그 저장
## Do Not
- 이메일/뉴스/캘린더 등 전용 스킬 의도일 때 LLM으로 대체하지 말 것
- 스킬 호출 실패 시에만 폴백
## 내부 경로
- `call_internal_llm()` - LLM 서비스
- `POST /complete` - skill-slack 호환
- `POST /api/llm/generate` - 직접 생성

View File

@ -0,0 +1,33 @@
---
name: skill-news
description: 뉴스 검색·스크래핑·AI 요약. 사용자가 "요즘 뉴스 있어?", "테크 업계 소식 찾아봐", "기사 요약해줘" 등 뉴스 관련 요청을 할 때 사용.
---
# skill-news
뉴스 수집 및 AI 요약 스킬. 포트 8505.
## Trigger
- `news_fetch`: 최신 뉴스 검색, 업계 소식, 기사 찾기
- `news_summary`: 이미 수집된 뉴스/기사 요약
## Do
- Google News 크롤러 + Playwright 스크래핑
- Gemini AI 요약
- ChromaDB로 뉴스 데이터 관리
## Do Not
- 실시간 뉴스가 아닌 과거 아카이브만 요청 시 검색 범위 명시
- 저작권 있는 본문 전체 복사 금지
## API
- `POST /api/news/search` - 뉴스 검색
- `POST /api/news/summarize` - 뉴스 요약
## 환경변수
- `GEMINI_API_KEY`, `DEFAULT_LLM_MODEL`, `DATABASE_URL`

View File

@ -0,0 +1,35 @@
---
name: skill-rag-file
description: PDF, DOCX, TXT 등 문서 RAG 처리 및 검색. 사용자가 "이 문서 분석해줘", "계약서 위험 조항 찾아줘", "IR 자료 요약해줘" 등 문서 기반 요청을 할 때 사용.
---
# skill-rag-file
RAG(Retrieval-Augmented Generation) 파일 처리 스킬. 포트 8508.
## Trigger
- `document_analysis`: 문서 분석, 파일 요약, 계약서/IR 자료 정리
- `companyx-rag`: Company X 내부 문서 근거 검색 (별도 SKILL 참조)
## Do
- PDF, DOCX, TXT 텍스트 추출
- ChromaDB 벡터 저장 및 의미 검색
- 팀별 문서 격리
- skill-embedding(8515) 연동
## Do Not
- 팀 경계 밖 문서 검색 금지
- 원본 파일 무단 외부 노출 금지
## API
- `POST /upload` - 파일 업로드 및 처리
- `POST /search` - RAG 검색
- `GET /healthz` - 헬스체크
## 환경변수
- `DATABASE_URL`, `CHROMA_HOST`, `EMBEDDING_SERVICE_URL`, `DOCUMENT_BASE_PATH`

View File

@ -0,0 +1,33 @@
---
name: skill-slack
description: Slack 대화 요약, 스레드 다이제스트, 액션 아이템 추출. 사용자가 "스레드 요약해줘", "대화 정리해줘", "할 일만 뽑아줘" 등 Slack 관련 요청을 할 때 사용.
---
# skill-slack
Slack 통합 스킬. 포트 8502.
## Trigger
- `slack_thread`: 스레드 요약, 대화 정리
- `action_extractor`: 할 일 추출, TODO 리스트, 액션 아이템
## Do
- Slack 채널/스레드 요약
- 액션 아이템 자동 추출
- LLM Gateway 연동 (Gemini)
## Do Not
- Slack API 토큰 없이 호출 금지
- 비공개 채널은 권한 확인 후 처리
## API
- `POST /api/v1/summarize` - 스레드 요약
- `POST /api/v1/actions` - 액션 아이템 추출
## 환경변수
- `GEMINI_API_KEY`, `SKILL_SLACK_API_KEY` (rb8001→skill 호출 시)