Powrót do strony głównej

Wyszukiwanie semantyczne Telegram: scraping i embeddingi

Artykuł opisuje stworzenie wyszukiwania semantycznego po milionach kont Telegram. Użyto scraping Common Crawl, captioning Gemma 3 4B dla awatarów i ParadeDB do wyszukiwania hybrydowego. Projekt obejmuje MTProto dla botów i embeddingi bge-m3.

Globalne wyszukiwanie semantyczne po Telegram: 2,5 mln kont
Advertisement 728x90

Realizacja globalnego wyszukiwania semantycznego w kanałach i botach Telegrama

Rozwój projektu obejmuje bazę milionów kont Telegrama, zrealizowaną poprzez skrapowanie i przetwarzanie danych dla wyszukiwania semantycznego. Projekt składa się z infrastruktury składającej się z 14 mikroserwisów, przeznaczonej głównie dla specjalistów poziomu middle/senior. Głównym celem jest hybrydowe wyszukiwanie oparte na opisach, wiadomościach i awatarach bez konieczności ręcznej konfiguracji filtrów.

Zbierano ponad 2,5 mln unikalnych nazw użytkownika z Common Crawl (16 TB indeksu, przetwarzane przez strumieniowanie na domowym PC w ciągu tygodnia). Weryfikowanych: 800 tys. kanałów, 124 tys. grup, 94 tys. botów. Dane uzupełniono o publiczne katalogi oraz linki zawarte w opisach.

Skrapowanie danych

Skrapowanie odbywa się za pomocą rotujących proxy dla weryfikowanych nazw użytkownika (wyrażenia regularne). Zapisywane są:

Google AdInline article slot
  • Imię, opis, awatar (konsolidacja CDN).
  • Ostatnie 10–15 wiadomości bez paginacji (typ, tekst; średnia długość tekstu — 530 znaków).

Przesyłane wiadomości są dodawane do kolejki. Statystyka treści:

  • Tekst bez mediów.
  • Obraz z podpisem.
  • Rzadko: faktura, kontakt.

Dla botów wykorzystano MTProto (grammers): ResolveUsername + GetFullUser do pobrania opisu w rozmowie i komend. Limity dla ResolveUsername wymagają ostrożności.

Obsługa przypadków krawędziowych:

Google AdInline article slot
  • Awatary z błędem 500 CDN (np. @magiskcnshare) — pominięcie po 3 próbach.
  • Puste wiadomości (@vlad_shoky_drum_school).
  • Awatar 3,5 MB (@vip_labels) — zwiększenie limitu w Axum do 4 MB.

Przetwarzanie obrazów

Wyszukiwanie semantyczne po awatach realizowane jest poprzez captioning (tekst zamiast multimodalnych embeddów – do celów eksperymentalnych).

Opcje i koszty za 1 mln obrazów:

| Model | Cena ($) | Tokeny/obraz | Status |

Google AdInline article slot

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

| GPT-4o mini (niska rozdzielczość)| 138 | 85 | Drogo |

| Gemini 2.5 Flash-Lite| 26 | Niskie | API w partiach niestabilne |

| Gemma 3 4B (vast.ai) | ~0,24/dzień | - | Wybrano: RTX 4090, 1 mln w 24 h |

Gemma 3 4B (7. miejsce w benchmarku Roboflow Captioning) — open-source, lokalny uruchomienie. Regeneracja: OpenRouter (15$/mln).

Baza danych i wyszukiwanie

Przetestowane:

  • Postgres + pg_vector: doświadczenie istnieje, ale hybrydowe wyszukiwanie trudne do ręcznej implementacji.
  • Elasticsearch: funkcjonalność, ale wysokie wymagania RAM (Java).

Wybór: ParadeDB (wyszukiwanie typu Elastic na Postgres 18). Problem przy aktualizacji obrazu Docker — duplikaty w indeksach UNIQUE, awaria dumpera. Rozwiązanie: powrót do kopii zapasowej (pg_dump codziennie).

Hybrydowe wyszukiwanie: słowa kluczowe + wektorowe (semantyczne).

Generowanie embeddów

Dla botów przetestowano text-embedding-3-large (0,13$/M token), ale kosztowne przy 1 mln dokumentów po 4000 znaków (>130$). Przejście na bge-m3 (wielojęzyczny, MTEB-benchmark).

OpenAI API dla 12 tys. embeddów — 0,03$. Skalowanie do milionów przez OpenRouter.

Co ważne:

  • Zbierano ponad 800 tys. kanałów z semantyką opartą na opisach i wiadomościach.
  • Captioning awatarów za pomocą Gemma 3 4B — tanio i precyzyjnie.
  • ParadeDB do hybrydowego wyszukiwania bez stosu Java.
  • MTProto dla botów (ryzyko naruszenia ToS, ale tylko dane publiczne).
  • Regularny wzrost bazy dzięki przesyłanym wiadomościom.

Projekt prezentuje pełny pipeline end-to-end: skrapowanie → przetwarzanie → wyszukiwanie wektorowe. Idealny do prezentacji w CV (Big Data na milionach wierszy).

— Editorial Team

Advertisement 728x90

Czytaj dalej