Как работает семантический поиск по заметкам

semantic-search

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

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

Где ломается поиск по ключевым словам

Обычный поиск разбивает заметки на слова и сравнивает с ними запрос, иногда со стеммингом («релизы» находит «релизом») и нечётким поиском на случай опечаток. Он быстрый и предсказуемый, но в основе это сравнение строк: в запросе и в заметке должны быть одни и те же слова.

Заметки для этого — худший случай. Их пишут быстро, теми словами, что пришли в голову, и никто не следит за единой терминологией. Одно и то же понятие в четырёх заметках, написанных в четырёх разных настроениях, называется «авторизация», «логин», «вход» и «сессия». Чтобы найти свою же заметку, приходится угадывать, какие слова вы выбрали тогда. Это проверка памяти, хотя заметки нужны как раз затем, чтобы ничего не держать в голове.

Как работает семантический поиск

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

Весь механизм от начала до конца:

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

  2. Запрос. Ваш поисковый запрос превращается в вектор так же.

  3. Сопоставление. Система находит сохранённые векторы, ближайшие к вектору запроса, и возвращает эти заметки, отсортированные по близости.

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

От поиска к ответам

Когда у заметок есть эмбеддинги, вторая возможность достаётся почти даром: генерация с опорой на найденное (retrieval-augmented generation, RAG). Вместо списка подходящих заметок система находит самые релевантные, передаёт их языковой модели, и та составляет ответ со ссылками на исходные заметки.

Так «найти документы» превращается в «задать вопрос». Функция Спросите свои заметки в Notez работает именно так: спросите «что я писал про фокус и глубокую работу?», и она найдёт нужные заметки во всём хранилище и ответит со ссылками на источники. Источники важны: ответ, который можно проследить до ваших заметок, можно проверить, а голый ответ — нет.

Где семантический поиск слаб

Честно об ограничениях, чтобы не ждать лишнего:

  • Точные строки. Код ошибки, название флага или идентификатор ищутся по ключевым словам. Хорошие системы используют оба способа: Notez на каждый запрос запускает и поиск по ключевым словам, и семантический и объединяет результаты (как это устроено, описано в посте о гибридном поиске). А если вы знаете точную строку, ищите точную строку.

  • Очень короткие заметки. В заметке из трёх слов модели эмбеддингов почти не за что ухватиться. Найти её всё равно можно, просто преимущество поиска по смыслу здесь меньше.

  • Полнота вероятностная. При ранжировании по ближайшим соседям нужная заметка обычно наверху, но не гарантированно всегда. Для справки, в которую вы заглядываете каждую неделю, избранное или ссылка надёжнее любого поиска.

Что это меняет в организации заметок

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

Разумное разделение труда:

  • Записывайте без церемоний. Пишите заметку теми словами, какие придут в голову. Название, выбор папки и теги не обязательны: семантический поиск найдёт заметку по содержанию.

  • Теги — для перечисления, а не для поиска. Теги оправдывают себя, когда нужны все заметки одного вида: всё с тегом research, каждая заметка 1on1. «Все X» — ровно то, чего ранжирование по сходству не гарантирует.

  • Ссылки — для структуры. Явные ссылки между заметками (и обратные ссылки, которые из них получаются) хранят связи, которые поиск сам не выведет: это решение появилось из того обсуждения.

  • То, что открываете каждый день, добавьте в избранное. Для пяти главных заметок навигация лучше поиска.

Нужно ли это на практике

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

Читайте также