- 필자는 텍스트 임베딩을 활용하여 4천만개 이상의 Hacker News 게시물과 댓글을 분석하는 프로젝트를 진행함
- 프로젝트의 주요 목표는 향상된 검색, 추천, 분석 기능을 구현하는 것이었음
- 이를 위해 Hacker News API를 이용해 데이터를 수집하고, 웹 페이지 크롤링을 통해 추가 컨텍스트를 확보함
- 수집한 데이터를 기반으로 텍스트 임베딩을 생성하고, 이를 UMAP을 이용해 2D 공간으로 매핑함
- 매핑된 데이터를 기반으로 인터랙티브한 "Hacker News Universe" 맵을 제작함
- 또한 임베딩을 활용하여 의미론적 검색, 자동 가상 커뮤니티, 인기도/감정 분석 등의 기능을 구현함
- 대규모 데이터 처리를 위해 GPU 클러스터를 활용하고, 사용자 경험 개선을 위해 엣지 서버를 배포함
Hacker News 데이터 수집
- Hacker News API를 이용해 4천만개 이상의 게시물과 댓글 데이터를 수집함
- API 응답이 느려 병렬 처리를 위해 Node.js 기반 서비스를 구현함
- 게시물 점수는 -1 미만으로 내려가지 않으며, 댓글 점수는 API로 확인할 수 없음
- 일부 게시물과 댓글은 제목과 본문이 비어있음 (아마도 중재자에 의해 수정된 것으로 추정)
- 댓글 ID가 부모 댓글보다 작은 경우도 있음 (중재자가 댓글 트리를 이동시킨 것으로 추정)
텍스트 임베딩 생성
- 제목만으로는 게시물을 의미론적으로 표현하기에 충분하지 않아, 웹 페이지 크롤링을 통해 추가 컨텍스트를 확보함
- 텍스트 임베딩 생성에는 고성능 GPU가 필요하며, 4천만개 입력을 처리하는데 1년 가까이 걸릴 수 있음
- RunPod를 이용해 저렴한 가격에 GPU 클러스터를 구성하고, db-rpc와 queued를 개발해 분산 처리 효율을 개선함
- 150개 GPU를 동원해 몇 시간만에 4천만개 텍스트의 임베딩을 생성함
웹 페이지 크롤링으로 추가 컨텍스트 확보
- 게시물 제목만으로는 임베딩 품질이 좋지 않아, 링크된 웹 페이지를 크롤링해 추가 컨텍스트를 확보함
- Rust로 크롤러를 구현해 Node.js 버전 대비 10배 빠른 성능을 달성함
- 많은 링크가 깨져있어 (link rot) 인터넷 아카이브의 API를 이용해 복구함
- 최종적으로 4백만개 중 5% 미만의 페이지만 가져오지 못함
개선된 텍스트 임베딩 생성
- 웹 페이지 전체를 입력으로 사용하기 위해 jina-embeddings-v2-small-en 모델로 전환
- 컨텍스트가 부족한 게시물은 상위 댓글을 추가해 보완
- 댓글은 계층 구조를 고려해 조상 댓글까지 포함시켜 입력을 구성함
UMAP을 이용한 차원 축소
- UMAP을 이용해 1024차원 임베딩을 2차원 공간으로 차원 축소함
- 차원 축소를 위해서는 PyNNDescent 그래프와 원본 임베딩이 필요함
- 고차원 백만개 입력을 처리하는데 96코어 CPU에서 1시간 반 정도 소요됨
- 차원 축소 결과, 관심사나 인기도 분포가 시각화됨
코사인 유사도
- 임베딩 간 유사도 계산에는 코사인 거리가 많이 사용됨
- 코사인 거리는 벡터 간 각도 차이를 나타내며, 유클리드 거리와 달리 벡터 크기에 영향받지 않음
- 이는 텍스트 유사도 계산에 적합한데, 길고 강렬한 토론이라도 주제가 유사하면 가깝게 매핑되어야 하기 때문
- 코사인 유사도 계산은 행렬 곱셈으로 간단히 구현 가능
Hacker News Universe 맵 제작
- 임베딩을 기반으로 Google Map과 유사한 인터랙티브한 Hacker News 맵을 제작함
- 확대/축소시 보이는 포인트 개수 조절, 일부 점에 라벨링, 클릭시 상세 정보 표시 등의 기능 지원
- 수백만개 점을 브라우저로 한번에 전송하기에는 무리가 있어, 타일링과 LOD를 이용해 점진적 로딩 구현
- 타일 당 최대 1500개 점을 담아 크기를 20KB 이하로 유지하고, 지역별 밀도를 고려해 다양성 확보
- 웹앱은 Canvas와 WebWorker를 이용해 구현하고, 지도 기능은 Google Map을 참고해 유사하게 구현함
시각적 효과 추가
- 실제 지도처럼 랜드마크, 경계, 지형 등을 추가해 몰입감과 방향 감각을 개선함
- 포인트 밀도에 따라 명암 등고선을 그려 HN에서 관심이 많은 영역을 표현함
- 가우시안 블러로 부드러운 등고선을 그리고, SVG로 변환해 깨짐없는 벡터 이미지로 출력함
- 대표적 주제를 나타내는 "도시"를 추가해 특정 영역으로의 안내 기능을 제공함
검색 기능 테스트
- 의미론적 임베딩 기반 검색은 키워드 검색에 비해 관련성이 높고 다양한 결과를 보여줌
- 질문 형태의 쿼리도 잘 이해하며, 정확히 일치하는 단어가 없어도 유사한 주제를 찾아냄
- HN 게시물의 높은 품질 덕분에 검색 결과도 통찰력 있고 유용한 정보들이 많이 노출됨
- 결과 랭킹에는 관련도 외에도 게시물 점수와 시간 가중치를 활용해 신뢰도와 신선도를 고려함
자동 가상 커뮤니티 생성
- 키워드로 가상의 커뮤니티를 만들어 관심사에 맞는 게시물 모음을 즉석에서 볼 수 있음
- 게시물뿐 아니라 관심사와 관련된 논의가 활발한 댓글도 함께 살펴볼 수 있음
- 특정 주제에 대해 영향력 있고 활발히 활동하는 사용자도 파악 가능함
- 사전 필터링 대신 사후 필터링을 활용하면 계산 비용을 크게 줄일 수 있음
대규모 데이터 분석
- 오픈소스 감정분석 모델을 이용해 3천만개 댓글의 긍정/부정 감정을 분류함
- 토픽의 감정을 시계열로 분석하면 주요 이벤트에 따른 변화를 관찰할 수 있음
- 유사도와 점수를 활용해 토픽 간 인기도 비교도 가능함
- 쿼리 계산 속도 개선을 위해 GPU를 활용한 행렬 연산을 적용하고 처리 속도를 크게 향상시킴
향후 계획
- 실시간 데이터 업데이트 지원
- 딥러닝 기반 추천 시스템 개발
- 재순위화 모델을 통한 검색 품질 개선
- 사용자 분석 강화 (유사도, 전문성 등)
- 커뮤니티 의견 수렴을 통한 추가 개선 아이디어 발굴
GN⁺의 의견
- 이 프로젝트는 대규모 데이터를 효과적으로 수집, 정제, 분석하는 과정을 잘 보여주는 사례임. 특히 병렬 처리와 GPU 활용 등 성능 최적화 기법이 인상적임.
- 텍스트 임베딩과 UMAP을 조합해 게시물 간 유사도를 시각화한 Hacker News 맵은 아주 창의적이고 흥미로운 결과물임. 사용자가 관심 주제를 탐색하고 새로운 정보를 발견하는데 큰 도움이 될 것 같음.
- 의미론적 검색과 자동 커뮤니티 생성 기능은 Hacker News 이용 경험을 한 차원 높일 수 있는 혁신적인 아이디어임. 단순 키워드 매칭을 넘어 문맥과 의도를 파악하는 검색 기술이 일반 사용자에게 더 확산되길 기대함.
- 대규모 실시간 데이터 처리 파이프라인 구축이 관건일 것 같음. 엣지 컴퓨팅, 인메모리 DB 등 성능 병목 해소 방안을 면밀히 검토해야 할 것임.
- 신뢰도 높은 HN 데이터 특성상 감정 분석 결과도 충분히 활용 가치가 있어보임. 다만 알고리즘 편향성에 주의하고, 도메인 특화 학습도 고려해 볼만 함.