Skip to content

topic search

github-actions[bot] edited this page Oct 15, 2026 · 1 revision

Поиск по темам

Вы помните, что в чате что-то обсуждали, но не помните, какими словами. Поиск по темам находит такое обсуждение по смыслу. Спросите «где мы говорили про аренду квартиры?» — и он найдёт разговор, в котором были «сдаю», «залог» и «хозяйка», даже если слов «аренда квартиры» никто не написал. Он работает и между языками: вопрос по-русски находит обсуждение на английском или испанском.

Прочитав эту страницу, вы сможете подготовить чат к поиску по темам, задавать вопросы своими словами, читать результаты и понимать, когда лучше подходит обычный поиск по словам. Поиск по темам использует только сообщения, которые max уже сохранил на этом компьютере, поэтому сначала скачайте историю: max personal messages sync <чат> (скачать историю чата).

Термины этой страницы:

  • Разговор — одно обсуждение внутри чата. В оживлённой группе идут сразу несколько разговоров, и их сообщения перемешаны. max разделяет их; разговор — список сообщений, которые относятся друг к другу, от старых к новым.
  • Кусок — короткая часть разговора, около 1200 знаков. Длинный разговор режется на куски, чтобы каждый был примерно об одном.
  • Вектор — набор чисел, который передаёт смысл текста. У текстов об одном и том же векторы похожи, даже если слова или язык другие.
  • Модель — небольшая программа, которая превращает текст в вектор. По умолчанию она работает на вашем компьютере.

Поиск по темам — не поле topic: поиска сообщений. topic: оставляет одну ветку обсуждения. Разговор здесь — то, что max находит сам, в любом чате.

Что можно сделать

Задача Команда
Найти обсуждение по теме — в одном чате или во всех подготовленных max personal search conversations "<вопрос>"
Посмотреть разговоры чата, новые сверху max personal conversations list <чат>
Прочитать один разговор от начала до конца max personal conversations show <id>
Открыть весь разговор, в котором есть сообщение max personal conversations show <чат> <сообщение>
Найти другие разговоры о том же, во всех чатах max personal conversations related <чат> <сообщение>
Ограничить результат человеком, периодом или словом max personal search conversations "<вопрос>" --filter '<запрос>'
Узнать, что устарело, и догнать max personal conversations status, max personal search conversations "<вопрос>" --refresh
Попросить своего ИИ-агента точнее связать сообщения max skill show link-conversations

Поиск по темам или поиск по словам?

Поиск по словам (max personal search messages) Поиск по темам (max personal search conversations)
Что вы помните точные слова, имя, дату, файл только о чём шла речь
Что находит отдельные сообщения с вашими словами целые разговоры о вашем вопросе
Другие слова о том же нет: «квартира» не найдёт «жильё» да
Другие языки нет да, около 100 языков у модели по умолчанию
Точные условия (отправитель, дата, файл, ссылка) да, весь язык запросов да, через --filter
Подготовка скачать историю скачать историю, затем build и embed
Обращается к MAX да, при поиске в одном названном чате нет, читает только этот компьютер

Поиск по словам — когда вы помните слово, число, имя или файл. Поиск по темам — когда помните тему, но не формулировку, когда обсуждение растянуто на много коротких сообщений или когда писали на другом языке. Если не уверены, начните с поиска по темам: он ищет и ваши слова, поэтому разговор с ними всё равно окажется вверху.

Попробуйте

Подготовьте чат один раз, а потом задавайте сколько угодно вопросов.

Ваш запрос ИИ-агенту:

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

Что происходит по шагам:

max personal messages sync "Книжный клуб"                  # 1. скачать историю, если её ещё нет
max personal conversations build --chat "Книжный клуб"   # 2. разделить чат на разговоры
max personal models text download e5-small               # 3. один раз: скачать модель, 135 МБ, общая с tg
max personal conversations embed --chat "Книжный клуб"   # 4. посчитать вектор каждого куска
max personal search conversations "где встречаемся" --chat "Книжный клуб"   # 5. спросить
max personal conversations show 91                       # 6. прочитать найденный разговор

Шаги 2–4 выполняются на вашем компьютере и к MAX не обращаются. embed продолжает с места, где его прервали. Следующим вопросам нужен только шаг 5; когда повторять шаги 2 и 4, сказано в разделе Свежесть.

