Многошаговый поиск в RAG: как устроен агент-ретривер
Классический RAG рассчитан на то, что ответ можно найти, правильно сформулировав один или несколько запросов к базе знаний за раз и получив нужные данные. Но есть целый ряд вопросов, при попытке ответить на которые LLM понимает, что ей действительно нужно для ответа только после просмотра базы знаний. Для поиска ответов здесь применяют многошаговый поиск.
Самая распространённая реализация — ReAct-цикл, где модель сама выбирает действия, а инструментом выступает поиск. Есть и другие варианты: жёсткие схемы с проверками в Self-RAG, CRAG и Adaptive-RAG, явная декомпозиция вопроса в IRCoT, обход графа знаний в Think-on-Graph. Это скорее фиксированные потоки с точками выбора, чем агенты. Разберём агентный вариант на примере открытого агента-ретривера T-Search. Он использует следующий набор инструментов: поиск, сохранение во внешнюю память и формирование итоговой выдачи из памяти (финализация). Ограничения на них задаёт харнесс — код вокруг LLM.
⚫️Шаг 1. Модель получает вопрос пользователя. Она рассуждает, чего не хватает для ответа, и вызывает поиск. Результаты сохраняются в контексте LLM, модель читает их и вызывает поиск снова с уточнённым запросом. Так повторяется несколько раз.
⚫️Шаг 2. Харнесс контролирует поиск. Запрос, повторяющий предыдущий, отклоняется — модель получает ошибку и вынуждена переформулировать. Чанки, уже показанные в текущем раунде, из выдачи вырезаются; несохранённые чанки из прошлых раундов могут прийти снова — возможно, модель отбросила их зря. Когда контекст заполнен на 75%, поиск блокируется, для LLM остаются доступными только сохранение и финализация.
⚫️Шаг 3. Если данных для ответа недостаточно, модель вызывает сохранение. Она сама решает, какие из найденных чанков нужны и почему, на какие части вопроса они уже отвечают, а какие остаются открытыми, и что стоит делать дальше. Харнесс при этом проверяет, что раунд был содержательным: выполнено минимум пять запросов, и хотя бы один чанк выбран для сохранения, иначе вызов отклоняется.
⚫️Шаг 4. Харнесс начинает новый раунд с чистым окном. В него попадают вопрос, сохранённые чанки с пояснениями и заметки модели о закрытых и открытых частях. Модель возвращается на шаг 1, но уже знает, что найдено и чего не хватает. Таких раундов ей разрешено сделать не больше пяти, после этого идёт принудительная финализация.
⚫️Шаг 5. Когда модель считает задачу решённой, она вызывает финализацию с ранжированным списком чанков и тем же отчётом о закрытых и открытых частях. Харнесс не читает чанки и не оценивает ответ, он смотрит только на пропорцию: если открытых частей половина или больше и раунд не последний, финализация отклоняется, модель ищет дальше.
В результате работы агента получаем ранжированный набор чанков. Генерация ответа по нему — отдельный шаг, устроенный так же, как и в обычном RAG-пайплайне.
💡Такой харнесс заработает и вокруг обычной tool-calling модели, но T-Search обучали под эту среду на синтетических задачах через SFT и RL, и без дообучения модель, скорее всего, будет справляться хуже.
Автор: Александр Абугалиев
Классический RAG рассчитан на то, что ответ можно найти, правильно сформулировав один или несколько запросов к базе знаний за раз и получив нужные данные. Но есть целый ряд вопросов, при попытке ответить на которые LLM понимает, что ей действительно нужно для ответа только после просмотра базы знаний. Для поиска ответов здесь применяют многошаговый поиск.
Самая распространённая реализация — ReAct-цикл, где модель сама выбирает действия, а инструментом выступает поиск. Есть и другие варианты: жёсткие схемы с проверками в Self-RAG, CRAG и Adaptive-RAG, явная декомпозиция вопроса в IRCoT, обход графа знаний в Think-on-Graph. Это скорее фиксированные потоки с точками выбора, чем агенты. Разберём агентный вариант на примере открытого агента-ретривера T-Search. Он использует следующий набор инструментов: поиск, сохранение во внешнюю память и формирование итоговой выдачи из памяти (финализация). Ограничения на них задаёт харнесс — код вокруг LLM.
⚫️Шаг 1. Модель получает вопрос пользователя. Она рассуждает, чего не хватает для ответа, и вызывает поиск. Результаты сохраняются в контексте LLM, модель читает их и вызывает поиск снова с уточнённым запросом. Так повторяется несколько раз.
⚫️Шаг 2. Харнесс контролирует поиск. Запрос, повторяющий предыдущий, отклоняется — модель получает ошибку и вынуждена переформулировать. Чанки, уже показанные в текущем раунде, из выдачи вырезаются; несохранённые чанки из прошлых раундов могут прийти снова — возможно, модель отбросила их зря. Когда контекст заполнен на 75%, поиск блокируется, для LLM остаются доступными только сохранение и финализация.
⚫️Шаг 3. Если данных для ответа недостаточно, модель вызывает сохранение. Она сама решает, какие из найденных чанков нужны и почему, на какие части вопроса они уже отвечают, а какие остаются открытыми, и что стоит делать дальше. Харнесс при этом проверяет, что раунд был содержательным: выполнено минимум пять запросов, и хотя бы один чанк выбран для сохранения, иначе вызов отклоняется.
⚫️Шаг 4. Харнесс начинает новый раунд с чистым окном. В него попадают вопрос, сохранённые чанки с пояснениями и заметки модели о закрытых и открытых частях. Модель возвращается на шаг 1, но уже знает, что найдено и чего не хватает. Таких раундов ей разрешено сделать не больше пяти, после этого идёт принудительная финализация.
⚫️Шаг 5. Когда модель считает задачу решённой, она вызывает финализацию с ранжированным списком чанков и тем же отчётом о закрытых и открытых частях. Харнесс не читает чанки и не оценивает ответ, он смотрит только на пропорцию: если открытых частей половина или больше и раунд не последний, финализация отклоняется, модель ищет дальше.
В результате работы агента получаем ранжированный набор чанков. Генерация ответа по нему — отдельный шаг, устроенный так же, как и в обычном RAG-пайплайне.
💡Такой харнесс заработает и вокруг обычной tool-calling модели, но T-Search обучали под эту среду на синтетических задачах через SFT и RL, и без дообучения модель, скорее всего, будет справляться хуже.
Автор: Александр Абугалиев
Присоединяйтесь к курсу LLM System Design, который стартует уже 30 сентября! Изучайте программу и записывайтесь на новый поток на сайте. До 20 сентября действует скидка 20%.