Telegram

Поиск по теме

Документация: v0.28.0

Найдите обсуждение в Telegram по смыслу: соберите беседы из локального архива, добавьте embeddings и ищите по теме прямо на своём компьютере.

tg conversations находит обсуждение по тому, о чём оно было. Пользуйтесь им, когда помните тему, но не слова: «где мы говорили об аренде квартиры?» найдёт разговор, в котором есть «жильё», «договор» и «залог». Для точных слов, людей, дат и файлов используйте поиск сообщений.

Это не поле поиска topic:, которое ограничивает поиск одной темой форума в группе Telegram. Здесь разговор — это то, что tg находит сам, в любом чате.

Поиск использует сообщения, которые tg уже сохранил. Графы и векторы по умолчанию строятся локально; удалённые провайдеры выбираются явно. Сначала загрузите историю: tg store fetch <chat> (Локальная база).

Что такое разговор

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

  • ответ относится к сообщению, на которое он отвечает;
  • сообщение, где кто-то упомянут по @username или по имени, относится к недавнему сообщению этого человека;
  • следующее сообщение человека в пределах нескольких минут продолжает его предыдущее.

Каждый разговор — список сообщений, от старых к новым. Он может пропускать сообщения между ними, которые относятся к другим разговорам. Правила лишь предполагают; они могут разбить одно обсуждение на два или объединить два. Ваш собственный ИИ-агент может связать то, что правила оставили открытым (ниже).

Сборка, векторы, поиск

tg conversations build --chat "Book club"        # find the conversations; again after fetching more
tg models text download e5-small                 # once: 135 MB, shared with max
tg conversations embed --chat "Book club"        # resumes where it stopped
tg conversations search "where do we meet" --chat "Book club"
tg conversations search "renting a flat"         # every chat you built
  1. Сборка находит разговоры чата. Новая сборка заменяет предыдущую, поэтому берите номер разговора из свежего list, а не запоминайте его.
  2. Векторизация превращает каждый разговор или каждую часть длинного разговора в вектор — список чисел, отражающий смысл текста. Тексты об одном и том же получают похожие векторы, даже если написаны другими словами или на другом языке.
  3. Поиск тоже превращает ваш вопрос в вектор и находит ближайшие разговоры. Он также ищет слова вопроса и ставит первыми разговоры, найденные обоими способами. Каждый результат сообщает, как он был найден: "by": ["meaning"], ["words"] или оба.

Без скачанной модели поиск всё равно работает и находит разговоры по словам; в ответе указано "meaning": "unavailable". Чат, который ни разу не собирали, в поиск не входит: сначала соберите его.

Смысловой запрос остаётся свободным текстом. --filter 'from:me date:7d' ограничивает разговоры до ранжирования: отдельное сообщение должно соответствовать всему строгому фильтру Lucene. По умолчанию область поиска — активный аккаунт; --source personal|bots|all|<provider> явно её расширяет. Результаты содержат источник и указатель на сообщение; --timezone выбирает часовой пояс календаря. Фильтр и источник нельзя сочетать с --refresh: сначала соберите и проиндексируйте нужные чаты. С локальной e5-small смысловые результаты требуют косинусного сходства больше 0,80; точные совпадения слов могут появиться и ниже этого порога. --sync-first загружает сообщения; --refresh локально собирает и векторизует.

Чтение найденного

tg conversations list --chat "Book club" --since-time 7d
tg conversations show 91                         # one conversation, oldest first
tg conversations show "Book club" 204            # the conversation message 204 is in
tg conversations related "Book club" 204         # other conversations about the same thing, in every chat
tg messages links "Book club" 204                # why that message is where it is

related использует векторы, сохранённые embed, и не запускает модель, поэтому отвечает быстро. Результат поиска — подсказка, а не ответ: откройте разговор и прочитайте сообщения, прежде чем на него полагаться.

Поддержание в актуальном состоянии

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

tg conversations status                          # what is behind, chat by chat
tg conversations build                           # every chat that changed, and groups never built
tg conversations embed                           # every built chat with pieces left
tg conversations search "renting a flat" --refresh   # catch up first, then search

