LINUX.ORG.RU
ФорумTalks

Семантический поиск по Telegram

 ,


2

4

Пока в соседней теме срач про замедление Telegram, мой самый большой персональный проект (14 микросервисов) подошёл к чекпойнту, когда его уже можно показать публике. Это всё ещё ранняя Beta и много идей не реализовано, не судите строго. Также, так как сайт за CloudFlare, то методы доступа к нему не сильно отличаются от самого Telegram.

https://semagram.io/ - семантический поиск по Telegram

Под капотом более миллиона публичных Telegram каналов на нескольких десятков языков (2/3 на русском), сто пятьдесят тысяч публичных чатов и больше ста тысяч ботов (последним особенно горжусь, с учётом суммарного MAU ботов >560M мой каталог может претендовать на звание самого большого из публично существующих обходя findmini.app с 493M суммарного MAU ботов).

Поиск работает по эмбеддингам вычисленным на основе юзернейма, имени и аватарки канала, а также 10 последних текстовых сообщений. Для чатов, очевидно, сообщения в поиске не участвуют, потому что кто мне их даст. А для ботов, напротив, добавляется сообщение из пустого диалога и список команд.

Специфика семантического поиска в том, что вы не найдёте то, что можно и так найти в самом Telegram (например, канал по точному имени или юзернейму). Найти можно то, что в Telegram найти нельзя. Например, «чат для руссковорящих жителей Франции» (0 результатов во встроенном поиске). Чем длиннее и детальнее запрос, тем интереснее результат.

Проект обошёлся мне в 10$ на эмбеддинги, а также img2text, 16$ на прокси, 300 рублей на Telegram аккаунты (узнать список команд бота можно только через MTProto, увы) и 100$ на Claude (без него делал бы проект не 1 месяц, а 3). Ну и примерно 50 гигов на подкроватном сервере. А ещё огромное спасибо авторам pg_vector.

В общем, аудитории LOR представляется уникальная возможность попробовать сей инновационный сервис и обругать его, а также задать любые вопросы.

★★★★★

поздно. Не в плане что Телеграм придавливают, а просто Твиттер на этом вырос и соответственно подобное всё уже есть, для любых мессенджеров, давно и в больших продах.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Я очень старался, но не смог найти ни одного каталога с семантическим поиском. И tgstat, и telemetr обламываются на простейших запросах типа «канал с мемами», выдавая 3.5 канала по точному совпадению подстроки. А сервисы поменьше не могут выдать вообще ничего.

Ботов индексирует из крупняка только findmini.app и у них тоже нет семантического поиска, только категории и поиск по подстроке (а ещё моя БД больше).

Будет очень интересно посмотреть на реальных конкурентов, если я кого-то пропустил.

KivApple ★★★★★
() автор топика

Найти можно то, что в Telegram найти нельзя.

© (livelib.ru):
«Исхитрись-ка мне добыть
То-Чаво-Не-Может-Быть!
Запиши себе названье,
Чтобы в спешке не забыть!»

Почётную грамоту от царя KivApple’у! :)

И tgstat, и telemetr обламываются на простейших запросах

Семантический поиск сильно зависит от контекста, для него нужна семантическая сеть типа SNePS © (buffalo.edu).

quickquest ★★★★★
()
Последнее исправление: quickquest (всего исправлений: 1)

Специфика семантического поиска в том, что вы не найдёте то, что можно и так найти в самом Telegram (например, канал по точному имени или юзернейму)

Будешь искать канал по названию и не найдешь?

dmitry237 ★★★★★
()
Ответ на: комментарий от dmitry237

У каналов часто названия не отражают их содержание (по крайней мере в максимально прямом смысле).

Условно, будешь искать «Безвольные каменщики» найдёшь не канал Якутенко, а канал про стоительство.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

не смог найти ни одного каталога с семантическим поиском

скорее плохо старались. Хотя есть вариант что никому уже не нужно.

просто это (семантический, нечёткий поиск и обобщение по слабо-формализованным запросам) как раз то за что поочерёдно взлетали Google,Twitter,Facebook и теперь летают разные «ИИ». Ну не на рекламе-же ей богу:-) Данные собираются, якобы обезличиваются, хранятся, сжимаются, индексируются, прочая-прочая. Это конденсированные деньги.

лет 10-15 фича была встроена в терминалы информ.агенств, там действительно можно было ввести «с чёрта кукуруза дорожает и как это связано с популяцией пингвинов (см.Твитер и Фейсбук)».

Оно теперь зовётся «ИИ» потому что те люди это выбросили, потому-что получается красивая но х-ня. И в тех областях есть этому замена

наверняка можно строить подобные запросы через нынешние ИИ (их дофига уже) за сущие копейки.

MKuznetsov ★★★★★
()
Ответ на: комментарий от KivApple

Условно, будешь искать «Безвольные каменщики» найдёшь не канал Якутенко, а канал про стоительство.

Про строительство не нашел. Нашел вот этот и еще какой-то с таким же названием и 215 подписчиками.

