3.17

Смотреть на английском

3.17 Поиск и информационный поиск

Обзор и мотивация

Рано или поздно кто-то набирает несколько слов в поле и ожидает, что ваша система найдёт нужное. Это поле обманчиво просто. За ним стоит одна из старейших и богатейших дисциплин вычислительной техники: информационный поиск, наука о нахождении релевантных элементов в большой коллекции по неточному запросу. Поиск не функция, которую прикручивают к продукту поздно; это забота уровня системы со своей моделью данных, своими режимами отказа, своей историей масштабирования и своим способом ошибаться. Когда поиск хорош, люди находят нужное и почти не замечают этого. Когда поиск плох, они уходят или, хуже, заключают, что нужной им вещи не существует.

Эта глава воспринимает поиск как первоклассную архитектуру. Он стоит рядом с решениями о данных и хранении из главы 3.4, потому что поисковый индекс это специализированное хранилище, оптимизированное для запросов и отличное от системы учёта, которая владеет истиной. Он опирается на идеи кэширования и доставки из главы 3.15, потому что результаты поиска и подсказки чувствительны к задержке и кэшируемы. И теперь он сильно пересекается с работой по генеративному искусственному интеллекту из главы 6.3, потому что современный поиск снабжает большие языковые модели контекстом, нужным для хороших ответов.

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

Ключевые принципы

  • Воспринимайте поисковый индекс как производное хранилище, отдельное от вашей системы учёта.
  • Релевантность это измеримое качество, а не дело вкуса; оценивайте её по данным.
  • Подстраивайтесь под то, как люди действительно набирают: с опечатками, коротко и неоднозначно.
  • Сочетайте лексический и семантический поиск; ни один сам по себе не покрывает каждый запрос.
  • Проектируйте конвейер индексации под свежесть, а не только под начальную загрузку.
  • Оценивайте офлайн по суждениям и онлайн по реальному поведению и используйте и то, и другое.
  • Масштабируйте поиск намеренно через шарды и реплики и наблюдайте его, как любой сервис.

Рекомендации

Начинайте с инвертированного индекса и конвейера анализа

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

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

Поймите ранжирование по релевантности, прежде чем его настраивать

Найти подходящие документы лёгкая половина. Упорядочить их так, чтобы лучший оказался сверху, трудная половина, называемая ранжированием. Традиционная рабочая лошадка TF-IDF, сокращение от «частота термина, умноженная на обратную частоту документа»: термин весит больше, когда часто встречается в документе (частота термина) и когда редок по всей коллекции (обратная частота документа), поэтому «фотосинтез» весит больше, чем «и». Большинство современных движков по умолчанию используют Okapi BM25, уточнение, насыщающее частоту термина (десятое вхождение добавляет мало к девятому) и нормализующее по длине документа, чтобы длинные документы не выигрывали одним размером. Вам не нужно выводить формулу, но стоит знать, что ручка существует, что у неё есть обоснованные значения по умолчанию и что её изменение меняет, какие результаты идут первыми.

Оценивайте качество двумя словами из этой области. Точность (precision) это доля возвращённых результатов, которые релевантны; полнота (recall) это доля всех релевантных результатов, которые вы вернули. Они меняются друг на друга. Ослабьте запрос, чтобы поймать каждое возможное совпадение, и точность падает, когда подкрадывается шум; ужесточите его ради чистого набора результатов, и полнота падает, когда хорошие совпадения отпадают. Каждое решение по релевантности, от терпимости к опечаткам до расширения синонимами, ставка на то, где вдоль этой кривой хотят быть ваши пользователи, и ответ различается для юридического архива (предпочесть полноту, ничего не упустить) и витрины магазина (предпочесть точность, показывать победителей).

Вкладывайтесь в понимание запросов

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

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

Добавляйте фасеты, автодополнение и структурированную фильтрацию

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

Автодополнение и подсказки формируют запрос ещё до его отправки. Хороший подсказчик предлагает настоящие ценные запросы по мере набора, рано исправляет орфографию и выводит популярные или набирающие силу намерения. Он критичен по задержке (каждое нажатие клавиши это запрос) и напрямую выигрывает от шаблонов кэширования из главы 3.15. Подсказки также направляют людей к запросам, которые вы обрабатываете хорошо, что тихо повышает общую релевантность. Воспринимайте подсказчик как отдельный небольшой индекс со своим ранжированием, настроенным по журналам запросов, а не по содержимому документов.

