LINUX.ORG.RU
ФорумTalks

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

 ,


4

5

Пока в соседней теме срач про замедление 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)
Ответ на: комментарий от KivApple

Я использую модель bge-m3

У qwen доступны офигительные ембеддингы по апи. Самый шик сейчас мультимодальные ембеддинги, можно сразу работать с картинками, не переводя в текст.

У тебя только вектора? Или ещё графы делал? Реренкинга тоже нет, как я понял?

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

Реранкинг есть. Я сливаю вместе семантический поиск, по ключевым словам и учитываю популярность результата.

С картинками лажа, что я физически не могу их ни качать ни хранить (они прибывают быстрее, чем я их качаю). Нужен совсем другой бюджет. Если когда-нибудь будет какая-нибудь успешная монетизация хотя бы чтобы покрывать расходы, то в планах поиск по картинкам.

Графы пока не делал, кроме того что я нахожу новые каналы по репостам (вижу репост из незнакомого канала - добавляю в очередь на скрапинг, в день добавляется несколько тысяч).

Есть идея сделать граф репостов.

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

Задача взять на себя весь поиск ТГ, каждый день парсить и загружать новую инфу, для того чтобы сделать семантический поиск без явной идеи манитизации – довольно сложно и амбициозно.

mamina_radost
()

- Улучшил алгоритм поиска. Теперь он удаляет пробелы из запроса, склеивает результат и пытается найти такую подстроку в юзернеймах как дополнительный фактор поиска и ранжирования. Таким образом теперь работают запросы типа «Modular bot» (находит @modularbot) в то же время как остальные запросы работают как раньше.

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

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

Я bge-m3-en-ru на проце кручу, они же очень маленькие и быстрые, если на проце крутить сильно долго выходит?

И мне не понятно, почему телега сам не прикрутит семантический поиск. Вообще я думал что его уже везде прикрутили.

KillTheCat ★★★★★
()

Добавил возможность ограничить поиск одним языком. Если добавить в запрос «lang:ru», то отобразятся только результаты на русском. Если добавить в запрос «lang:en», то отобразятся только результаты на английском. И так далее.

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

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

Добавил бота https://t.me/SemagramBot для поиска не выходя из Телеграмм (поддерживается и диалоговый режим, и Mini App)

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

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

Прежде всего от RAG/векторных искалок уже тошно, каждый китайский школьник перед поступлением в институт обязан сделать LLM-RAG поисковик и выложить его в своём блоге.

И ладно бы эти искалки давали что-то уровня способностей ChatGPT/Grok/Gemini/Perplexity — так нет же ж, простые сравнения эмбеддингов приводят к неисправимой неточности, то есть, один этап поиска будет сравнивать общие категории, независимо от потребностей ищущего.

Эту проблему решают через разные агентные ухищрения. Например, всё-таки делают вызов точных искалок (аля «grep») для поиска точной подстроки (анализаторпользовательского запроса, на БЯМ или без, нужен для того, чтобы этот самый точный запрос сформулировать). Или делают агентные циклы «поискали по категориям, просеяли найденный мусор, уточнили-углубили поиск» — и так по кругу.

Но и даже если всё это сделать, мы приходим к финальному боссу современных мессенжеров — это закрытые группы. На самом деле Twitter/X уже де-факто является полузакрытой платформой, поиск на которой для простого смертного доступен исключительно через Grok. А реалии современного интернета такие, что в публичном сегменте тусуются на 99.9% школьники и маркетологи.

В общем, тема интересная, но даже наполовину не раскрытая.

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

Semagram использует гибридный поиск - эмбеддинги лишь один из факторов ранжирования, есть и ранжирование по ключевым словам, и по популярности, а это всё объединяется через BM25 реализованный на базе ParadeDB (pg_search).

В Telegram боте есть режим ИИ агента, который имеет возможность дёргать поисковую ручку несколько раз за запрос, прежде чем выдать ответ.

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

Telegram

Поздно. Месяца полтора как заблокирован.

Короче теперь этот проект - ненужно.

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