Пример результата (вымышленный):

0.874  91  2026-09-14 18:02–18:40  23 messages · 4 people · from message 4180  (messages 4185–4192)  msg:max/500/7/4185
0.851  64  2026-08-02 10:15–10:31  9 messages · 3 people · from message 3302  (messages 3302–3310)  msg:max/500/7/3302

Найденное — подсказка, а не ответ: откройте разговор и прочитайте сообщения, прежде чем на него опираться.

Как это работает

У поиска по темам три этапа. Первые два готовят чат один раз; третий выполняется на каждый вопрос.

1. Build: разделить чат на разговоры

max personal conversations build читает сохранённые сообщения чата от старых к новым и для каждого решает, какое прежнее сообщение оно продолжает. ИИ не используется, к MAX команда не обращается. Связи берутся в таком порядке:

  1. Ответы самого MAX. Сообщение, отправленное ответом, относится к сообщению, на которое отвечает.
  2. Ответы вашего агента, если вы попросили агента связать чат (ниже).
  3. Упоминание. Сообщение, где кого-то упомянули, относится к последнему сообщению этого человека. Упоминание — это @username, упоминание, отмеченное мессенджером, или сообщение, которое начинается с имени пользователя и двоеточия или запятой (anna: согласна). max смотрит назад не дальше 50 сообщений.
  4. Тот же человек пишет снова. Следующее сообщение человека продолжает его предыдущее, если пришло в пределах 5 минут и последних 10 сообщений.

Сообщение без связи начинает новый разговор. Разговор может пропускать сообщения между своими, если те из других разговоров. Правила угадывают: они могут разбить одно обсуждение на два или склеить два в одно. Новый build заменяет прошлый, поэтому номер разговора берите из свежего list, а не храните.

2. Embed: превратить каждый кусок в вектор

max personal conversations embed режет каждый разговор на куски около 1200 знаков, по границам сообщений. Каждая строка куска — «отправитель: текст». Сообщение длиннее куска делится на части внахлёст, чтобы модель прочитала всё длинное сообщение, а не только начало. Сообщения без текста ничего не добавляют. Затем модель превращает каждый кусок в вектор, и max его сохраняет. Сам текст куска второй раз не сохраняется — только вектор и отпечаток, по которому видно, что текст изменился.

3. Search: по смыслу и по словам одновременно

max personal search conversations ищет ваш вопрос двумя способами и объединяет результаты:

  • По смыслу. Вопрос тоже превращается в вектор. max сравнивает его с векторами всех кусков и оценивает каждый разговор по его самому близкому куску. У модели по умолчанию e5-small совпадение по смыслу должно быть достаточно близким: оценка сходства выше 0,80 по шкале, где 1 — тот же смысл.
  • По словам. max ищет и каждое слово вопроса в сохранённых сообщениях. Слово из трёх и более букв находит и более длинные слова, которые с него начинаются (встреч найдёт «встречаемся»). Опечатки не исправляются.

Разговор, найденный обоими способами, стоит выше найденного одним. У каждого результата сказано, как он найден: "by": ["meaning"] (по смыслу), ["words"] (по словам) или оба. Без скачанной модели поиск всё равно работает, только по словам, и в ответе тогда "meaning": "unavailable". Чат, который ни разу не построен, не просматривается: сначала build.

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

Техническая сторона — правила, куски, векторы и порядок результатов — на странице как устроен поиск.

Посмотреть найденное

В терминале каждый результат — одна строка:

  • оценка сходства, или —, если нашли только по словам;
  • номер разговора, когда он начался и кончился, сколько сообщений и людей, его первое сообщение;
  • (messages 4185–4192) — кусок, совпавший лучше всего (или сообщение, если нашли только по словам): с него и начинайте читать;
  • ссылка на сообщение (msg:…), которую принимают max personal messages show и max personal messages context;
  • stale, если текст изменили после подсчёта вектора: оценка — для старого текста.

С --json то, что поиск не смог просмотреть по смыслу, — записи в missing: модель не скачана, векторы устарели, чат ни разу не построен или не скачан. Рядом в next — команда, которая это исправит, например conversations embed --chat <чат>; аккаунты — в meta.accounts.