Сочетайте лексический и векторный поиск

Классический поиск сопоставляет слова. Он не может понять, что «машина» и «автомобиль» значат одно и то же, пока вы ему не скажете, и спотыкается на вопросах, сформулированных так, как ваши документы никогда не пишут. Векторный поиск решает это, представляя текст как эмбеддинг (embedding), плотный числовой вектор, порождаемый моделью машинного обучения так, что схожие смыслы оказываются рядом в векторном пространстве. Поиск тогда становится поиском ближайших соседей в этом пространстве, а поскольку точный поиск ближайших соседей слишком медленен в масштабе, движки используют алгоритмы приближённого поиска ближайших соседей (ANN), меняющие крупицу точности на большой выигрыш в скорости. Семантический поиск такого рода находит нужный документ, даже когда он не делит с запросом ни одного слова.

Ни один подход не побеждает везде. Лексический поиск силён на точных терминах, именах, кодах и редких ключевых словах; он прозрачен и дёшев в объяснении. Векторный поиск силён на смысле, перефразировании и вопросах на естественном языке, но может упустить точный идентификатор и труднее отлаживается. Сильный вариант по умолчанию для серьёзных систем гибридный поиск: запускайте оба и сливайте результаты, нередко техникой вроде слияния обратных рангов (reciprocal rank fusion), смешивающей два ранжированных списка, не требуя сопоставимости их оценок. Гибрид даёт точность ключевых слов и полноту семантики и деградирует изящно, когда слаба любая из сторон.

Связывайте поиск с генерацией, дополненной поиском

Быстрее всего растущий потребитель поиска не человек, читающий список результатов; это языковая модель. Генерация, дополненная поиском (RAG) заземляет генеративную модель в ваших данных, извлекая релевантные фрагменты и помещая их в контекст модели, чтобы она отвечала по вашим фактам, а не по памяти обучения. Качество генерации из главы 6.3 напрямую зависит от качества поиска: подайте модели не те фрагменты, и она уверенно синтезирует неверный ответ. Всё в этой главе (нарезка текста на фрагменты, хорошее их ранжирование, слияние лексических и векторных сигналов, поддержание индекса свежим) и есть поисковая половина RAG. Если ваша организация строит на больших языковых моделях, ваша поисковая система фундамент, а улучшение полноты на нужных фрагментах нередко помогает ассистенту больше, чем замена модели.

Стройте конвейер индексации под свежесть

Индекс это копия, а копия дрейфует. Конвейер индексации это механизм, поддерживающий поисковый индекс в соответствии с системой учёта: чтение изменений источника, запуск анализа и эмбеддинга и запись в индекс, в идеале потоком, а не ночной пакетной обработкой. Это забота инженерии данных (глава 7.2), и та же забота о порядке, повторах и идемпотентности из главы 3.3 применима, потому что неупорядоченное обновление может воскресить удалённый документ. Задайте целевую свежесть явно. Цена или остаток на складе могут требовать поисковой доступности за секунды; архивный документ политики может отставать на часы. Поддерживайте полную переиндексацию для изменений схемы и анализатора и проектируйте её запуск без простоя, обычно построением нового индекса и атомарным переключением псевдонима, когда он готов.

Настраивайте релевантность оценкой, а не мнением

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

Масштабируйтесь шардами и репликами и наблюдайте всё

Поиск масштабируется по двум осям. Шардирование разделяет один индекс по машинам разбиением документов, так что запрос разветвляется на каждый шард, а частичные результаты сливаются; это позволяет индексу расти за пределы, которые вмещает одна машина, и распределяет нагрузку индексации. Реплики копируют каждый шард, так что трафик чтения распределяется по копиям, а потеря узла не теряет данных; реплики обслуживают пропускную способность запросов и дают устойчивость. Больше шардов повышают цену разветвления на запрос, поэтому подбирайте их под ваши данные, а не под круглое число. Эксплуатируйте поиск с наблюдаемостью главы 9.2: отслеживайте процентили задержки запросов (хвост важнее среднего), отставание индексации, доли попаданий в кэш, доли ошибок и, как первоклассные сигналы, метрики релевантности вроде доли нулевых результатов и позиции клика. Поисковая система, быстрая, но возвращающая плохие результаты, отказывает молча, и только телеметрия релевантности вам об этом скажет.

