← Блог

Семантический поиск по Telegram: мой second brain из чатов

Сережа Рис · 26 January 2026

telegramragsqlite-vec

Вася три месяца назад скинул решение бага с async — помню точно. В каком из 47 чатов — уже нет.

Пробовал Ctrl+F: “async”, “await”, “баг”. Telegram выдал 200+ совпадений. Половина — про что угодно, только не то. Стандартный поиск ищет слова. Мне нужен смысл.

Идея

Что если искать не по словам, а по смыслу? “Деплой”, “выкатить на прод”, “залить на сервер” — для меня одно и то же. Для Ctrl+F — три разных запроса.

Написал агенту:

Сделай поиск по моим чатам в Telegram. Хочу писать “то решение с concurrent requests” — и находить нужное сообщение, даже если там слов “concurrent” нет.

Агент объяснил: нужны эмбеддинги. Текст превращается в вектор — набор чисел. Похожие по смыслу тексты оказываются рядом в этом пространстве. Математика, не магия.

Первая попытка

За час агент собрал рабочую версию. Скачивание сообщений, генерация эмбеддингов, поиск по похожести.

Запустил синхронизацию на ночь. 50 чатов, 60 дней истории.

В 2 ночи проснулся от уведомления. Telegram выдал FloodWait на 2 часа — API заблокировано за слишком частые запросы. Скрипт качал без пауз.

Исправление

Telegram забанил за спам. Добавь random задержки между запросами — не фиксированные, а случайные. И обработку FloodWaitError: если словили — ждём сколько сказали плюс запас.

Перезапустил. За ночь синхронизировал всё — ни одного бана.

Ещё одна ошибка

Поиск работал странно. Выдавал не самые похожие результаты.

Оказалось, агент использовал стандартный SQL синтаксис, а sqlite-vec требует особый. Указал явно в промпте — исправил за минуту.

Результат

Теперь пишу запрос в терминале — нахожу именно то сообщение от Васи. Секунда вместо 15 минут скроллинга.

Запросы, которые работают:

15 тысяч сообщений, эмбеддинги сгенерировались за 10 минут. $0.02 — text-embedding-3-small дешёвый.

Что понял про процесс

Первая версия будет сломана. Telegram API, sqlite-vec синтаксис — агент не знает всех особенностей. Но он быстро чинит, когда объясняешь что не так.

Конкретные ошибки → конкретные фиксы. “Telegram забанил за спам” полезнее чем “добавь rate limiting”. Агент понимает контекст.

Простой стек побеждает. sqlite-vec — один файл, нет сервера. Бэкап = копирование файла. Pinecone красивый, но зачем для 15k сообщений?

Если хочешь попробовать

Начни с малого. Один чат, 100 сообщений. Убедись что поиск работает. Потом масштабируй.

Модель универсальная — тот же подход работает для Slack, Discord, Email, заметок в Obsidian. Источник данных меняется, принцип тот же: скачал → эмбеддинги → поиск.


Источники

Подписаться на обновления — @sereja_tech