LearningCollector: AI Chat 제목 추출 방식 개선 및 불필요 코드 제거
이번 커밋에서는 AI Chat 데이터를 수집할 때 제목을 추출하는 방식을 개선했습니다. 기존에는 마크다운 파일 내용에서 `#`으로 시작하는 첫 번째 줄을 제목으로 사용했지만, 이 방식에서 한글 깨짐 현상이 발생하는 문제를 발견했습니다. 이를 해결하기 위해 제목 추출 로직을 파일명 기반으로 변경하고, 불필요해진 관련 메서드를 제거했습니다.
LearningCollector: AI Chat 제목 추출 방식 개선 및 불필요 코드 제거
이번 커밋에서는 AI Chat 데이터를 수집할 때 제목을 추출하는 방식을 개선했습니다. 기존에는 마크다운 파일 내용에서 #으로 시작하는 첫 번째 줄을 제목으로 사용했지만, 이 방식에서 한글 깨짐 현상이 발생하는 문제를 발견했습니다. 이를 해결하기 위해 제목 추출 로직을 파일명 기반으로 변경하고, 불필요해진 관련 메서드를 제거했습니다.
요약
이번 작업은 core/ai_chat_collector.py 파일에서 AI Chat 대화 제목을 추출하는 로직을 수정하는 것을 중심으로 진행되었습니다. 기존의 마크다운 내용에서 # 헤더를 파싱하여 제목을 추출하는 방식 대신, 파일명 자체를 대화 제목으로 사용하도록 변경했습니다. 이 과정에서 제목 추출 관련 메서드(_extract_title)를 제거하고, JSON 데이터 구조도 간소화하여 총 13줄의 코드를 삭제하고 1줄의 코드를 추가했습니다. 커밋은 2026년 2월 3일에 이루어졌습니다.
배경 및 목적
AI Chat 서비스(Claude)에서 export한 대화 데이터를 수집하고 저장하는 과정에서, 마크다운 파일 내의 제목을 추출할 때 한글이 깨지는 현상이 발생했습니다. 이는 사용자에게 명확한 대화 제목을 제공하는 데 방해가 되었습니다. 따라서 이 문제를 해결하고, 더 안정적이고 간결한 제목 추출 방식을 도입하기 위해 이번 작업이 필요했습니다. 목표는 1) 한글 깨짐 문제를 해결하고, 2) 데이터 구조를 단순화하며, 3) 불필요한 코드 로직을 제거하여 전체적인 코드 품질을 향상시키는 것이었습니다.
구현 내용
주요 변경사항은 AI Chat 데이터를 처리하는 core/ai_chat_collector.py 파일의 _process_md_file 메서드 내에서 발생했습니다.
주요 변경사항 상세 설명
- 제목 추출 방식 변경: 기존에는 마크다운 파일 내용의 첫 번째
#헤더를 읽어대화_제목으로 사용했습니다. 이제는file_title변수(파일명을 기반으로 생성된 제목)를대화_제목으로 직접 사용하도록 변경되었습니다. _extract_title메서드 제거: 마크다운 파일 내용에서 제목을 추출하던_extract_title메서드가 더 이상 필요 없어짐에 따라 삭제되었습니다.- JSON 데이터 구조 간소화:
ai_chat_data딕셔너리에서 중복되는파일_제목필드를 제거하고,대화_제목필드에 파일명 기반 제목을 할당하도록 변경했습니다.
변경된 파일 목록
core/ai_chat_collector.py
추가/삭제된 코드 라인 수
- 추가 라인: 1
- 삭제 라인: 13
핵심 코드 설명
# 기존 코드 (일부 발췌)
- # 대화 제목 추출 (첫 번째 # 제목)
- title = self._extract_title(content)
-
# Exported 시간 추출
exported_time = self._extract_exported_time(content)
# ...
# JSON 데이터 생성
ai_chat_data = {
- "대화_제목": title,
- "파일_제목": file_title, # 파일명 기반 제목 추가
+ "대화_제목": file_title, # 파일명 기반 제목 사용
"모든_대화_내용": conversation,
"Exported_시간": exported_time,
"AI_종류": ai_type,
# 삭제된 _extract_title 메서드
- def _extract_title(self, content: str) -> str:
- """마크다운에서 제목 추출"""
- lines = content.split("\n")
- for line in lines:
- if line.startswith("# "):
- return line[2:].strip()
- return "제목 없음"
위 코드를 보면 _extract_title 메서드가 완전히 삭제되었고, ai_chat_data 딕셔너리에서 title 변수와 파일_제목 필드가 제거된 것을 확인할 수 있습니다. 대신 대화_제목에 file_title이 직접 할당되었습니다.
기술적 의사결정
선택한 기술/라이브러리
이 작업에서는 Python의 기본 문자열 처리 기능과 pathlib 모듈을 사용했습니다. 별도의 외부 라이브러리 도입 없이 기존의 코드를 수정하고 제거하는 방식으로 진행되었습니다.
선택 이유
- 단순성: 파일명은 이미 문자열로 존재하므로, 복잡한 파싱 로직 없이 바로 사용할 수 있습니다. 이는 코드의 단순성을 높이고 이해하기 쉽게 만듭니다.
- 안정성: 마크다운 내부의
#헤더 파싱은 마크다운 포맷팅의 다양한 변수(예: 공백, 빈 줄)에 의해 오류가 발생하거나 예상치 못한 결과를 낼 수 있습니다. 파일명은 상대적으로 일관성이 높아 더 안정적인 제목 소스로 간주할 수 있습니다. - 기존 코드 활용:
file_title변수는 이미 파일명을 기반으로 생성되어 있었기에, 이를 재활용하는 것이 효율적이었습니다. - 문제 해결: 한글 깨짐 문제는 마크다운 파싱 시 인코딩 문제나 특정 라이브러리의 처리 방식에 따라 발생할 수 있었습니다. 파일명 자체를 사용함으로써 이러한 외부 요인에 영향을 덜 받게 됩니다.
다른 대안 및 비교
- 마크다운 파싱 라이브러리 사용:
markdown이나mistune과 같은 라이브러리를 사용하여 마크다운 문서를 파싱하고 제목을 추출하는 방법도 고려할 수 있었습니다.- 장점: 더 정교한 마크다운 구조를 이해하고 제목을 추출할 수 있습니다.
- 단점: 새로운 라이브러리 의존성이 생기고, 간단한 제목 추출을 위해 과도한 복잡성을 더할 수 있습니다. 또한, 라이브러리 자체의 인코딩 처리 방식에 따라 여전히 문제가 발생할 가능성이 있었습니다.
- 정규 표현식 사용: 파일 내용 전체를 대상으로 정규 표현식을 사용하여
#으로 시작하는 줄을 찾는 방식입니다.- 장점: 외부 라이브러리 없이 구현 가능합니다.
- 단점: 마크다운 파싱 라이브러리 사용과 유사하게, 다양한 마크다운 변이로 인해 예상치 못한 결과가 나올 수 있습니다. 또한,
_extract_title메서드와 본질적으로 크게 다르지 않아 근본적인 한글 깨짐 문제를 해결하기 어려웠을 수 있습니다.
결론적으로, 이번 상황에서는 파일명 기반 제목 사용이 가장 간단하고 안정적으로 문제를 해결할 수 있는 방법이라고 판단했습니다.
배운 점 및 개선점
배운 점
- 외부에서 가져온 데이터의 특정 속성(예: 파일명)이 내부 데이터 구조의 일부(예: 제목)를 대체할 수 있을 정도로 충분히 유용하고 안정적일 수 있다는 것을 배웠습니다.
- 복잡한 파싱 로직보다는 데이터의 근원을 더 단순하고 안정적인 방식으로 활용하는 것이 코드의 견고성을 높이는 데 도움이 된다는 것을 다시 한번 느꼈습니다.
- 특정 인코딩 문제나 라이브러리 호환성 문제를 겪을 때, 다른 대안(예: 다른 데이터 소스 활용)을 모색하는 것이 중요함을 알았습니다.
앞으로 개선할 점
- AI Chat 데이터를 export하는 다양한 서비스(예: ChatGPT, Perplexity 등)에 대한 수집 로직을 확장할 때, 각 서비스별로 최적의 제목 추출 방식을 고민해야 할 것입니다.
- 만약 파일명 기반 제목이 사용자에게 충분히 설명적이지 않다고 판단될 경우, 메타데이터나 추가적인 로직을 통해 제목을 보강하는 방안을 고려할 수 있습니다.
다음 단계 계획
이번 커밋으로 AI Chat 데이터 수집의 안정성이 향상되었습니다. 다음 단계로는 다른 AI 서비스의 데이터를 수집하는 기능을 구현하거나, 현재 수집된 데이터의 활용도를 높이기 위한 기능(예: 검색, 필터링)을 추가하는 작업을 진행할 계획입니다.
참고 자료
- Claude AI Code Export Format (https://claude.ai/code/session_01Mkiaar9ge8euuWTXGTvddF) - (커밋 메시지에 포함된 링크)