Компромиссы: плюсы и минусы

ПодходПлюсыМинусы
Лексический поиск (BM25)Точные термины, коды, имена; прозрачен; дёшевСлеп к синонимам и перефразированию без настройки
Векторный (семантический) поискПонимает смысл и вопросы; сильная полнотаУпускает точные идентификаторы; дорог в вычислении; труднее отлаживать
Гибридный поискТочность ключевых слов плюс полнота семантикиБольше подвижных частей; слияние требует настройки и тестирования
Агрессивное расширение опечаток и синонимовВыше полнота; снисходителен к настоящим пользователямТочность падает; шумные результаты без контроля
Индексация в реальном времениСвежие результаты за секундыВыше стоимость и сложность, чем у пакетной
Больше шардовБо́льшие индексы; параллельная индексацияВыше разветвление на запрос и цена координации
Офлайн-оценка (списки суждений)Быстро, воспроизводимо, безопасно итерироватьИдеализирована; может не совпадать с реальным поведением пользователей
Онлайн-оценка (метрики кликов, тесты)Отражает настоящих пользователей и намерениеМедленно, шумно, нужны трафик и дисциплина экспериментов

Повторяющееся напряжение это точность против полноты, и оно прячется в каждой ручке. Ослабьте сопоставление, расширьте синонимы и обопритесь на семантику, и вы поймаете больше ценой шума; ужесточите всё, и вы чисты, но упускаете вещи. Универсальной настройки нет, только правильная настройка для данной коллекции и аудитории, находимая измерением. Второе напряжение свежесть против стоимости: индексация в реальном времени и гибридный поиск обе покупают качество вычислениями и сложностью. Разрешайте оба одинаково, привязывая каждое решение к метрике оценки и результату для пользователя, а не к интуиции, чтобы видеть, что изменение действительно купило.

Вопросы для обсуждения с командой

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

  2. Где лексический и семантический поиск подводят нас каждый и стоит ли нам перейти на гибрид? Чистый поиск по ключевым словам тихо подводит на перефразированных вопросах и синонимах, а чистый векторный поиск тихо подводит на точных идентификаторах и редких терминах, и у большинства команд за всё время работал только один из двух. Принесите набор настоящих запросов, вернувших плохие результаты, и классифицируйте, почему подвёл каждый: отсутствующий синоним, орфографическая ошибка, семантическое несоответствие или отсутствующее точное совпадение? Шаблон в этих отказах скажет, поможет ли гибридный поиск и куда направить усилия сначала. Это важнее, если вы питаете языковую модель, потому что отказы поиска становятся уверенными неверными ответами, а цена плохого результата резко растёт, когда над ним стоит генеративный слой.

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

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

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

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

Взгляд по секторам

Стартап. Тянитесь к управляемому поисковому или векторному сервису и выпускайте значения BM25 по умолчанию в первый день; не поднимайте собственный кластер, пока у вас нет запросов, по которым настраивать. Выберите одну поисковую поверхность, касающуюся выручки или удержания, инструментируйте позицию клика и долю нулевых результатов с первого выпуска и пусть настоящие журналы запросов, а не дорожная карта, подскажут, когда добавлять синонимы или семантический слой. Тот же слой поиска, что вы строите для поиска, позже станет вашим бэкендом генерации, дополненной поиском, поэтому держите его за тонким интерфейсом.

Малый бизнес. У вас почти наверняка нет инженера по релевантности, поэтому покупайте поиск, встроенный в платформу, которую вы уже используете, такую как хостинг электронной коммерции, служба поддержки или система управления содержимым, и воспринимайте настройку как лёгкую периодическую рутину, а не проект. Тратьте ограниченные усилия на основы качества данных, от которых зависит поиск: чистые атрибуты продуктов для фасетов, разумные заголовки и короткий список синонимов для слов, которые действительно используют ваши клиенты. Просматривайте запросы с нулевыми результатами ежемесячно, потому что это дешевейший сигнал о разрыве, который вы можете закрыть без инженера.

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

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

