DOCS/journey/troubleshooting/251118_claude_의도_분석_엔티티_추출_분리.md

3.7 KiB

rb8001: 의도 분석과 엔티티 추출 분리 필요

날짜: 2025-11-18
작성자: claude
관련 파일: rb8001/app/services/workflows/web_search_workflow.py, rb8001/app/router/slack_handler.py, rb8001/app/brain/decision_engine.py


문제 상황

  • 사용자: "인터케어 검색해줘" → 로빙: "어떤 회사를 말씀하시나요?" (재질문만 반환, 검색 미수행)
  • 웹 검색만 엔티티 추출 실패 시 차단하고, 이메일/캘린더/문서 분석은 차단하지 않음
  • 의도 분석과 엔티티 추출이 혼재되어, 의도는 맞게 분석했지만 엔티티 추출 실패로 실행이 차단됨

원인 분석

  • web_search_workflow.py:144-146: 엔티티가 없거나 conf < 1.0이면 clarify_required로 차단
  • _resolve_pronoun_and_link(): 대명사("이 기업", "그 기업")가 있을 때만 엔티티 추출 시도
  • 직접 검색어("인터케어")가 제공된 경우에도 엔티티 추출 실패로 검색 차단
  • 하드코딩된 예시("지에프솔루션 / AIdol Company") 존재

해결 방안

1. 하드코딩 예시 제거 (완료)

  • web_search_workflow.py:145: "예: 지에프솔루션 / AIdol Company" 제거
  • slack_handler.py:492: 동일 예시 제거

2. 의도 분석과 엔티티 추출 분리 (구현 완료)

  • web_search_workflow.py:135-172: link_node에서 직접 검색어 판단 로직 추가
  • 직접 검색어 판단 기준: 대명사 없고 검색 키워드("검색", "찾아", "알아봐" 등) 있으며 실체 명사(한글/영문 2글자 이상) 포함
  • 직접 검색어 제공 시 엔티티 없어도 검색 진행
  • 대명사 사용 시에만 엔티티 추출 시도, 직접 검색어는 쿼리 그대로 사용
  • TDD: tests/test_web_search_direct_query.py 추가 (커밋: 1157570)

시나리오 예시

  1. 직접 검색어: "인터케어 검색해줘" → 즉시 검색 수행
  2. 대명사 + 이전 맥락: "지에프솔루션 검색해줘" → "이 기업 대표 누구야?" → 맥락에서 엔티티 추출 후 검색
  3. 이메일 수신자 명시: "김팀장에게 메일 보내줘" → 즉시 처리
  4. 이메일 수신자 불명확: "메일 보내줘" → 수신자 재질문
  5. 캘린더 정보 완전: "11월 25일 오전 9시 검진 등록" → 즉시 등록 확인
  6. 캘린더 정보 불완전: "내일 회의 등록" → 시간/장소 재질문
  7. 문서 첨부: "[파일: 계약서.pdf] 분석해줘" → 즉시 분석
  8. 문서 없음: "계약서 분석해줘" → 파일 재요청
  9. 뉴스 키워드 명시: "AI 규제 뉴스 찾아줘" → 즉시 검색
  10. 뉴스 키워드 불명확: "뉴스 찾아줘" → 주제 재질문

구현 완료

  • 커밋: 1157570 (2025-11-18)
  • 파일: rb8001/app/services/workflows/web_search_workflow.py:135-172
  • 테스트: rb8001/tests/test_web_search_direct_query.py
  • 자동 배포: Gitea Actions 통해 51124 서버 자동 배포 완료

교훈

의도 분석과 엔티티 추출 분리 원칙

  • 의도 분석: 사용자가 무엇을 원하는가 (검색/이메일/캘린더 등)
  • 엔티티 추출: 실행에 필요한 정보가 무엇인가 (검색어/수신자/일정 정보 등)
  • 의도별로 필요한 정보가 없어도 가능한 범위에서 실행하도록 설계

웹 검색 특수성

  • 직접 검색어 제공 시 엔티티 추출 실패와 무관하게 검색 수행
  • 대명사 사용 시에만 엔티티 추출 시도
  • 검색 결과 0건일 때만 재질문

다른 의도와의 일관성

  • 이메일/캘린더/문서 분석은 엔티티 추출 실패 시 재질문하지만 실행은 차단하지 않음
  • 웹 검색도 동일한 원칙 적용 필요