홈으로 돌아가기

Telegram 시맨틱 검색: 스크래핑 및 임베딩

이 기사는 수백만 Telegram 계정에 걸친 시맨틱 검색 생성을 설명합니다. Common Crawl 스크래핑, 아바타 Gemma 3 4B 캡셔닝 및 ParadeDB 하이브리드 검색 사용. 프로젝트에는 봇용 MTProto와 bge-m3 임베딩이 포함됩니다.

Telegram의 전역 semsearch: 2.5M 계정
Advertisement 728x90

텔레그램 채널과 봇을 아우르는 글로벌 의미 검색 구축하기

개발자가 수백만 개의 텔레그램 계정 데이터를 크롤링하고 처리해 의미 검색용 데이터베이스를 구축했다. 이 프로젝트는 중급 이상 엔지니어를 대상으로 한 14개 마이크로서비스 아키텍처를 갖추고 있으며, 핵심은 설명문, 메시지, 프로필 사진의 하이브리드 검색이다. 필터 설정 없이도 원하는 정보를 정확히 찾을 수 있다.

Common Crawl(16TB 인덱스)에서 수집한 250만 개 이상의 고유 사용자명을 홈 PC에서 스트리밍 처리해 단 1주일 만에 완료했다. 최종 결과: 80만 개 채널, 12만 4천 개 그룹, 9만 4천 개 봇. 추가적으로 공개 디렉토리와 설명문 내 링크를 활용해 데이터를 보강했다.

데이터 크롤링

정규표현식 기반 사용자명을 활용한 회전형 프록시를 통한 크롤링. 저장된 데이터에는 다음이 포함된다:

Google AdInline article slot
  • 이름, 설명문, 프로필 사진(CDN 링크 캐싱)
  • 페이지네이션 없이 최근 10~15개 메시지(메시지 유형, 텍스트; 평균 길이: 530자)

전달된 메시지는 처리 대기열에 등록된다. 메시지 유형 통계:

  • 순수 텍스트
  • 이미지 + 설명문
  • 드물게: 송장, 연락처

봇의 경우, MTProto(grammers)를 통해 ResolveUsername + GetFullUser API를 이용해 설명문과 명령어를 가져온다. ResolveUsername의 호출 제한 때문에 주의가 필요하다.

예외 처리 사례:

Google AdInline article slot
  • CDN 500 에러 발생 (예: @magiskcnshare) — 3회 시도 후 건너뜀
  • 빈 메시지 (@vlad_shoky_drum_school)
  • 큰 프로필 사진 (3.5MB, 예: @vip_labels) — Axum 한도를 4MB로 증가시킴

이미지 처리

프로필 사진에 대한 의미 검색은 캡셔닝(텍스트 기반) 방식을 사용했으며, 다중 모달 임베딩 대신 실험적 접근을 취했다.

100만 장 이미지 처리 옵션 및 비용 비교:

| 모델 | 가격($) | 토큰/이미지 | 상태 |

Google AdInline article slot

|-------|-----------|--------------|--------|

| 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

Advertisement 728x90

다음 읽기