MAX

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

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

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

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

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

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

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

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

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

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

Построить, посчитать векторы, искать

max conversations build --chat "Книжный клуб"   # найти разговоры; ещё раз — после того, как скачано больше
max models text download e5-small               # один раз: 135 МБ, общая папка с tg
max conversations embed --chat "Книжный клуб"   # продолжает с места, где остановился
max conversations search "где встречаемся" --chat "Книжный клуб"
max conversations search "аренда квартиры"      # во всех построенных чатах
  1. Build находит разговоры чата. Новый build заменяет прошлый, поэтому номер разговора берите из свежего list, а не храните.
  2. Embed превращает каждый разговор или каждый кусок длинного в вектор — набор чисел, который передаёт смысл текста. У текстов об одном и том же векторы похожи, даже если слова другие или язык другой.
  3. Search превращает в вектор и ваш вопрос и находит ближайшие разговоры. Ещё он ищет слова вопроса и ставит выше разговоры, найденные обоими способами. У каждого результата сказано, как он найден: "by": ["meaning"] (по смыслу), ["words"] (по словам) или оба.

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

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

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

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

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

Свежесть

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Для агентов

В MCP max_conversations_list, max_conversations_show, max_conversations_search, max_conversations_related и max_conversations_status читают построенное, а max_conversations_refresh догоняет на этом компьютере. Через MCP агент получает инструкцию link-conversations, оценивает объём инструментом max_conversations_batches_status и ждёт согласия владельца для этого чата. Затем читает max_conversations_batches_next, сохраняет ответы через max_conversations_links_add и перестраивает граф через max_conversations_build. max_conversations_links_clear удаляет ответы агента; после него граф также нужно перестроить. Запись требует conversations.links. Настройка внешних векторов действует и на MCP-поиск: вопрос отправляется выбранному сервису. Техническая сторона — правила, куски, векторы и порядок результатов — на странице как устроен поиск.