Вы про этот?

Научный взгляд на привычное.
Обратная связь (там человек): @ask_kamenschiki_bot
dmitry237 ★★★★★
()
Ответ на: комментарий от quickquest

Я использую модель bge-m3 для генерации эмбеддингов, было бы больше денег мог бы использовать OpenAI large модель, она выдаёт лучше результат на ботах на моём https://tgbotmau.quoi.dev/catalog. Но одно дело генерировать 12к эмбеддингов и другое дело больше миллиона...

KivApple ★★★★★
() автор топика
Ответ на: комментарий от dmitry237

У меня на semagram.io по запросу «Безвольные каменщики» вылазит «Непростой Свободный», потом два канала на арабском, потом «Коттеджное рабство», потом что-то на немецком.

А вот по запросу типа «канал с исследованиями в области биологии человека» выдаётся всякое релевантное.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

У меня на semagram.io

Я искал в Telegram, в приложении. В семантическом поиске попытался найти «РИА», «Новости РИА» оказались во втором десятке.

dmitry237 ★★★★★
()

Добавил индикацию размера базы

KivApple ★★★★★
() автор топика

Реализовал алгоритм BM25 (благодаря ParadeDB/pg_search), теперь поиск умеет матчить и семантически, и по ключевым словам, и бустить популярные каналы/чаты/боты. Отзывы приветствуются.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Вызывал gemma 3 4b с промтом а-ля «опиши картинку»

А, это. Спасибо.

По img2text Гугл находит многочисленные средства OCR, я думал, речь про что-то из них.

question4 ★★★★★
()
Ответ на: комментарий от MoldAndLimeHoney

У меня есть главный сервис каталога каналов/чатов/ботов и вокруг него вертятся скраперы, которые получают из него таски, выполняют их и возвращают результат. Есть отдельный скрапер профилей с t.me, отдельный скрапер сообщений из превьюшек каналов с t.me, отдельный скрапер инфы о ботах через MTProto. Есть даже качалка картинок, но я её остановил, потому что не поспевает всё равно и пока непонятно что делать с картинками (была мысль считать эмбеддинги картинок через siglip и таким образом сделать чтобы поисковик лучше понимал контент каналов из одних картинок, но всё упирается в бюджет на прокси и хранилище).

Я могу запускать/останавливать скраперы разных видов, а также запустить их в несколько экземпляров на разных серверах для горизонтального масштабирования (но пока этим не воспользовался).

У некоторых скраперов есть Web UI, например, у MTProto скрапера я добавляю новые учётки для скрапинга через веб-интерфейс. Для удобства вход во все сервисы с Web UI идёт через OAuth 2.0.

Короче, деление на микросервисы тут нужно чтобы иметь возможность запустить кусок приложения на другом хосте.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от question4

Как я понял, сейчас OCR задачи тоже решают через LLM. Даже средненькая мультимодальная модель в high detail режиме ввода картинок выдаёт отличный результат распознания текстов.

На поверху многие рейтинги ИИ по OCR задачам оказываются бенчмарками general purpose LLM.

В моём же случае я не гонюсь за высокой детализацией, потому что на аватарках максимум 1-2 слова написаны.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)

Я лично не испытывал какого-то недостатка в поиске Телеграма. Когда знаешь, что ищешь, то перебирая ключевые слова, всё равно публичное найти можно, хоть и не всегда сразу.

Но вот чего, мне кажется, может не хватать, это аналога поисковых систем по Телеграму, чтобы индексировались сообщения публичных каналов. Насколько я понял, ваш проект это не охватывает, да и я сам ввёл пару запросов и не увидел ничего полезного. Интерфейс напоминает нейросетевую выдачу «напиши хтмл-структуру для выдачи списка постов с превьюшкой»

Найти можно то, что в Telegram найти нельзя

Сомневаюсь. Даже если идентичным запросом найти нельзя, то изменив запрос, скорее всего получится найти.
Поиск по последним 10 сообщениям мне кажется совсем бесполезным.

vvvv
()

О, а проконсультируй меня по использованию LLM для поиска. Я хочу поиск похожих на l.o.r сделать более умным чем сейчас. Идея взять что-то вроде paraphrase-multilingual-MiniLM-L12-v2, нагенерить векторов для текстов всех топиков и потом искать похожие через k-NN в OpenSearch.

Правильный это путь или нет?

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Я сам дилетант в вопросе.

Я использовал bge-m3 модельку для генерации эмбеддингов. Она стоит 0.01$ за 1M токенов на OpenRouter. Если не нужен риалтайм (например, для первоначального наполнения базы), можно арендовать виртуалку с RTX 4090 на vast.ai. Тогда цена падает до примерно 0.001$ за 1М токенов (средняя цена при условии многочасовой неприрычной загрузки модельки).

В моём случае речь шла о примерно 1000М токенов на всё. Виртуалку гонял 8 часов подряд (при этом у меня были иногда глюки ingestion pipeline, которые приводили к не полной загрузке обработчика) по 0.28$ в час. Соответственно вышло менее 2.5$.

