# Полнотекстовый поиск всё ещё работает. Просто он не доходит до ответа

Полнотекстовый поиск отлично справляется с точными запросами. Но когда пользователь описывает задачу, сравнивает варианты и ждёт объяснения, нужен дополнительный слой. Показываем, как работает диалоговый поиск в Manticore Search и как мы измеряем качество извлечения данных.

Представьте обычный интернет-магазин обуви.

Покупатель открывает поиск и пишет:
```text
Мне нужны чёрные водонепроницаемые кроссовки для ежедневных пробежек по мокрому асфальту. Что посоветуете?
```

Ещё несколько лет назад от поисковой строки такого почти никто не ждал. Запрос пришлось бы сократить до чего-нибудь вроде:
```text
black waterproof running shoes
```

Дальше — открыть несколько карточек, сравнить описание, материалы, назначение, цену и решить самому.

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

Google, например, в мае 2026 года сообщила, что AI Mode превысил миллиард пользователей в месяц. Компания отмечает, что люди задают более длинные и сложные вопросы, которые раньше не попадали в обычный поиск. ([blog.google](https://blog.google/products-and-platforms/products/search/search-io-2026/))

С интернет-магазином происходит то же самое.

Запрос вроде:
```text
Мне нужны чёрные водонепроницаемые кроссовки для ежедневных пробежек по мокрому асфальту.
```

только выглядит как одна фраза. Для поисковой системы внутри него несколько задач.

Нужно выделить ограничения — цвет, водонепроницаемость. Понять, что речь идёт о беге, а не просто прогулках. Учесть цену, размер и наличие. Найти подходящие товары. А затем, если пользователь уточнит «какие из них лучше», объяснить различия.

Одним алгоритмом это не решается.

Полнотекстовый поиск, векторный поиск, фильтры, гибридный поиск и языковая модель решают разные части задачи. Гораздо эффективнее не выбирать между ними, а объединять.

Именно для этого в Manticore появился диалоговый поиск.

---

## Поиск по словам, по смыслу и диалог — разные задачи

Начнём с простого запроса:
```text
Nike Pegasus 41 чёрные
```

Здесь системе почти не нужно интерпретировать намерение пользователя. Полнотекстовый поиск справляется напрямую.

Или ещё проще:
```text
SKU 123456
```

Семантические методы здесь не нужны.

Теперь другой пример:
```text
лёгкая обувь для долгих прогулок летом
```

В карточке товара может не быть слов «лето» или «долгие прогулки». Но могут быть признаки вроде "дышащий материал"" или "облегчённая конструкция".

Здесь уже полезен векторный поиск.

А реальные запросы часто находятся между этими крайностями:
```text
чёрные кроссовки Gore-Tex для ежедневных пробежек
```

Часть параметров — `чёрный`, `Gore-Tex` — важно сохранить. `ежедневные пробежки` описывает скорее намерение пользователя, чем точный атрибут.

Для таких случаев Manticore использует гибридный поиск, объединяющий полнотекстовый и векторный поиск через ранжирование результатов.

Но даже гибридный поиск возвращает только список результатов.

На этом поиск считает свою работу законченной. Пользователь — обычно нет.

Он не отвечает на вопросы вроде:
```text
Какие из этих моделей лучше подойдут для дождя?
```

И тем более не работает с продолжением:
```text
А что из них дешевле $120?
```

Это уже диалог. И здесь нужен другой слой.

---

## Что мы собрали

Чтобы проверить это на практике, мы использовали [ConvApparel](https://arxiv.org/abs/2602.16938) — датасет диалогов о выборе одежды. После очистки получилось 82 524 товара: обувь, брюки, топы и верхняя одежда. У каждого товара есть описание, категория, изображения и характеристики. На этих данных мы собрали Manticore Apparel Shop.

Например, можно написать:
```text
Мне нужны чёрные водонепроницаемые кроссовки для пробежек
```

Система сначала находит подходящие товары, затем языковая модель формирует ответ, используя их как контекст, а интерфейс показывает сами товары.

> **Попробуйте демо:** [Manticore Apparel Shop](https://chat.manticoresearch.com/) — оно само сгенерирует случайный продукт, вопрос, который должен его найти в теории и уже на практике продемонстрирует, что этот же вопрос находит этот продукт через Manticore.

![Диалоговый поиск показывает ответ и товары-источники в Manticore Apparel Shop](./conversational-search/results.png)

Важно сохранить связь между ответом и данными. Если система утверждает, что модель подходит для дождя, пользователь должен иметь возможность открыть товар и проверить источник этого утверждения.

В этом подходе языковая модель не заменяет поиск. Она интерпретирует его результаты.

---

## Как это устроено

Используются две основные команды:

```sql
CREATE CHAT MODEL
```

и

```sql
CALL CHAT(...)
```

Сначала создаётся модель диалогового поиска и задаются правила её работы.

```sql
CREATE CHAT MODEL assistant (
    model='openrouter:google/gemma-4-26b-a4b-it',
    timeout=60,
    retrieval_limit=5,
    max_document_length=3000,
    custom_prompt='You are a context-only shopping assistant.

Answer using only the provided context.
Do not use outside knowledge or unsupported assumptions.

Recommend only products supported by the retrieved context.
For every recommended product, briefly explain why it matches the request.

End every recommendation with the corresponding
context source ID in the format [ref:<id>].

If none of the retrieved products support the request,
say that you do not have enough information.'
);
```

`retrieval_limit` определяет количество документов, которые попадают в контекст. `max_document_length` ограничивает объём текста из одного документа.

Если контекста слишком мало — модель не увидит нужные товары. Если слишком много — растут задержка и стоимость запроса. Языковая модель, как и человек, не становится умнее только потому, что ей дали прочитать всё подряд.

---

Дальше можно выполнить запрос:

```sql
CALL CHAT(
    'Мне нужны чёрные водонепроницаемые кроссовки для пробежек',
    'convapparel_products',
    'assistant',
    'demo-session-001',
    'embedding_vector'
);
```

И затем продолжить диалог:

```sql
CALL CHAT(
    'Which of these are better for daily use?',
    'convapparel_products',
    'assistant',
    'demo-session-001',
    'embedding_vector'
);
```

Система использует историю диалога, поэтому пользователю не нужно повторять контекст.

---

## Через HTTP API

Диалоговый поиск доступен и через JSON API:

```json
{
  "chat": {
    "query": "Мне нужны чёрные водонепроницаемые кроссовки для пробежек",
    "table": "convapparel_products",
    "model_name": "assistant",
    "conversation_uuid": "demo-session-001",
    "vector_field": "embedding_vector"
  }
}
```

Запрос отправляется в `/search`.

---

## Что возвращает система

Ответ содержит:

- `conversation_uuid`
- `user_query`
- `search_query` — поисковый запрос, сформированный системой
- `response`
- `sources`

Особенно важен `search_query`.

Если пользователь пишет:

```text
А какие из них лучше подойдут для дождя?
```

Сам по себе этот запрос не имеет смысла без контекста. Поэтому система формирует полноценный поисковый запрос с учётом истории диалога.

Это также упрощает отладку: можно проследить всю цепочку от запроса до ответа.

---

## Как устроено извлечение данных

Внутри диалогового поиска используется векторный поиск по embedding-полю. Процесс выглядит так:

```text
вопрос пользователя
→ история диалога
→ поисковый запрос
→ векторный поиск
→ найденные документы
→ языковая модель
→ ответ и источники
```

---

## Где заканчивается поиск и начинается диалог

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

---

## Качество

Мы проверили это на нашем [бенчмарке качества разговорного поиска](https://github.com/manticoresoftware/conversational-search-quality-becnhmark), используя 200 детерминированных товарных запросов из ConvApparel. Бенчмарк оценивает возвращаемые ID товаров как источники, а не формулировку сгенерированного ответа.

В текущем прогоне Manticore показал **0.3650 Hit@3**, **0.4250 Hit@5**, **0.5250 Hit@10** и **0.2790 MRR** — лучший результат по каждой из этих метрик среди протестированных движков. В полном репозитории есть правила сборки датасета, конфигурация движка, smoke-задачи и сырые результаты.

---

## Итог

Поиск в современных системах — это не один алгоритм, а несколько слоёв:

- полнотекстовый поиск
- векторный поиск
- гибридный поиск
- диалоговый поиск

Каждый решает свою задачу. Языковая модель не заменяет поиск. Она работает поверх него.

Без хорошего поиска не получится умный ассистент; получится очень разговорчивый консультант, который едва знает собственный каталог.

> **Хотите проверить подход на практике?** Попробуйте [Manticore Apparel Shop](https://chat.manticoresearch.com/): выберите случайный продукт, задайте вопрос на его основе и убедитесь, что этот же продукт будет найден и предложен в ответе.

Если хотите запустить это локально или изучить код, загляните в [репозиторий GitHub](https://github.com/manticoresoftware/demo-conversational-search).
