Webrium
Подписаться

Поиск решает меньше, чем принято считать

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

Четыре датчика: три показателя поиска в норме, четвёртый — ответы агента — зашкаливает. Метрики поиска красивые, а агент отвечает мимо: поломка живёт не в ретриагент всё ещё мимо

Агент отвечает мимо. Вы открываете трейс и смотрите, что попало в контекст: нужного документа нет — или он есть, но где-то за шумом. Вывод напрашивается сам: чинить поиск. Меняют размер чанков, меняют модель эмбеддингов, добавляют гибридный поиск, следом — реранкер. Метрики поиска становятся красивыми. Агент отвечает так же мимо.

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

Симптом виден в поиске, поломка — нет

Агент — это цикл: понять запрос → решить, куда лезть → сходить → посмотреть, что вернулось → решить, хватит ли. Пять шагов, поиск — один из них, и не самый хитрый. Но у него есть свойство, которого нет у остальных: его выход можно раскрыть глазами. Контекст, который достал ретривер, лежит в трейсе целиком, его можно процитировать коллеге. А «агент не понял, что информации мало» артефакта не имеет — есть только последствие: пустой или не тот контекст.

Отладка идёт туда, где видно. Поэтому провал всей цепочки регулярно записывают на её единственный читаемый шаг.

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

Тупик: крутить ретривер

Первым делом почти все делают одно и то же. Размер чанка. Смена эмбеддингов. Гибрид ключевого и векторного поиска. Реранкер. Топ-k побольше. Фильтры по метаданным. Набор не случаен: это весь инструментальный ящик слоя поиска, у каждого инструмента есть готовая библиотека и понятная метрика. Отсюда и тянет — здесь можно быть занятым продуктивно. К тому же это самый расрекламированный слой: доклады, платформы, сравнения подходов.

Не помогает по двум причинам, и обе обидные.

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

Вторая: метрика. Ретривер тюнят по его собственным метрикам — доля найденного в топ-k, позиция первого релевантного. Они честно растут. Но агент оценивается концом-в-конец, а локальная метрика слоя ничего не обещает про слой выше: она растёт в одиночестве. Это частный случай общей беды с оценкой моделей — мы разбирали его в материале о том, что мерить у модели, кроме точности.

И тонкость сверху: если цикл и так умеет перезапрашивать, часть выигрыша в поиске уже скомпенсирована повторной попыткой. Вы докручиваете то, что система умеет обходить, и платите инфраструктурой за ноль на выходе.

Четыре вопроса к каждому провалу

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

  1. Ответ вообще есть в корпусе? Найдите его руками, зная, где искать. Если нет — это не задача машинного обучения: поиск не находит того, чего нет. Чинить надо источник: написать документ, поправить процесс, из-за которого знание живёт в чьей-то голове.
  2. Есть. Находит ли его поиск по запросу, который написали бы вы, уже видя ответ? Если нет — проблема в устройстве индекса: чанк разрезал ответ пополам, фильтр отсёк нужное, документ не попал в индексацию. Слой поиска, но чинится не сменой эмбеддингов, а гигиеной индекса.
  3. Находит. А по запросу, который реально сгенерировал агент? Если нет — словарный разрыв: пользователь говорит «не пускает в кабинет», документ называется «сбои аутентификации». Вот здесь и только здесь живут деньги на эмбеддинги, гибриды и реранкеры — либо, дешевле, привычка агента переформулировать запрос после пустого результата.
  4. Находит и по нему. Попал ли документ в контекст — и использовала ли его модель? Если нет — поломка в сборке ответа: топ-k забит похожим мусором, важное лежит в середине длинного контекста, где модель видит хуже всего, или модель предпочла собственную память документу.

Четыре «нет» — четыре разных слоя починки, и только третье — про поиск в собственном смысле слова. Пока провалы не прогнаны через эти вопросы, вы не знаете, где чинить, а рефлекс уже несёт вас к ретриверу.

Почему агент прощает посредственный поиск

Теперь главное, из-за чего держится весь тезис. У агента, в отличие от конвейера, есть право сходить за знанием ещё раз.

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

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

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

Позиция редакции

Мы считаем: вопрос «нужен ли агенту RAG» поставлен неправильно. Агенту нужен инструмент доступа к знаниям, вызываемый столько раз, сколько потребуется; «RAG» как рецепт с одним извлечением на вопрос — архитектура для бота без цикла, не для агента. И почти никогда не стоит начинать с векторного индекса и тюнинга ретривера: в агентной системе поиск редко бывает самым слабым звеном — цикл умеет компенсировать его повторами, а сам цикл компенсировать некому. Поиск доставляет кандидатов. Решает судья.

Наша позиция неверна при трёх условиях, и мы признаем это прямо.

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

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

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

Что делать вместо

Коротко, по очерёдности.

Дайте агенту поиск как инструмент, а не как автоматический шаг: пусть сам решает, искать ли, видит, что вернулось, и ходит снова, если пусто. Самое дешёвое изменение в списке и самое недооценённое — включает компенсацию повторами бесплатно.

Начните с ключевого поиска по нормализованному корпусу. Векторный индекс — реакция на диагноз «словарный разрыв», а не дефолт; диагноз ставится третьим вопросом, за вечер.

Мерьте конец-в-конец, по провалам, а не по метрикам слоя — как именно оценивать поведение модели за пределами одной точности, мы разбирали отдельно.

Держите гигиену корпуса: если ответа в корпусе нет, поможет не ML, а редактура. Самое скучное правило и самое частое.

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

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

С чем это связано

Метка над заголовком говорит, зачем туда идти: продолжить тему, перейти к практике или увидеть возражение.

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

Агенты в продакшене: что отказывает на второй неделе

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

Два маршрута: короткий дорогой — погоня за одной цифрой точности, длинный дешёвый — набор метрик под разные режимы отказаодна цифранесколько метрик
Углубление

Что мерить у модели кроме точности

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

Поле, разделённое швом: слева ассистент, который лишь отвечает текстом, справа агент, который сам выполняет действия; элементы пересекают границу, показывая, чтАссистент отвечаетАгент делает
Просто

Что такое ИИ-агент и почему о нём все спорят

Та же история, но без терминов: ассистент отвечает, агент делает — и настоящий спор не об уме модели, а об ошибке, которая становится действием.

Письмо по вторникам

Один разбор недели и короткий список того, что изменилось. Без дайджестов на сорок ссылок.

Начните вводить — материалы появятся здесь.

выбрать · Enter открыть · Esc закрыть