# 카카오톡 오픈채팅 txt 파서 + 지식 추출 엔진

## 작업 개요
카카오톡 PC "대화 내보내기"로 생성된 .txt 파일을 파싱하여 보험 실무 지식을 자동 추출하는 파이프라인을 구축한다.

## 산출물 위치
`/home/jay/projects/insuwiki/scripts/kakao-knowledge/`

## 샘플 데이터
`/home/jay/workspace/data/kakao-sample.txt` (32,946줄, 약 1.5MB)
- 채팅방: "앞서가는 설계사" (보험설계사 384명, 4개월 대화)
- 방장: 이해철/프라임/부산 (보상 전문 손해사정사)

## 파일 포맷 분석 (이미 완료)
```
# 헤더 (1~2줄)
앞서가는 설계사, 스레드 보상스터디 님과 카카오톡 대화
저장한 날짜 : 2026-04-08 13:11:28

# 날짜 구분선
--------------- 2025년 12월 3일 수요일 ---------------

# 메시지 (핵심)
[닉네임] [오전/오후 HH:MM] 메시지 내용

# 멀티라인 메시지 (다음 줄이 [로 시작하지 않으면 이전 메시지의 연속)
[이해철/프라임/부산] [오후 5:46] 광응고술 분쟁이 굉장히 많았습니다.
판결도 수술이다. 아니다. 엇갈렸죠.

# 입퇴장
전종혁 / 인카 / 수원님이 들어왔습니다.
김덕호 / KB / 대전님이 나갔습니다.

# 미디어 (메시지 내용이 "사진", "이모티콘", "동영상")
[이해철/프라임/부산] [오후 5:47] 사진

# 오픈채팅봇 환영 메시지 (노이즈, 필터링 대상)
[오픈채팅봇] [오후 5:38] 📚 한 발 앞서가는 설계사...
```

## 구현 요구사항

### 1. kakao_parser.py — txt 파서
- 입력: .txt 파일 경로
- 출력: 구조화된 메시지 리스트 (JSON)
- 각 메시지: `{"date": "2025-12-03", "time": "17:46", "user": "이해철/프라임/부산", "content": "...", "type": "message|photo|emoticon|video|join|leave"}`
- 멀티라인 메시지 올바르게 병합
- 오픈채팅봇 메시지 필터링
- 입퇴장 메시지 분리
- 닉네임에서 메타데이터 파싱: `이름/회사/지역` 형태 → `{"name": "이해철", "company": "프라임", "region": "부산"}`

### 2. knowledge_extractor.py — 지식 추출 엔진
- 파싱된 메시지를 "대화 스레드"로 묶기 (질문 → 답변 체인)
  - `#궁금증` 태그가 있는 메시지 = 질문 시작점
  - 시간 간격 기반 스레드 분리 (30분 이상 gap = 새 스레드)
- 각 스레드를 LLM(Gemini-2.0-flash)으로 분석:
  - 주제 분류: 보상/고지의무/약관/상품/기타
  - 핵심 질문 추출
  - 핵심 답변/결론 추출
  - 관련 키워드 태깅
  - 신뢰도 평가 (전문가 답변 vs 일반 의견)
- 출력: wiki_entries.json

### 3. wiki_entry 포맷
```json
{
  "id": "kakao-001",
  "title": "안저 광응고술의 수술 해당 여부",
  "category": "보상",
  "subcategory": "수술 판정",
  "question": "안구 뒤가 찢어져 레이저로 지진 경우(안저 광응고술), 수술로 고지해야 하는지?",
  "answer": "레이저를 이용한 광응고술도 수술약관에 명시되어 수술에 해당. 따라서 고지 대상.",
  "expert": "이해철/프라임/부산",
  "source_date": "2025-12-03",
  "source_chat": "앞서가는설계사",
  "keywords": ["광응고술", "수술", "고지의무", "안저", "레이저"],
  "confidence": "high",
  "raw_thread": ["원본 메시지1", "원본 메시지2", ...]
}
```

### 4. CLI 인터페이스
```bash
# 파싱만
python3 -m kakao_knowledge parse /path/to/kakao.txt --output parsed.json

# 지식 추출
python3 -m kakao_knowledge extract parsed.json --output wiki_entries.json

# 전체 파이프라인 (파싱 + 추출)
python3 -m kakao_knowledge pipeline /path/to/kakao.txt --output wiki_entries.json
```

### 5. 테스트
- kakao_parser 단위 테스트: 메시지 파싱, 멀티라인 병합, 닉네임 파싱, 노이즈 필터링
- knowledge_extractor 단위 테스트: 스레드 분리, 카테고리 분류
- 샘플 데이터 통합 테스트

## Gemini API 호출 방법
```python
import google.generativeai as genai
import os
genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))
model = genai.GenerativeModel("gemini-2.0-flash")
```
GEMINI_API_KEY는 `/home/jay/workspace/.env.keys`에 있음.

## 주의사항
- 대화 내용에 개인정보(이름, 회사, 지역) 포함 — wiki_entry에는 전문가명만 저장, 일반 참여자 이름은 익명화
- LLM 호출 비용 최적화: 스레드 단위로 배치 처리, 노이즈(인사/이모티콘/사진) 제거 후 호출
- pyright 에러 0건

## 완료 기준
1. kakao_parser.py가 샘플 txt를 정확히 파싱 (6,977+ 메시지 추출)
2. knowledge_extractor.py가 Q&A 스레드를 올바르게 추출
3. wiki_entries.json 생성 확인
4. 테스트 전체 PASS
5. CLI 동작 확인
