DOCS/journey/troubleshooting/250914_happybell80_IntentAnalyzer_미사용_문제.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

4.6 KiB

트러블슈팅: IntentAnalyzer 미사용 및 Slack UX 문제

발생 시간

  • 2025년 9월 14일

문제 상황

  1. 멘션 필수 문제: 채널에서 항상 @robeing /search 형태로 멘션 필요
  2. 자연어 인식 실패: "검색해줘", "찾아봐" 같은 자연어 명령 무시
  3. 마크다운 포맷 깨짐: **굵게** 형식이 Slack에서 깨짐 (Slack은 *굵게* 사용)

원인 분석

1. IntentAnalyzer 고아 코드 상태

# app/llm/intent_analyzer.py 존재하지만 미사용
- "검색해줘"  "/search" 변환 기능 구현됨
- 어디서도 import/호출하지 않음
- slack_handler.py:81에서 router.route_message() 직접 호출
- DecisionEngine(정규식 기반) 사용 , IntentAnalyzer(LLM 기반) 미사용
- 2025-08-11 같은   시스템 모두 개발, DecisionEngine만 채택됨

2. Slack 이벤트 처리 로직

# 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. 검색 의도 인식 개선

# 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 여전히 미사용 (향후 과제)

# 현재: DecisionEngine 정규식만 사용 → "케대헌이 뭐야?" 인식 개선됨
# 미래: IntentAnalyzer(LLM) + DecisionEngine(정규식) 병행 필요

3. 응답 포맷 변환

# 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줄 리팩토링 (비즈니스 로직 분리)

추가 문제 (2025-09-17)

파일 내용으로 인한 의도 오분류

  • 증상: 파일만 업로드시 "이메일 서비스 연결 실패"
  • 원인 분석:
    1. slack_handler.py가 파일 내용을 text에 추가 (236행)
    2. router.py의 이메일 키워드 체크가 파일 내용 검사
    3. DecisionEngine이 파일 내용의 "이메일" 단어 감지
    4. EMAIL_SEND로 분류 → skill-email 호출 → 422 에러

해결 시도

  1. router.py 이메일 체크 제거

    • 143-158행 주석 처리
    • 파일 내용 오인식 문제로 임시 비활성화
  2. DecisionEngine 파일 감지 개선 (부분 해결)

    • "[파일:" in message 체크 추가
    • 하지만 패턴 매칭이 여전히 파일 내용 검사

구조적 문제

  • 의도 분석 시점: 파일 내용이 message에 포함된 후 분석
  • 패턴 매칭 범위: 전체 메시지(파일 내용 포함) 검사
  • 우선순위 충돌: 파일 감지 vs 키워드 패턴 매칭

근본 해결 필요

  • 파일 컨텍스트와 사용자 메시지 분리
  • 의도 분석 시 원본 메시지만 사용
  • 파일 있을 때 DOCUMENT_ANALYSIS 강제