status для каждого собранного чата считает сообщения, которых сборка не видела (новые, изменённые, удалённые), и части, вектор которых актуален, устарел или отсутствует, а также сколько групп ни разу не собирались. Без --chat команды build, embed и search --refresh обрабатывают не больше 20 чатов за запуск (--max-chats) и векторизуют не больше 2000 частей за запуск (--max-chunks); чтобы продолжить, запустите их снова. Модель они никогда не скачивают.

Когда в новой версии меняются правила, status и tg store check называют чаты, собранные по старым правилам; соберите их заново.

Результат с пометкой "stale": true получен из текста, который изменили после векторизации: его оценка относится к старому тексту. При удалении сообщения его текст удаляется и из векторов.

Пусть ваш ИИ-агент свяжет сообщения

Правила пропускают связи, которые видны только по смыслу. Ваш собственный ИИ-агент — тот, которым вы уже пользуетесь с tg, — может их добавить:

tg skill show link-conversations                 # the agent's instructions
tg conversations batches status --chat "Book club"   # how many messages and batches, how much text

Агент читает инструкцию, сообщает, сколько текста он прочитает, и ждёт вашего согласия. Затем он проходит чат пакетами (tg conversations batches next), решает, на какое более раннее сообщение отвечает каждое, и сохраняет ответ (tg conversations links add). Следующая сборка их использует. Сначала учитываются ответы, отмеченные в самом Telegram, затем связи агента, затем правила. tg conversations links clear --chat "Book club" удаляет ответы агента. В этой схеме, где работает агент, tg сам модель не вызывает. Можно ли сохранять ответы, решает разрешение профиля conversations.links.

Обычный build использует правила и сохранённые связи. tg conversations build --chat <chat> --analyze отправляет ограниченные пакеты на настроенные адреса, совместимые с OpenAI, или на Anthropic. Явный --chat обязателен. Команда сообщает объём, адрес и лимит токенов, затем запрашивает согласие; согласие запоминается для этих аккаунта, чата и провайдера до отзыва. По умолчанию — 50 сообщений в пакете и не больше 100 000 зарезервированных токенов за запуск; --yes даёт согласие в скриптах. tg conversations consents list перечисляет согласия; consents revoke --chat <chat> отзывает согласие. Встроенный анализ доступен только в CLI; ключи хранятся вне настроек.

Конфиденциальность и стоимость

По умолчанию ничего не покидает ваш компьютер. Модель работает здесь, и скачивается она только по вашему запросу:

tg models text list                              # the models, and which are downloaded
tg models text download embeddinggemma --accept-terms

e5-small используется по умолчанию: небольшая и быстрая, около 100 языков. embeddinggemma находит больше, но работает примерно в семь раз медленнее и скачивается только с --accept-terms, поскольку на неё распространяются условия Gemma от Google. Векторы двух моделей никогда не смешиваются: ищите той моделью, которой векторизовали.

На современном ноутбуке e5-small векторизует около 30 частей в секунду; группа из 100 000 сообщений занимает чуть больше 20 минут, один раз. Последующие запуски векторизуют только изменившееся.

Векторы может вычислять и внешний сервис с вашим собственным ключом:

tg models text key set openai
tg conversations embed --chat "Book club" --provider openai
tg conversations search "renting a flat" --provider openai

Тогда текст разговоров чата уходит этому сервису, а каждый поиск отправляет ваш вопрос. Перед отправкой embed сообщает, сколько частей, не больше скольких токенов и по какой максимальной цене, и ждёт вашего согласия (--yes в скриптах; --max-tokens задаёт лимит). --base-url принимает любой сервер с API эмбеддингов OpenAI, например Ollama или LM Studio на вашем компьютере, вместе с --model и --dims. tg models text key remove openai забывает ключ.

Для агентов

В MCP tg_conversations_list, tg_conversations_show, tg_conversations_search, tg_conversations_related и tg_conversations_status читают собранное; tg_conversations_refresh догоняет изменения на этом компьютере. MCP предоставляет tg_conversations_batches_status, tg_conversations_batches_next, tg_conversations_links_add, tg_conversations_links_clear и tg_conversations_build, а также готовый запрос link-conversations. Сообщите стоимость пакетов и получите согласие владельца до чтения пакетов. Сохранение связей требует conversations.links; после этого, в том числе после удаления связей, соберите чат заново. Настройки удалённых эмбеддингов также действуют на поиск через MCP и могут отправлять текст запроса. Техническая сторона — правила, части, векторы и ранжирование — описана на странице Как устроен поиск.