Примеры

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

Крупная организация. Международный ритейлер ведёт поиск продуктов по десяткам миллионов позиций на десятках рынков и языков. Индекс шардирован для размера и реплицирован для пропускной способности, а анализаторы на каждый язык корректно обрабатывают токенизацию и стемминг для каждого рынка. Фасетная навигация по бренду, цене и наличию превращает огромные наборы результатов в направляемый просмотр, а автодополнение направляет покупателей к запросам с высокой конверсией. Релевантность финансируемая команда со списками суждений на каждый рынок и непрерывными онлайн-экспериментами; изменение ранжирования выпускается только после того, как обошло контрольную группу по конверсии. Конвейер индексации в реальном времени держит цену и остаток доступными для поиска за секунды, потому что распроданная позиция на первом месте это потерянная продажа и обращение в поддержку.

Государственный сектор. Национальное ведомство публикует постановления, формы и руководства, которые общество должно уметь найти, нередко по юридическому обязательству и в пиковую нагрузку у сроков. Команда отдаёт предпочтение полноте и прозрачности: гражданин, ищущий пособие, не должен упустить нужную форму, а ведомство должно уметь объяснить, почему результат появился, что подталкивает к интерпретируемому лексическому ранжированию, осторожно дополняемому синонимами для простых терминов, которыми люди пользуются вместо официальных названий. Доступность и многоязычная поддержка требования, а не дополнения. Индекс переиндексируется без простоя за псевдонимом, когда документы политики меняются, а запросы с нулевыми результатами журналируются и просматриваются как сигнал неудовлетворённой общественной потребности.

Бизнес-обоснование: мотивы, ROI и TCO

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

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

Антипаттерны и ловушки

  • Несовпадающий анализ: анализаторы при индексации и при запросе расходятся, так что термины молча не совпадают, а результаты исчезают без ошибки.
  • Релевантность по мнению: ранжирование настроено тем, кто спорит громче, без списка суждений, метрик и способа поймать регрессии.
  • Вера только в векторы: полная замена поиска по ключевым словам эмбеддингами с последующими провалами на точных идентификаторах, кодах и редких терминах.
  • Игнорирование нулевых результатов: позволять пустым страницам результатов оставаться вместо ослабления, подсказок или отката, и терять пользователя.
  • Устаревший индекс: ночной пакетный конвейер, выдающий цены, остатки или удаления, которые, как видят пользователи, неверны.
  • Простой при переиндексации: перестройка на месте вместо перестройки за псевдонимом, выводящая поиск из строя при каждом изменении схемы.
  • Ненастраиваемые значения по умолчанию навсегда: выпуск готового BM25 и отказ когда-либо пересматривать его по мере эволюции коллекции и аудитории.
  • Нет телеметрии релевантности: мониторинг задержки и ошибок, но не доли нулевых результатов или позиции клика, так что плохие результаты отказывают молча.
  • Чрезмерное расширение: нагромождение синонимов и терпимости к опечаткам, пока точность не рушится и каждый запрос не возвращает шум.

