텔레그램 채널과 봇을 아우르는 글로벌 의미 검색 구축하기
개발자가 수백만 개의 텔레그램 계정 데이터를 크롤링하고 처리해 의미 검색용 데이터베이스를 구축했다. 이 프로젝트는 중급 이상 엔지니어를 대상으로 한 14개 마이크로서비스 아키텍처를 갖추고 있으며, 핵심은 설명문, 메시지, 프로필 사진의 하이브리드 검색이다. 필터 설정 없이도 원하는 정보를 정확히 찾을 수 있다.
Common Crawl(16TB 인덱스)에서 수집한 250만 개 이상의 고유 사용자명을 홈 PC에서 스트리밍 처리해 단 1주일 만에 완료했다. 최종 결과: 80만 개 채널, 12만 4천 개 그룹, 9만 4천 개 봇. 추가적으로 공개 디렉토리와 설명문 내 링크를 활용해 데이터를 보강했다.
데이터 크롤링
정규표현식 기반 사용자명을 활용한 회전형 프록시를 통한 크롤링. 저장된 데이터에는 다음이 포함된다:
- 이름, 설명문, 프로필 사진(CDN 링크 캐싱)
- 페이지네이션 없이 최근 10~15개 메시지(메시지 유형, 텍스트; 평균 길이: 530자)
전달된 메시지는 처리 대기열에 등록된다. 메시지 유형 통계:
- 순수 텍스트
- 이미지 + 설명문
- 드물게: 송장, 연락처
봇의 경우, MTProto(grammers)를 통해 ResolveUsername + GetFullUser API를 이용해 설명문과 명령어를 가져온다. ResolveUsername의 호출 제한 때문에 주의가 필요하다.
예외 처리 사례:
- CDN 500 에러 발생 (예: @magiskcnshare) — 3회 시도 후 건너뜀
- 빈 메시지 (@vlad_shoky_drum_school)
- 큰 프로필 사진 (3.5MB, 예: @vip_labels) — Axum 한도를 4MB로 증가시킴
이미지 처리
프로필 사진에 대한 의미 검색은 캡셔닝(텍스트 기반) 방식을 사용했으며, 다중 모달 임베딩 대신 실험적 접근을 취했다.
100만 장 이미지 처리 옵션 및 비용 비교:
| 모델 | 가격($) | 토큰/이미지 | 상태 |
|-------|-----------|--------------|--------|
| GPT-4o mini (저해상도) | 138 | 85 | 비용 높음 |
| Gemini 2.5 Flash-Lite | 26 | 낮음 | 배치 API 불안정 |
| Gemma 3 4B (vast.ai) | ~$0.24/일 | - | 선택: RTX 4090, 100만 장 24시간 내 처리 |
Gemma 3 4B는 Roboflow 캡셔닝 벤치마크에서 7위를 차지한 오픈소스 모델로, 로컬 실행 가능. 재생성은 OpenRouter를 통해 ($15/100만 장) 수행 가능.
데이터베이스 및 검색
테스트한 옵션:
- Postgres + pg_vector: 익숙하지만 하이브리드 검색 수동 구성이 복잡함
- Elasticsearch: 강력하지만 메모리 소모 큼 (자바 기반)
최종 선택: ParadeDB (Postgres 18 기반, Elasticsearch 유사 검색). 도커 이미지 업데이트 중 UNIQUE 인덱스 중복으로 덤프 실패 발생. 해결책: 일간 pg_dump 백업으로 롤백.
하이브리드 검색: 키워드 매칭 + 벡터(의미) 검색 조합.
임베딩 생성
text-embedding-3-large(0.13$/M 토큰) 테스트 후, 100만 문서 × 4,000자씩 처리 시 비용이 $130 이상으로 과도해짐. 대체로 bge-m3(다국어, MTEB 벤치마크 선두)로 전환.
OpenAI API로 12,000개 임베딩 생성: $0.03. 백만 단위 확장은 OpenRouter를 활용.
핵심 성과:
- 설명문과 메시지의 의미적 맥락을 반영한 80만 개 이상의 채널 인덱싱 완료
- Gemma 3 4B 캡셔닝: 저비용·고정확도
- ParadeDB는 자바 스택 없이도 하이브리드 검색 가능
- 봇은 MTProto 활용 (이용약관 위험 있으나, 공개 데이터만 접근)
- 전달된 메시지를 통한 지속적인 데이터 성장
이 프로젝트는 크롤링 → 처리 → 벡터 검색까지 완전한 엔드투엔드 파이프라인을 보여준다. 대규모 데이터(수백만 레코드) 처리 능력을 입증한 포트폴리오용 프로젝트로 적합하다.
— Editorial Team
아직 댓글이 없습니다.