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ą:
- 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:
- 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 |
|---------------------|-----------|---------------|--------|
| 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
Brak komentarzy.