max personal conversations list "Книжный клуб" started_at>=7d
max personal conversations show 91                       # один разговор, от старых к новым
max personal conversations show "Книжный клуб" 204       # разговор, в котором сообщение 204
max personal conversations related "Книжный клуб" 204    # другие разговоры о том же, во всех чатах
max personal messages links "Книжный клуб" 204           # почему сообщение там, где оно есть

related берёт векторы, которые сохранил embed, и модель не запускает, поэтому отвечает быстро. Это поиск только по смыслу.

Примеры

Тему помните, слова — нет.

max personal search conversations "кто берёт еду на пикник"

Поиск идёт во всех подготовленных чатах. Он может найти разговор, где писали «я возьму бутерброды» и «у Бори напитки», — поиск по словам его бы пропустил.

Обсуждали на другом языке.

max personal search conversations "аренда квартиры" --chat "Valencia expats"

С моделью по умолчанию так находится и обсуждение на испанском — про «piso».

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

max personal search conversations "бюджет поездки" --filter 'from:"Алиса Тестова" date:30d'
max personal search conversations "условия договора" --filter 'has:file' --timezone Europe/Madrid

Начать с одного сообщения. Вы нашли сообщение поиском по словам и хотите всё остальное на эту тему:

max personal search messages '"вернули залог" chat:"Valencia expats"'
max personal conversations related "Valencia expats" 5120

Искать и в чатах ботов. По умолчанию поиск по темам идёт в текущей учётной записи. --source personal, bots, all или название мессенджера расширяют охват; тогда у каждого результата сказано, из какой учётной записи он.

max personal search conversations "задержка доставки" --source all

Скачать новое перед вопросом. --sync-first сначала скачивает новые сообщения — в пределах чата, времени и числа сообщений, как у поиска сообщений.

max personal search conversations "где встречаемся" --chat "Книжный клуб" --sync-first

Свежесть

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

max personal conversations status                         # что отстало, по чатам
max personal conversations build                          # все изменившиеся чаты и группы, ни разу не построенные
max personal conversations embed                          # все построенные чаты, где остались куски
max personal search conversations "аренда квартиры" --refresh   # сначала догнать, потом искать

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

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

Когда сообщение удаляют, его текст уходит и из векторов.

max personal messages sync <чат> --catch-up может сразу после скачивания построить разговоры чата и посчитать векторы (скачать историю чата).

Связать сообщения поможет ваш агент

Правила не видят связей, которые понятны только по смыслу. Их может добавить ваш собственный ИИ-агент (например, Claude Code, Codex, Cursor или Gemini CLI):

max skill show link-conversations                     # инструкция для агента
max personal conversations batches status --chat "Книжный клуб"   # сколько сообщений и пачек, сколько текста

Агент читает инструкцию, говорит, сколько текста прочитает, и ждёт вашего «да». Потом он берёт чат пачками (max personal conversations batches next), решает, на какое прежнее сообщение отвечает каждое, и сохраняет ответ (max personal conversations links add). Следующий build его учитывает: сначала идут ответы самого MAX, потом связи агента, потом правила. max personal conversations links clear --chat "Книжный клуб" убирает ответы агента; после этого постройте чат снова. В этом процессе сам max модель не вызывает. Сохранять ответы разрешает право профиля conversations.links.

max может и сам отправить пачки сервису моделей. Обычный build использует правила и сохранённые связи; max personal conversations build --chat <чат> --analyze передаёт ограниченные пачки настроенному OpenAI-совместимому сервису или Anthropic. Нужен явный --chat. Перед первой передачей команда показывает объём, адрес и предел токенов и спрашивает согласие; оно сохраняется для учётной записи, чата и выбранного сервиса до отзыва. По умолчанию пачка — 50 сообщений (--size), предел резерва — 100 000 токенов за запуск (--max-tokens); --yes даёт согласие в скриптах. max personal conversations consents list показывает согласия, consents revoke --chat <чат> отзывает их. Встроенный анализ доступен только из командной строки, не через MCP; ключи не записываются в файл настроек.

Приватность и цена

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

max personal models text list                             # модели и какие скачаны
max personal models text download embeddinggemma --accept-terms

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

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

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

max personal models text key set openai
max personal conversations embed --chat "Книжный клуб" --provider openai
max personal search conversations "аренда квартиры" --provider openai

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

Дальше

Clone this wiki locally