# task-1577.1 완료 보고서 — 스레드 분리 LLM 정밀화 개선

## SCQA

**S**: InsightV2 파이프라인의 `_llm_refine_thread_splits()`는 Haiku LLM으로 규칙 기반 스레드 경계를 정밀 조정하며, 현재 병합(merge) 방향만 지원한다.

**C**: 하나의 스레드에 여러 Q&A가 묶여도 분리할 수 없고, 각 스레드 첫 2개 메시지만 LLM에 전달되어 맥락이 부족하다. insight-021(21개 메시지, 4개 주제 혼합), insight-023(15개 메시지, 중간 주제 전환) 등 오류 사례가 확인되었다.

**Q**: 병합+분리 양방향 지원 + 맥락 확대로 스레드 분리 정확도를 개선할 수 있는가?

**A**: `_llm_refine_thread_splits()` 함수를 4가지 개선하여 양방향 분리를 구현했다. pytest 40건 전체 통과(기존 34건 + 신규 6건), pyright 에러 0건.

## 수정 내용

### 1. 프롬프트 양방향 개선
- 기존: `merge_with_prev` 배열만 반환 → 병합만 가능
- 개선: `{"threads": [{"merge_with_prev": bool, "split_at": [int, ...]}]}` 형식
- 기존 `merge_with_prev` 배열 형식도 하위 호환 지원

### 2. 메시지 프리뷰 확대
- 기존: 각 스레드 첫 2개 메시지, 80자 제한
- 개선: 최대 10개 메시지, 100자 제한, 10개 초과 시 앞 3 + 뒤 3 + "(N개 생략)"

### 3. 분리 로직 구현
- `_split_thread_at()` 헬퍼: `split_at` 인덱스 배열에 따라 스레드를 서브 스레드로 분할
- 병합 후 분리 조합도 지원 (merge → split 순서 처리)

### 4. 노이즈 스레드 필터링
- `_is_noise_thread()` 헬퍼: 분리 후 메시지 3개 미만 + 보험 도메인 키워드 0건인 스레드 제거
- `_CATEGORY_KEYWORDS_V2` 기반 보험 도메인 키워드 매칭

## 산출물 파일

- `/home/jay/projects/insuwiki/.worktrees/task-1577.1-dev1/scripts/kakao_knowledge/knowledge_extractor_v2.py`
- `/home/jay/projects/insuwiki/.worktrees/task-1577.1-dev1/scripts/kakao_knowledge/tests/test_knowledge_extractor_v2.py`

## 테스트 결과

- 전체: 40건 통과 / 0건 실패 (0.21초)
- 기존 34건: 회귀 없음
- 신규 6건:
  - `test_split_at_divides_thread_into_sub_threads` — split_at=[5,8] → 3개 분할
  - `test_merge_with_prev_still_works` — 병합 기능 유지
  - `test_merge_and_split_combined` — 병합+분할 복합 시나리오
  - `test_empty_split_at_no_change` — 빈 split_at → 변경 없음
  - `test_llm_failure_returns_original_threads` — LLM 실패 시 원본 반환
  - `test_noise_threads_filtered_after_split` — 노이즈 스레드 필터링

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **Pyright `mi` 미사용 경고** — `for mi, m in enumerate(preview_msgs)` → `for m in preview_msgs`로 변경
2. **`_is_noise_thread` 키워드 매칭 오탐** — `_extract_keywords()`는 범용 한국어 명사를 추출하여 "안녕하세요"도 키워드로 반환 → `_CATEGORY_KEYWORDS_V2` 기반 보험 도메인 키워드로 교체
3. **LLM 응답 형식 하위 호환** — 기존 `merge_with_prev` 배열 형식으로 응답하는 경우도 처리하도록 fallback 로직 추가

## 머지 판단
- **머지 필요**: Yes
- **브랜치**: task/task-1577.1-dev1
- **워크트리 경로**: /home/jay/projects/insuwiki/.worktrees/task-1577.1-dev1
- **머지 의견**: 40건 테스트 전체 통과, 기존 34건 회귀 없음, 공개 인터페이스 변경 없음. 병합 권장.

## 모델 사용 기록
- 팀원: 아르고스(테스터) / 작업 내용: 신규 테스트 6건 작성 / 사용 모델: sonnet / 정당성: -
- 팀원: 불칸(백엔드) / 작업 내용: _llm_refine_thread_splits 구현 변경 / 사용 모델: sonnet / 정당성: -

## 비고
- 파이프라인 재실행(3월 데이터)은 main 머지 후 별도 실행 필요
- insight-021, 023 실데이터 검증은 파이프라인 재실행 시 확인