Для paraphrase-multilingual-MiniLM-L12-v2 скорость генерации будет примерно в 4 раза выше. Соответственно, 1000M токенов выйдет в примерно 0.6$. А вот на OpenRouter её нет.

Чтобы прикинуть точнее нужен эстимейт размера базы ЛОР хотя бы в символах.

Храню в pg_vector, использую для запросов hnsw индекс. Для 1.5 миллионов строк, векторов длинной 1024 получается 150-200мс на запрос из 40 результатов на моём MeLe Quieter 4C (Intel N100, 16 ГБ ОЗУ, NVMe SSD, процесс Postgres после прогрева жрёт около 10 ГБ ОЗУ).

С ElasticSearch не работал, потому что предполагаю, что он будет жрать больше ОЗУ, чем Postgres, а у меня ограничены ресурсы.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от vvvv

Поиск по сообщениям возможен, но для этого нужна какая-то монетизация, потому что проект выйдет из разряда «прикольный пет-проект жрущий 20-30$ в месяц на содержание» и речь пойдёт уже о паре сотне баксов в месяц с потенциалом роста по мере наполнения БД сообщениями.

Тут нужно и сервер арендовать нормальный (сейчас всё вертится у меня дома на MeLe Quieter 4C с 16 ГБ ОЗУ 512 ГБ SSD и Intel N100 вместо процессора), и больше трафика проксей для скрапинга.

Я специально ограничил хранение сообщений 10 последними, потому что иначе БД слишком быстро росла и по моим расчётам место на диске кончилось бы через 1-2 месяца. В данном случае 10 последних сообщений нужны для того чтобы семантический поиск понимал в общих чертах о чём канал, потому что данные из профиля могут вообще ничего не говорить о содержимом (взять тот же «Лентач» - понять его тематику по одному описанию не зная бренд физически невозможно, а ИИ не знает бренды).

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от KivApple

Тогда хотелось бы:

  • пару чекбоксов для фильтрации групп и каналов.
  • сортировку по количеству подписчиков или участников групп.
dataman ★★★★★
()
Ответ на: комментарий от dataman

Семантический поиск, по моим тестам, неплохо фильтрует по типу (т. е. по запросам типа «бот чтобы блаблабла», «канал с блаблабла» в выдаче 90% ботов и каналов, соответственно, потому что в embedding document включен тип объекта). Пробовал включать «бот»/«канал»/«чат» в поисковый запрос?

Количество подписчиков уже фактор бустинга в гибридном поиске (при похожей релевантности приоритет получит тот кто популярнее). Но без гарантий.

«Advanced Search» для более тонкого контроля, конечно, в планах. Спасибо за подтверждение, что это нужная фича))

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 2)

100 это лимит api backend’а просто? Разделение на страницы есть? Я не смог пройти рекапчу после подмены параметра на 1000

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от anonymous_sama

Это лимит в том числе запроса в БД. Нельзя просто так взять и найти 1000 результатов отсортированных по векторам. 40 результатов ищутся 200 мс, 100 результатов уже 500 мс. 1000 сам догадаешься. Поэтому у API есть ограничение на некое разумное число результатов. Пагинация не решит проблему, так как limit ... offset ... всё равно должен найти все строки. Я сэкономлю лишь на JOIN при извлечении метаданных, но это не главная нагрузка.

На текущем железе сотня - баланс между производительностью и полезностью.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

я не гонюсь за высокой детализацией, потому что на аватарках максимум 1-2 слова написаны.

А картинки, которые постят? Моя первая мысль была, что это нужно для скриншотов с текстами и подписей на фотографиях.

Как я понял, сейчас OCR задачи тоже решают через LLM.

tesseract пользуется и старым движком, и LLM, получается неплохо, но есть куда расти. Поэтому интересуюсь. Главный недостаток LLM в тессеракте — дообучение требует очень много времени, как я понял из документации — только CPU, не предусмотрена поддержка ни CUDA, ни чего-либо ещё.

question4 ★★★★★
()
Ответ на: комментарий от KivApple

Пока что думаю если кому-то хочется это продать, а не просто как пет проект, то нужно решить эту проблему при презентации демо подвинуть лимиты намного. Так как думаю это будет первый запрос, типо а дай мне 40000 тысяч каналов по крипте или финансам. Ибо 100 каналов это вообще не продающая цифра, такое количество и ручками можно собрать.

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 1)

А ещё огромное спасибо авторам pg_vector.

Ещё посмотри на Groonga 14.0.7. Её можно скомпилировать с поддержкой llama.cpp, вдруг пригодится.
В Debian, кстати, Groonga без llama.cpp.

dataman ★★★★★
()

Один чувак предложил сделать API для AI агентов с оплатой через x402. Добавил с ценой за 0.01 USDC за запрос. Может какой-нибудь OpenClaw подсосётся к моему сайту, но не особо надеюсь

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 2)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)