Модель зрелости

  • Уровень 1, Начальный: Поиск это запрос к базе данных по умолчанию или ненастроенный движок со стандартными настройками, поднятый реактивно, когда кто-то наконец попросил. Нет ни измерения релевантности, ни слоя понимания запросов, а свежесть такая, какую случайно выдаст пакетное задание. Плохие результаты замечаются только когда пользователи жалуются, и каждое исправление разовое.
  • Уровень 2, Развитие: Настоящий поисковый движок на месте с разумным анализом, ранжированием BM25, базовыми фасетами и автодополнением. Существуют некоторые синонимы и терпимость к опечаткам, команда следит за задержкой и ошибками и начала журналировать запросы с нулевыми результатами. Практики различаются от команды к команде и от продукта к продукту, а релевантность по-прежнему настраивается мнением, а не свидетельствами.
  • Уровень 3, Стандартизация: Практика релевантности документирована и применяется последовательно по организации. Команды измеряют общим методом списков суждений и NDCG офлайн и метриками кликов онлайн, запускают гибридный лексический плюс векторный поиск там, где это помогает, удерживают конвейер индексации к заявленной цели свежести и переиндексируют без простоя за псевдонимом. Шардирование и репликация подобраны намеренно, а метрики релевантности мониторятся рядом с эксплуатационными.
  • Уровень 4, Управление: Поиск измеряется и контролируется относительно базовых значений. Каждая поисковая поверхность отслеживает тренд NDCG, долю нулевых результатов, позицию клика и долю переформулировок относительно согласованного базового значения, с целями уровня обслуживания по процентилям задержки запросов и отставанию индексации. Изменения ранжирования и анализа выпускаются только после того, как контролируемый эксперимент обошёл контрольную группу по названному результату, регрессия релевантности автоматически вызывает оповещение, а панели по рынкам или сегментам делают тихий распад видимым до того, как его почувствуют пользователи. Решения менять ручку принимаются по данным с явными критериями отката.
  • Уровень 5, Оркестрация: Улучшение поиска это непрерывный управляемый экспериментами цикл, интегрированный по организации. Списки суждений растут из добытых журналов запросов, понимание запросов адаптируется к реальному языку, а поиск настраивается как общий фундамент для нижестоящих генеративных приложений. Вся система наблюдается от конца до конца и по скорости, и по релевантности, а практика поиска сама перебалансируется по мере дрейфа каталогов, языка и ландшафта моделей.

Идеи для обсуждения

  1. Какая доля ваших поисков возвращает ноль результатов или приводит к переформулировке и что эти запросы говорят о неудовлетворённой потребности?
  2. Если бы завтра вы заменили поиск по ключевым словам чисто векторным, какие запросы сломались бы и как бы вы узнали об этом раньше своих пользователей?
  3. Кто владеет релевантностью в вашей организации и есть ли у него список суждений и метрики или только мнения и анекдоты?
  4. Какова задержка от изменения в вашей системе учёта до того, как оно становится доступным для поиска, и приемлема ли она для каждого типа данных?
  5. Если языковая модель потребляет ваши результаты поиска, соответствует ли качество вашего поиска более высокой планке, которой требует генеративный ответ?
  6. Как бы вы защитили изменение ранжирования перед скептически настроенным заинтересованным лицом: результатом эксперимента или рассказом?

Главные выводы

  • Воспринимайте поиск как первоклассную систему: производный индекс со своей моделью данных, конвейером, масштабированием и режимами отказа, отдельный от вашей системы учёта.
  • Овладейте основами (инвертированный индекс, согласованный анализ, ранжирование BM25, точность против полноты), прежде чем тянуться к чему-то более изощрённому.
  • Вкладывайтесь в понимание запросов (синонимы, терпимость к опечаткам, намерение и настоящий план на нулевые результаты), потому что пользователи никогда не набирают так, как читаются ваши документы.
  • По умолчанию используйте гибридный поиск, сливающий лексический и векторный, и помните, что этот же слой поиска фундамент генерации, дополненной поиском.
  • Заменяйте мнение измерением: списки суждений и NDCG офлайн, метрики кликов и контролируемые эксперименты онлайн и телеметрия релевантности, мониторимая, как любой производственный сигнал.

Источники и дополнительное чтение

  • Christopher D. Manning, Prabhakar Raghavan, and Hinrich Schütze, Introduction to Information Retrieval
  • Stephen E. Robertson and Hugo Zaragoza, The Probabilistic Relevance Framework: BM25 and Beyond
  • Ricardo Baeza-Yates and Berthier Ribeiro-Neto, Modern Information Retrieval: The Concepts and Technology behind Search
  • Doug Turnbull and John Berryman, Relevant Search: With Applications for Solr and Elasticsearch
  • Trey Grainger, Doug Turnbull, and Max Irwin, AI-Powered Search
  • Patrick Lewis et al., “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”
  • Jeff Johnson, Matthijs Douze, and Hervé Jégou, “Billion-Scale Similarity Search with GPUs”
  • Kalervo Järvelin and Jaana Kekäläinen, “Cumulated Gain-Based Evaluation of IR Techniques”