Агент отвечает мимо. Вы открываете трейс и смотрите, что попало в контекст: нужного документа нет — или он есть, но где-то за шумом. Вывод напрашивается сам: чинить поиск. Меняют размер чанков, меняют модель эмбеддингов, добавляют гибридный поиск, следом — реранкер. Метрики поиска становятся красивыми. Агент отвечает так же мимо.
Эта траектория нам хорошо знакома, и в ней спрятана ошибка диагностики: поломка видна в поиске, но живёт обычно в другом слое. Ниже — почему так выходит, как за один вечер проверить свой случай и что крутить вместо ретривера. Заодно закроем вопрос, с которого обычно начинают: нужен ли агенту RAG вообще.
Симптом виден в поиске, поломка — нет
Агент — это цикл: понять запрос → решить, куда лезть → сходить → посмотреть, что вернулось → решить, хватит ли. Пять шагов, поиск — один из них, и не самый хитрый. Но у него есть свойство, которого нет у остальных: его выход можно раскрыть глазами. Контекст, который достал ретривер, лежит в трейсе целиком, его можно процитировать коллеге. А «агент не понял, что информации мало» артефакта не имеет — есть только последствие: пустой или не тот контекст.
Отладка идёт туда, где видно. Поэтому провал всей цепочки регулярно записывают на её единственный читаемый шаг.
Теперь арифметика. Чтобы задача сошлась, должны сойтись все шаги: вероятность успеха — произведение по шагам. У произведения неудобное свойство: оно почти нечувствительно к сильным множителям и целиком определяется слабым. Если поиск и так приличный, а судейство «хватит ли найденного» хромает, то тянуть поиск — тянуть сильный множитель: на выходе не шевельнётся ничего. Правильный вопрос не «хороший ли у нас поиск», а «какое звено сейчас самое слабое». Это вопрос диагностики, а не вкуса, и у него есть дешёвый ответ — ниже.
Тупик: крутить ретривер
Первым делом почти все делают одно и то же. Размер чанка. Смена эмбеддингов. Гибрид ключевого и векторного поиска. Реранкер. Топ-k побольше. Фильтры по метаданным. Набор не случаен: это весь инструментальный ящик слоя поиска, у каждого инструмента есть готовая библиотека и понятная метрика. Отсюда и тянет — здесь можно быть занятым продуктивно. К тому же это самый расрекламированный слой: доклады, платформы, сравнения подходов.
Не помогает по двум причинам, и обе обидные.
Первая: этот ящик адресует почти целиком один класс провалов — словарный разрыв между запросом и документом. Провалы, живущие в других слоях, он не трогает вообще. Ответа может не быть в корпусе; агент мог спросить не то; документ мог найтись — и не быть использованным. Крутить ретривер при любом из этих диагнозов — шлифовать карбюратор, когда кончился бензин.
Вторая: метрика. Ретривер тюнят по его собственным метрикам — доля найденного в топ-k, позиция первого релевантного. Они честно растут. Но агент оценивается концом-в-конец, а локальная метрика слоя ничего не обещает про слой выше: она растёт в одиночестве. Это частный случай общей беды с оценкой моделей — мы разбирали его в материале о том, что мерить у модели, кроме точности.
И тонкость сверху: если цикл и так умеет перезапрашивать, часть выигрыша в поиске уже скомпенсирована повторной попыткой. Вы докручиваете то, что система умеет обходить, и платите инфраструктурой за ноль на выходе.
Четыре вопроса к каждому провалу
Диагностика делается руками, на последних провалах — сколько их есть, столько и берите. На каждый провал по очереди:
- Ответ вообще есть в корпусе? Найдите его руками, зная, где искать. Если нет — это не задача машинного обучения: поиск не находит того, чего нет. Чинить надо источник: написать документ, поправить процесс, из-за которого знание живёт в чьей-то голове.
- Есть. Находит ли его поиск по запросу, который написали бы вы, уже видя ответ? Если нет — проблема в устройстве индекса: чанк разрезал ответ пополам, фильтр отсёк нужное, документ не попал в индексацию. Слой поиска, но чинится не сменой эмбеддингов, а гигиеной индекса.
- Находит. А по запросу, который реально сгенерировал агент? Если нет — словарный разрыв: пользователь говорит «не пускает в кабинет», документ называется «сбои аутентификации». Вот здесь и только здесь живут деньги на эмбеддинги, гибриды и реранкеры — либо, дешевле, привычка агента переформулировать запрос после пустого результата.
- Находит и по нему. Попал ли документ в контекст — и использовала ли его модель? Если нет — поломка в сборке ответа: топ-k забит похожим мусором, важное лежит в середине длинного контекста, где модель видит хуже всего, или модель предпочла собственную память документу.
Четыре «нет» — четыре разных слоя починки, и только третье — про поиск в собственном смысле слова. Пока провалы не прогнаны через эти вопросы, вы не знаете, где чинить, а рефлекс уже несёт вас к ретриверу.
Почему агент прощает посредственный поиск
Теперь главное, из-за чего держится весь тезис. У агента, в отличие от конвейера, есть право сходить за знанием ещё раз.
Посчитаем. В однопроходной схеме — вопрос, одно извлечение, ответ — вероятность найти нужное входит в итог как есть: второго захода не будет. В цикле иначе. Если агент, получив пустой или мусорный результат, переформулирует запрос и идёт снова, то вероятность «не найти ни разу за k попыток» — это, грубо, вероятность промаха в степени k. Подставьте свои оценки — арифметика одна и та же: множитель, возведённый в степень числа попыток, быстро перестаёт быть слабым. Переформулировки и нужны, чтобы попытки не были похожи друг на друга, — иначе степень не работает.
А вот шагам «понять, что найденного не хватает» и «остановиться» некого звать на помощь. Снаружи цикла никого нет: если агент не заметил, что информации мало, за него не заметит никто. Судейство входит в произведение как есть, без степени. Поэтому слабое звено агентной системы — судейство, а не хватание; и поэтому тюнинг ретривера так слабо двигает конец-в-конец: вы усиливаете множитель, который цикл и так умеет усиливать повторами.
Отсюда же ответ на вопрос «нужен ли агенту RAG». Рецепт — нарезать корпус, посчитать эмбеддинги, положить в векторный индекс, доставать топ-k на каждый вопрос — родился под однопроходную схему: одно извлечение, один ответ, переспросить нельзя. У агента эта предпосылка сломана: переспрашивать можно. Наследовать рецепт целиком — значит не использовать главное преимущество агента. Агенту нужен доступ к знаниям как к инструменту: звать, когда сам решил, смотреть, что вернулось, звать снова, если пусто. Какой поиск лежит внутри инструмента — вопрос корпуса и диагностики, а не моды. Для корпуса с устойчивой терминологией — документация, код, тикеты — обычный ключевой поиск часто даёт не меньше векторного, а поддержки требует куда меньше. Векторный индекс оправдан, когда третий вопрос диагностики показал словарный разрыв.
Позиция редакции
Мы считаем: вопрос «нужен ли агенту RAG» поставлен неправильно. Агенту нужен инструмент доступа к знаниям, вызываемый столько раз, сколько потребуется; «RAG» как рецепт с одним извлечением на вопрос — архитектура для бота без цикла, не для агента. И почти никогда не стоит начинать с векторного индекса и тюнинга ретривера: в агентной системе поиск редко бывает самым слабым звеном — цикл умеет компенсировать его повторами, а сам цикл компенсировать некому. Поиск доставляет кандидатов. Решает судья.
Наша позиция неверна при трёх условиях, и мы признаем это прямо.
Если диагностика раз за разом падает в третий вопрос — ответы в корпусе есть, идеальный запрос их находит, реальный запрос агента мимо, — у вас чистый словарный разрыв, и кроме поиска он не чинится ничем. Вкладывайтесь в эмбеддинги, гибрид и реранкеры без сожалений.
Если у вас не агент, а однопроходный конвейер без права переспроса, поиск — узкое место по построению. Весь этот текст к вам не относится: делайте поиск хорошо с первого дня.
И если бюджет на попытки ограничен — латентность, цена вызовов, терпение пользователя — и агент не может позволить себе несколько заходов за знанием, компенсация повторами не работает. Тогда качество первого извлечения снова становится критичным, и наш тезис не действует.
Что делать вместо
Коротко, по очерёдности.
Дайте агенту поиск как инструмент, а не как автоматический шаг: пусть сам решает, искать ли, видит, что вернулось, и ходит снова, если пусто. Самое дешёвое изменение в списке и самое недооценённое — включает компенсацию повторами бесплатно.
Начните с ключевого поиска по нормализованному корпусу. Векторный индекс — реакция на диагноз «словарный разрыв», а не дефолт; диагноз ставится третьим вопросом, за вечер.
Мерьте конец-в-конец, по провалам, а не по метрикам слоя — как именно оценивать поведение модели за пределами одной точности, мы разбирали отдельно.
Держите гигиену корпуса: если ответа в корпусе нет, поможет не ML, а редактура. Самое скучное правило и самое частое.
И следите за судейством — за местом в цикле, где агент решает, «хватит ли». По построению это самое слабое место, и в продакшене оно отказывает раньше поиска; о том, что именно ломается на второй неделе, у нас есть отдельный материал.
Финальный вопрос, который стоит держать открытым, звучит не «какой у нас поиск», а «как агент понимает, что нашёл достаточно». Первый вопрос продают вендоры. Второй решает, будет ли работать ваш агент.