# task-1928 완료 보고서: 카카오톡 정제 로직 고도화 — 5대 품질 이슈 수정

## SCQA

**S**: 인슈위키 카카오톡 정제 기능(knowledge_extractor_v2.py)이 다층 LLM 파이프라인(Haiku→Sonnet)으로 운영 중이며, 규칙 기반 폴백 경로도 지원한다.

**C**: 제이회장님이 직접 확인한 5대 품질 이슈가 발견됨. (1) 동일 주제 묶기 실패 (2) 답변 없는 질문 포함 (3) 인사/안부를 질문으로 잡음 (4) 개인 일지를 질문으로 잡음 (5) 제목-질문 불일치.

**Q**: 5대 품질 이슈를 수정하여 정제 품질을 개선할 수 있는가?

**A**: LLM 프롬프트 고도화(Stage 1/Stage 2) + 규칙 기반 비질문 필터링 로직 + QA 답변 없음 필터링을 통합 적용하여 5대 이슈 모두 해결. pytest 57건 전체 통과(기존 52건 + 신규 5건), 기존 테스트 회귀 0건.

## 수정 파일

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/kakao_knowledge/knowledge_extractor_v2.py:89 | Stage 1 프롬프트에 비질문 판별 기준 추가 | grep "비질문 판별 기준" OK | verified |
| scripts/kakao_knowledge/knowledge_extractor_v2.py:119 | Stage 2 프롬프트에 주제 통합/질문 판별/제목 생성 규칙 추가 | grep "주제 통합 규칙" OK | verified |
| scripts/kakao_knowledge/knowledge_extractor_v2.py:65 | _NON_QUESTION_PHRASES + _is_non_question_message + _is_non_question_thread 함수 추가 | grep "_is_non_question_thread" OK | verified |
| scripts/kakao_knowledge/knowledge_extractor_v2.py:898 | _rule_based_filter_single에 비질문 스레드 제외 로직 추가 | grep "비질문 스레드" OK | verified |
| scripts/kakao_knowledge/knowledge_extractor_v2.py:832 | _build_insight_from_llm에 QA 답변 없음 필터 추가 | grep "이슈2" OK | verified |
| scripts/kakao_knowledge/knowledge_extractor_v2.py:1006 | _rule_based_extract_single에 QA 답변 없음 필터 추가 | grep "이슈2" OK | verified |
| scripts/kakao_knowledge/knowledge_extractor_v2.py:786 | _build_insight_from_llm 반환 타입을 Optional[dict]로 수정 | grep "Optional" OK | verified |
| scripts/kakao_knowledge/tests/test_knowledge_extractor_v2.py:1317 | TestQualityIssues 클래스 5개 테스트 추가 | grep "TestQualityIssues" OK | verified |

## 이슈별 해결 방법

### 이슈1: 동일 주제 묶기
- Stage 2 프롬프트에 "주제 통합 규칙" 섹션 추가: 같은 주제 연속 대화는 하나의 QA로 통합 지시

### 이슈2: 답변 없는 질문 제외
- `_build_insight_from_llm`, `_rule_based_extract_single` 양쪽에 QA+빈answer → None 반환 로직 추가

### 이슈3: 인사/안부형 비질문 제외
- `_is_non_question_message` 함수: 구두점/특수문자 제거 후 비질문 구문만 남으면 True
- `_rule_based_filter_single`에서 스레드 전체가 비질문이면 has_insight=False 처리
- Stage 1 프롬프트에 비질문 판별 기준 명시

### 이슈4: 일지/일기형 비질문 제외
- `_RE_DIARY_PATTERN` 정규식: 날짜+기록 형태 감지
- `_is_non_question_message`에서 일기 패턴 매칭 시 True 반환
- Stage 1 프롬프트에 일기형 제외 기준 명시

### 이슈5: 제목-질문 매칭
- Stage 2 프롬프트에 "제목 생성 규칙" 섹션 추가: 제목은 답변이 아닌 질문 내용 기반으로 생성

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **규칙 기반 경로에서 비질문 필터링 누락** — LLM 프롬프트만 수정하면 use_llm=False 경로에서 효과 없음. `_is_non_question_thread` 함수 + `_rule_based_filter_single` 연동으로 해결
2. **인사 정규식 매칭 실패** — 한국어 인사의 다양한 구두점/특수문자 조합(~, !, ?)을 처리하기 위해 구두점 제거 후 구문 매칭 방식으로 전환
3. **Pyright 타입 에러** — `_build_insight_from_llm`의 반환 타입이 None을 포함하지 않아 타입 에러 발생. `Optional[dict]`로 수정

## 테스트 결과

- pytest 57건 전체 PASS (기존 52건 회귀 0건 + 신규 5건)
- L1 스모크테스트: 규칙 기반 경로에서 정상 QA 1건 유지, 인사/일기형 제외 확인
- Pyright 타입 에러 수정 완료

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-1928-dev5
- **워크트리 경로**: /home/jay/projects/insuwiki/.worktrees/task-1928-dev5
- **머지 의견**: 57건 테스트 전체 통과, 기존 로직 회귀 없음, L1 스모크테스트 통과. 안전하게 머지 가능.

## 모델 사용 기록

- 팀원: 엔키 / 작업 내용: 프롬프트 고도화 + QA 필터링 로직 추가 / 사용 모델: sonnet / 정당성: -
- 팀원: 닌기르수 / 작업 내용: 5대 품질 이슈 테스트 케이스 추가 / ���용 모델: sonnet / 정당성: -
- 팀장: 마르둑 / 작업 내용: 규칙 기반 비질문 필터링 직접 구현 (Sonnet 구현 한계 보완) / 사용 모델: opus / 정당성: Sonnet이 규칙 기반 경로 미고려

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

