Семантический поиск устроен так: документы режутся на фрагменты, каждый фрагмент и каждый запрос превращаются в набор чисел, который называется вектором, и система показывает фрагменты, чьи векторы ближе всего к вектору запроса. Он лучше обычного поиска, когда человек спрашивает своими словами, а в документе то же самое сказано иначе. Он хуже, когда нужно найти точный код, артикул или номер договора.
Поэтому честный ответ на вопрос «заменить ли старый поиск» обычно такой: не заменять, а соединить. Гибридный поиск использует оба подхода, а решение о составе принимается по проверке на ваших вопросах. Готовое решение под вашу базу документов описано на странице «Семантический поиск по документам», здесь — устройство и способы проверки.
Чем семантический поиск отличается от обычного
Обычный поиск, который называют полнотекстовым, ищет слова запроса в тексте с учётом форм слова. Он быстр, предсказуем и объясним: видно, какое слово совпало. Но он не знает, что «уволиться», «расторгнуть трудовой договор» и «подать заявление по собственному» — об одном и том же.
| Запрос | Обычный поиск | Семантический поиск | Что работает лучше |
|---|---|---|---|
| Точное название документа или номер договора | Находит по совпадению строки | Может подсунуть похожий по смыслу документ вместо нужного | Обычный |
| Артикул, код ошибки, номер версии | Находит, если написан без искажений | Числа и коды плохо передаются смыслом | Обычный |
| Вопрос своими словами: «как оформить выезд в командировку» | Ищет слова, которых в регламенте нет, и часто не находит | Сопоставляет вопрос с фрагментом «порядок направления в служебную поездку» | Семантический |
| Запрос на другом языке или с жаргоном | Слова не совпадают | Многоязычная модель связывает близкие по смыслу формулировки | Семантический, если модель подходит |
| Длинный описательный запрос | Результат определяют случайные редкие слова | Учитывается смысл всего запроса | Семантический |
| Фраза из документа целиком | Находит точно | Находит, но может поставить ниже похожих фрагментов | Оба, гибрид надёжнее |
Из таблицы видно, что противопоставление не работает: у каждого подхода свой тип запроса. Задача проекта — выяснить, каких запросов у вас больше, и собрать поиск под них.
Как устроен семантический поиск: шесть шагов
Поиск состоит из двух частей. Первая работает заранее и готовит документы, вторая отвечает на каждый запрос.
- Загрузка. Из файлов, почты, wiki и баз извлекается текст вместе с названием, автором, датой, версией и правами доступа. Сканы сначала проходят распознавание текста.
- Разбиение на фрагменты. Документ делится на куски, внутри которых мысль завершена. Фрагменту достаются метаданные документа.
- Эмбеддинги. Модель превращает каждый фрагмент в вектор, в котором близкие по смыслу тексты оказываются рядом.
- Индекс. Векторы и метаданные записываются в хранилище, которое умеет быстро находить ближайшие векторы.
- Запрос. Вопрос пользователя превращается в вектор той же моделью, из индекса достаются ближайшие фрагменты, применяются фильтры по правам и метаданным.
- Ранжирование и показ. Найденное сортируется, при необходимости проходит переоценку, и пользователь получает фрагменты со ссылкой на документ и страницу.
Именно эти шаги лежат в основе ответа «по документам» у языковой модели: перед ответом она получает найденные фрагменты. Эту схему целиком описывает статья «Как устроен RAG-пайплайн», а общую идею — статья «Что такое RAG». Семантический поиск — это та же схема без последнего шага генерации текста.
Разбиение на фрагменты: самое недооценённое решение
Результат поиска сильнее всего зависит не от модели, а от того, как порезаны документы. Слишком мелкие фрагменты теряют контекст: «срок — три рабочих дня» без указания, чего именно. Слишком крупные размывают смысл, и вектор описывает всё сразу, ничего конкретно.
- Границы по смыслу. Режем по заголовкам, разделам и пунктам, а не по числу знаков. Регламент делится по пунктам, договор по статьям, инструкция по шагам.
- Заголовок в каждом фрагменте. К тексту фрагмента добавляется путь «документ, раздел, пункт»: иначе фраза «срок — три дня» не отличается от десятка таких же.
- Таблицы отдельно. Таблица, разорванная по строкам, теряет шапку. Строки хранятся вместе с названиями столбцов или целиком.
- Перекрытие. Соседние фрагменты немного перекрываются, чтобы мысль на границе не потерялась.
- Тип документа. Политика, письмо и техническая спецификация режутся по-разному, поэтому правила разбиения задаются на каждый тип.
Как выбрать размеры, проверяется на ваших вопросах: делаем две-три схемы разбиения и сравниваем результат. Угадать заранее нельзя.
Эмбеддинги: какую модель брать и что с русским языком
Модель эмбеддингов определяет, что считается «близким по смыслу». Для русского языка подходят многоязычные модели и модели, обученные на русских текстах. Данные вашей предметной области — отдельный вопрос: в юридических, медицинских и технических текстах общая модель может путать близкие термины.
Практические правила выбора:
- Сравнивать две-три модели на одной выборке ваших вопросов, а не по таблицам рейтингов. Рейтинги составлены на чужих данных.
- Запрос и фрагмент у многих моделей кодируются по-разному: в запросе указывается его роль. Если это пропустить, качество падает без предупреждений.
- Модель запускается в вашем контуре. Для данных ограниченного доступа внешние сервисы эмбеддингов чаще не подходят по требованиям заказчика, поскольку вы отправляете наружу весь текст базы.
- Смена модели означает пересчёт всех векторов: векторы разных моделей несовместимы. Поэтому версию модели записывают в индекс, и переход планируется как отдельная работа.
Дообучать модель эмбеддингов на своих данных стоит, только если сравнение показало, что готовые модели стабильно промахиваются на ваших терминах. Чаще хватает добавить словарь терминов и улучшить разбиение.
Гибридный поиск и переранжирование
Гибридный поиск запускает оба поиска и объединяет результаты. Полнотекстовая часть ловит точные слова, коды и номера, векторная — вопросы своими словами. Оба списка сливаются правилом, которое проверяется на ваших вопросах.
| Приём | Что делает | Когда нужен | Цена |
|---|---|---|---|
| Гибрид | Объединяет результаты полнотекстового и векторного поиска | В базе есть и точные коды, и описательный текст | Два индекса вместо одного, настройка весов |
| Переранжирование | Вторая модель перечитывает верхушку выдачи вместе с запросом и сортирует точнее | Нужной выдачи не хватает наверху, а в первых позициях много похожего | Задержка на каждый запрос, ещё одна модель |
| Фильтры по метаданным | Ограничивают поиск по типу документа, дате, отделу, версии | Много версий и устаревших документов | Нужны чистые метаданные |
| Расширение запроса | Переформулирует короткий запрос или разбивает составной на части | Запросы пользователей короткие и неоднозначные | Добавляет вызов модели и возможность перекоса |
Не нужно включать всё сразу. Начинаем с гибрида и фильтров, переранжирование добавляем, если разбор ошибок показывает, что нужные фрагменты находятся, но стоят низко.
Права доступа и актуальность: то, что ломает поиск после запуска
Поиск по документам компании быстро упирается в два вопроса, которые не видны на демонстрации.
Права. Если сотрудник не может открыть документ, поиск не должен его показывать, ни целиком, ни фрагментом, ни в виде «найден документ, к которому у вас нет доступа». Права записываются в метаданные фрагмента, и фильтр применяется в момент запроса, до ранжирования. Проверка выполняется отдельным прогоном: пробуем из-под разных ролей достать закрытое. Когда права в источнике меняются, они должны обновляться в индексе, иначе уволенный или переведённый сотрудник продолжает видеть лишнее.
Актуальность. В базе почти всегда лежат старые редакции. Индекс хранит версию и статус документа, устаревшие редакции исключаются или явно помечаются. Новый документ попадает в индекс по событию или по расписанию, и регламент определяет, как быстро. Удалённый документ удаляется и из индекса: иначе поиск продолжает ссылаться на то, чего уже нет.
Обе проблемы относятся не к смыслу поиска, а к его эксплуатации. Поэтому в оценку проекта они входят отдельной строкой, а не «как-нибудь потом».
Как проверить поиск: набор вопросов с известными ответами
Единственный надёжный способ сравнить поиски — набор вопросов, для которых известно, в каком документе ответ. Собирается он до разработки и принадлежит вам, а не подрядчику.
| Что измеряем | Как считаем | Что показывает | Подвох |
|---|---|---|---|
| Попадание в первые результаты | Доля вопросов, для которых нужный фрагмент оказался в первых пяти или десяти результатах | Находит ли поиск вообще | Не показывает, на каком месте он стоит |
| Место нужного результата | Среднее по вопросам значение, обратное месту первого верного результата | Насколько высоко стоит нужное | Один плохой запрос сильно портит среднее, смотрим и по группам |
| Разбор по типам вопросов | Отдельно: точные коды, описательные вопросы, вопросы-сравнения | Где поиск проигрывает | Общая цифра скрывает слабые группы |
| Сравнение с текущим поиском | Те же вопросы, тот же способ подсчёта | Что поменяется для сотрудников | Нужен честный замер старого поиска, а не оценка по впечатлению |
| Проверка прав | Вопросы из-под разных ролей к закрытым документам | Не утекает ли недоступное | Прогон делается заново после каждого изменения прав |
Вопросы берутся из реальной жизни: журнала запросов старого поиска, обращений в поддержку, вопросов новичков. Хороший набор содержит и вопросы, на которые ответа в базе нет: поиск должен уметь сказать, что ничего не нашёл, а не выдавать ближайшее по смыслу. Порог, ниже которого результат не показывается, подбирается по этим вопросам, как в статье «Порог уверенности модели».
Где хранить векторы
Хранилище нужно, чтобы быстро находить ближайшие векторы и фильтровать по метаданным. Выбор определяется объёмом, нагрузкой и тем, что уже есть в вашей инфраструктуре.
- PostgreSQL с расширением pgvector. Подходит, когда база документов умеренная, а PostgreSQL у вас уже работает: одна система, одна копия, права и метаданные рядом.
- Специализированные хранилища. Qdrant и Weaviate разворачиваются у вас и дают больше возможностей для фильтров, гибридного поиска и больших объёмов, ценой ещё одной системы в эксплуатации.
- Облачные сервисы вроде Pinecone. Это внешние сервисы: векторы и метаданные хранятся у поставщика. Для данных ограниченного доступа они чаще не подходят по требованиям заказчика.
Начинать стоит с самого простого варианта, который проходит проверку на вашем наборе вопросов. Подробнее о том, что такое векторное хранилище и когда без него можно обойтись, — в статье «Векторные базы данных простыми словами».
Что делаем мы и с чего начать
Мы делаем один поиск для одной базы документов: например, регламенты, техническая документация или договоры. Начинаем с обследования: 200 000 ₽ за 2–3 недели при одном-двух источниках, 350 000 ₽ за 3–4 недели при нескольких системах и разных правах. На выходе набор ваших вопросов с ответами, замер текущего поиска, схема разбиения, выбор хранилища и модели, план обновления индекса и вилка бюджета. Сумма вычитается из первого этапа, если продолжаете с нами.
Затем лёгкий пилот на выборке документов стоит 150 000–400 000 ₽ за 2–8 недель, тяжёлый с правами доступа и подключением к источникам — 400 000–1 200 000 ₽ за 2–3 месяца. Вывод в эксплуатацию начинается от 1 500 000 ₽ этапами по 300 000–700 000 ₽. Остановиться можно после любой ступени, исходный код лежит в вашем репозитории с первого коммита. Перечень ступеней и сопровождения — на странице «Тарифы». Если нужен не список фрагментов, а связный ответ со ссылкой на источник, это ассистент по документам, он строится на том же поиске. Пример разбора такой задачи — поиск по технической документации.
Мы не берём поиск по открытому интернету и по неструктурированному архиву без владельца, не настраиваем права в ваших системах за вас и не дежурим круглосуточно.
Частые вопросы
Чем семантический поиск отличается от обычного?
Обычный сравнивает слова запроса и текста, семантический — смысл: запрос и фрагменты превращаются в векторы, и показываются ближайшие. Первый точнее с кодами и названиями, второй лучше с вопросами своими словами.
Нужно ли заменять наш текущий поиск?
Чаще всего не заменять, а дополнить. Гибридный поиск использует обе части: полнотекстовую для точных слов и номеров, векторную для вопросов своими словами. Состав определяется проверкой на ваших вопросах.
Хорошо ли семантический поиск работает с русским языком?
Да, если выбрана подходящая модель. Многоязычные модели и модели на русских текстах дают приемлемый результат, но качество на вашей предметной лексике нужно проверять. Сравнение двух-трёх моделей на ваших вопросах входит в обследование.
Можно ли запускать поиск полностью в нашем контуре?
Да. Модель эмбеддингов, хранилище и ранжирование разворачиваются на ваших серверах. Для данных ограниченного доступа внешние сервисы чаще не подходят по требованиям заказчика. Персональные данные граждан России обычно должны храниться на серверах в России.
Как сделать, чтобы поиск не показывал закрытые документы?
Права записываются в метаданные каждого фрагмента, фильтр применяется при запросе до ранжирования, а при изменении прав в источнике индекс обновляется. Отдельным прогоном проверяем, что из-под любой роли закрытое не достаётся.
Сколько документов нужно, чтобы это имело смысл?
Точного порога нет. Смысл появляется, когда сотрудники не находят нужное обычным поиском и тратят время на вопросы коллегам. При небольшом числе документов хватит хорошо организованного каталога. Решение принимается по замеру текущего поиска на обследовании.
Нужна ли векторная база, или хватит PostgreSQL?
Для умеренного объёма часто хватает PostgreSQL с расширением pgvector: меньше систем в эксплуатации. Если нужны большие объёмы, сложные фильтры и высокая нагрузка, рассматривают Qdrant или Weaviate. Выбор подтверждается проверкой на ваших данных.
Сколько стоит семантический поиск по документам?
Обследование — 200 000 ₽ (350 000 ₽ при нескольких системах). Лёгкий пилот стоит 150 000–400 000 ₽, тяжёлый — 400 000–1 200 000 ₽, вывод в эксплуатацию от 1 500 000 ₽ этапами по 300 000–700 000 ₽. Обследование вычитается из первого этапа.