Поиск по теме
Документация: 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- Сборка находит разговоры чата. Новая сборка заменяет предыдущую, поэтому берите номер
разговора из свежего
list, а не запоминайте его. - Векторизация превращает каждый разговор или каждую часть длинного разговора в вектор — список чисел, отражающий смысл текста. Тексты об одном и том же получают похожие векторы, даже если написаны другими словами или на другом языке.
- Поиск тоже превращает ваш вопрос в вектор и находит ближайшие разговоры. Он также ищет
слова вопроса и ставит первыми разговоры, найденные обоими способами. Каждый результат сообщает, как он был
найден:
"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 isrelated использует векторы, сохранённые 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 searchstatus для каждого собранного чата считает сообщения, которых сборка не видела (новые, изменённые, удалённые), и
части, вектор которых актуален, устарел или отсутствует, а также сколько групп ни разу не собирались. Без
--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-termse5-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 и могут отправлять текст запроса.
Техническая сторона — правила, части, векторы и ранжирование — описана на странице
Как устроен поиск.