- 2025-09-14 검색 기능 UUID 문제 추가 - slack_handler.py 수정으로 원본 Slack ID 전달 해결 - workspace_member 테이블 활용 방법 문서화 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
84 lines
3.4 KiB
Markdown
84 lines
3.4 KiB
Markdown
# 트러블슈팅: IntentAnalyzer 미사용 및 Slack UX 문제
|
|
|
|
## 발생 시간
|
|
- 2025년 9월 14일
|
|
|
|
## 문제 상황
|
|
1. **멘션 필수 문제**: 채널에서 항상 `@robeing /search` 형태로 멘션 필요
|
|
2. **자연어 인식 실패**: "검색해줘", "찾아봐" 같은 자연어 명령 무시
|
|
3. **마크다운 포맷 깨짐**: `**굵게**` 형식이 Slack에서 깨짐 (Slack은 `*굵게*` 사용)
|
|
|
|
## 원인 분석
|
|
|
|
### 1. IntentAnalyzer 고아 코드 상태
|
|
```python
|
|
# app/llm/intent_analyzer.py 존재하지만 미사용
|
|
- "검색해줘" → "/search" 변환 기능 구현됨
|
|
- 어디서도 import/호출하지 않음
|
|
- slack_handler.py:81에서 router.route_message() 직접 호출
|
|
- DecisionEngine(정규식 기반)만 사용 중, IntentAnalyzer(LLM 기반) 미사용
|
|
- 2025-08-11 같은 날 두 시스템 모두 개발, DecisionEngine만 채택됨
|
|
```
|
|
|
|
### 2. Slack 이벤트 처리 로직
|
|
```python
|
|
# slack_handler.py:209
|
|
if event_type == "app_mention" or (event_type == "message" and is_dm):
|
|
# 채널 메시지는 멘션 필수, DM만 멘션 없이 가능
|
|
```
|
|
|
|
### 3. 응답 포맷 문제
|
|
- LLM이 `**굵게**` 마크다운 생성
|
|
- Slack mrkdwn은 `*굵게*` 형식만 지원
|
|
|
|
## 해결 방법 (2025-09-14 실제 적용)
|
|
|
|
### 1. 검색 의도 인식 개선 ✅
|
|
```python
|
|
# decision_engine.py - WEB_SEARCH 패턴 추가
|
|
IntentType.WEB_SEARCH: [
|
|
r"검색", r"찾아", r"알아봐", r".*이 뭐야", r".*에 대해.*알려"
|
|
]
|
|
# task_type 에러 회피: router.py에서 CommandHandler 직접 호출
|
|
if has_search_intent:
|
|
result = await self.command_handler.handle_command(f"/search {query}")
|
|
```
|
|
|
|
### 2. IntentAnalyzer 여전히 미사용 (향후 과제)
|
|
```python
|
|
# 현재: DecisionEngine 정규식만 사용 → "케대헌이 뭐야?" 인식 개선됨
|
|
# 미래: IntentAnalyzer(LLM) + DecisionEngine(정규식) 병행 필요
|
|
```
|
|
|
|
### 3. 응답 포맷 변환 ✅
|
|
```python
|
|
# slack_handler.py:100-101 (적용 완료)
|
|
response_text = response_text.replace("**", "*") # Slack 포맷 변환
|
|
```
|
|
|
|
## 교훈
|
|
1. **기능 구현 != 기능 활성화**: 코드 작성 후 연결 확인 필수
|
|
2. **고아 코드 점검**: 미사용 모듈 정기적 확인
|
|
3. **플랫폼별 포맷**: Slack mrkdwn ≠ Markdown
|
|
|
|
## 메시지 처리 전체 흐름
|
|
**Slack**: `/api/slack/events` → slack_handler → router.route_message() → Brain(DecisionEngine) → 스킬/LLM → Slack 응답
|
|
**Frontend**: Gateway(JWT) → `/api/message` → router.route_message() → 동일 처리 → HTTP 응답
|
|
**채널 구분**: channel 파라미터 (Slack: "C0123ABCD", Frontend: "frontend")
|
|
**응답 반환**: router는 데이터만 생성, 실제 전송은 각 handler가 처리
|
|
|
|
## 영향 범위
|
|
- router 레벨 통합 시 Slack뿐 아니라 모든 인터페이스(frontend 등)에 자연어 지원
|
|
- DecisionEngine(정규식)과 IntentAnalyzer(LLM) 병행 사용으로 성능/정확도 균형 필요
|
|
- 포맷 깨짐 문제 해결로 가독성 개선 ✅
|
|
|
|
## 실제 테스트 결과 (2025-09-14)
|
|
✅ **성공 사례**: "케대헌 찾아줘" → 웹 검색 실행 → K-Pop Demon Hunters 정보 제공
|
|
✅ **패턴 매칭 개선**: "케대헌이 뭐야?" → WEB_SEARCH 의도로 인식 (패턴 추가 후)
|
|
❌ **남은 문제**: user_id NULL 에러 지속, DB 매핑 실패
|
|
|
|
## 향후 과제
|
|
- IntentAnalyzer(LLM) + DecisionEngine(정규식) 병행으로 정확도 향상
|
|
- 제로샷 의도 분류 구현 (임베딩 기반, /DOCS/ideas/250819 참조)
|
|
- router.py 559줄 → 200줄 리팩토링 (비즈니스 로직 분리)
|