3,583 papers
arXiv:2610.21184 73 15 окт. 2026 г. FREE

Реестр требований (ExecutionRAG): как не дать поисковому агенту потерять недорешённый подвопрос

КЛЮЧЕВАЯ СУТЬ
Обнаружено: в 66–69% неверных ответов сильного поискового агента не хватало хотя бы одного нужного документа. Виноват не поисковик. Агент просто не запросил документ. Метод ExecutionRAG позволяет вести многошаговый поиск и не терять недорешённый подвопрос. Агент ведёт реестр требований: список подвопросов со статусом, заметкой и источниками. Фишка: следующий поиск строится под открытый пункт, а не под весь вопрос. Так лечится дрейф поиска: агент цепляется не за ту сущность и сливает на неё все попытки. Нужные документы теряются заметно реже.
Адаптировать под запрос
⚡

TL;DR

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

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

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

🔬

Схема метода

ШАГ 0: Один пробный поиск по вопросу → набор найденных фрагментов
ШАГ 1: По вопросу + найденному составить реестр подвопросов
        (один "active", остальные "pending", заметки пустые)
ШАГ 2 (цикл): взять открытый пункт → искать под него
        → обновить только затронутые пункты:
        статус / заметка / источники
ШАГ 3: Показывать агенту только изменения реестра (дельту)
ШАГ 4: Ответить, когда открытых пунктов нет.
        Кончился бюджет поиска → частичный ответ с перечнем неподтверждённого

ПРАВИЛА: пункт уходит из списка только как "retired" с причиной.
         Источники только добавляются, не стираются.

В статье это код-агент с несколькими вызовами модели. Правила «пункт не исчезает» и «источники не стираются» там выполняет код. В чате или в инструкции агенту их можно задать словами (см. шаблон).

🚀

Пример применения

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

Задача: Аналитик инвест-фонда готовит справку перед сделкой. Нужно выяснить, кто директор компании — крупнейшего поставщика категории на маркетплейсе, и в каких ещё компаниях он числится руководителем или учредителем. Цепочка: поставщик → директор → его другие компании → пересечения с конкурентами. Обычный агент легко «схватится» за соучредителя вместо директора и дальше копает не того человека.

Промпт:


Ты — исследовательский агент. Ты не отвечаешь, пока в реестре есть открытые пункты.



Выяснить: кто является генеральным директором компании — крупнейшего
поставщика категории «{категория}» на {маркетплейс}, и в каких ещё
компаниях он является директором или учредителем.
Источники: открытые реестры, сайты компаний, новости, отраслевые обзоры.



Шаг 0. Сделай один пробный поиск по задаче.
Шаг 1. По задаче и найденному составь реестр подвопросов.
Для каждого пункта веди:
- id и формулировка
- статус: pending / active / resolved / retired
- заметка (что известно и чего не хватает)
- источники (ссылки или названия документов)
Один пункт — active, остальные — pending.



Пока есть пункты pending или active:
1. Выбери открытый пункт.
2. Сформулируй поисковый запрос под ЭТОТ пункт. Учти исходную задачу
   и заметку: что для него ещё не найдено.
3. Найди информацию.
4. Обнови только те пункты, которых коснулась находка.
5. Покажи мне только изменения: пункт, старый статус → новый статус, заметка.



- Пункт нельзя убрать из реестра молча. Только статус retired
  с явной причиной (например, «позднее источник опроверг это допущение»).
- resolved ставь, только если источников достаточно для ответа на пункт.
- Источники только добавляй. Не стирай то, что уже записано.
- Не повторяй запрос, который уже делал.



Когда открытых пунктов нет — дай итоговый ответ и список пунктов с источниками.
Если ты сделал {число_поисков} поисков и пункты остались открытыми —
дай частичный ответ и прямо перечисли, что не подтверждено.

Результат: Сначала придёт реестр из 3–5 пунктов вроде «кто поставщик → кто его директор → какие ещё компании связаны с директором → пересечения». Дальше модель покажет по шагам только изменения: какой пункт закрыт, что записано в заметку, какой источник добавлен. В конце будет итоговая справка со ссылками на пункты. Если часть цепочки не подтвердилась, модель прямо перечислит открытое, а не «додумает».

🧠

Почему это работает

Слабость. Модель на длинной цепочке поиска держит план «в голове», то есть в потоке рассуждений. Одно неточное попадание (не тот человек, не та компания) подменяет цель, и неотвеченный подвопрос тихо теряется. Запросы дальше строятся вокруг ошибочной сущности. Кроме того, модель любит повторно искать то, что уже нашла.

Сильная сторона. Модель хорошо ведёт структурированную запись и следует явному списку: что открыто, что закрыто, чем подтверждено. Из заметки «чего не хватает» она точно строит следующий запрос. Явный список заставляет её каждый шаг адресовать конкретному пункту.

Как метод это использует. Реестр выносит состояние на поверхность: виден каждый момент «закрыл пункт». Правила «не удаляй пункт молча» и «источники только добавляются» не дают потерять цель и доказательства. Реестр составляется по пробному поиску, а не «из воздуха». Поэтому пункты получаются конкретными, а не размытыми и не такими, на которые в источниках нет ответа.

Рычаги управления: - Число пунктов и бюджет поиска — уменьши для простых задач (экономия токенов), увеличь для длинных цепочек. - Пробный поиск (Шаг 0) — убери, если тема вам хорошо знакома и цепочку вы можете написать сами. - Показ дельты — замени на «покажи весь реестр», если нужно полное наблюдение. Но контекст будет расти. - Условие закрытия пункта — ужесточи («resolved только с прямой цитатой»), если важна надёжность.

📋

Шаблон промпта


Ты — исследовательский агент. Ты не отвечаешь, пока в реестре есть открытые пункты.



{задача: вопрос, на который нужно ответить цепочкой фактов}
Источники: {где искать}.



Шаг 0. Сделай один пробный поиск по задаче.
Шаг 1. По задаче и найденному составь реестр подвопросов.
Для каждого пункта веди:
- id и формулировка
- статус: pending / active / resolved / retired
- заметка (что известно, чего не хватает)
- источники
Один пункт — active, остальные — pending.



Пока есть пункты pending или active:
1. Выбери открытый пункт.
2. Сформулируй запрос под ЭТОТ пункт с учётом исходной задачи и заметки.
3. Найди информацию.
4. Обнови только затронутые пункты.
5. Покажи мне только изменения: пункт, статус до → после, заметка.



- Пункт нельзя убрать молча. Только retired с явной причиной.
- resolved — только если источников достаточно для ответа на пункт.
- Источники только добавляй, не стирай.
- Не повторяй уже сделанные запросы.



Нет открытых пунктов → итоговый ответ + пункты с источниками.
После {число_поисков} поисков остались открытые → частичный ответ
с перечнем неподтверждённого.

Что подставлять: {задача} — вопрос, где ответ собирается из 2–4 зависимых фактов. {где искать} — реальные источники, к которым у агента есть доступ. {число_поисков} — разумный предел, например 10–15.

🚀 Быстрый старт — вставь в чат:

Вот шаблон реестра требований для многошагового поиска. Адаптируй под мою задачу: [твоя задача]. 
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит, какой именно вопрос нужно разложить, где можно искать и сколько поисков допустимо. Это нужно, чтобы реестр строился под реальные источники и бюджет, а не абстрактно. Она возьмёт паттерн из шаблона и соберёт рабочий промпт под вашу цепочку фактов.

⚠️

Ограничения

⚠️ Исходная реализация — код: в статье это агент с несколькими вызовами модели и правилами, которые выполняет программа, а не сама модель. Шаблон выше — перенос идеи в текстовую инструкцию. Готовых промптов в основном тексте статьи нет, и сам перенос авторы не проверяли. В чате модель может нарушать правила «не удаляй пункт».

⚠️ Простые вопросы: на двухшаговых вопросах, которые решаются сравнением из одного-двух источников, эффект почти нулевой. Метод помогает там, где подвопросы зависят друг от друга.

⚠️ Реестр не проверяет сам себя: модель сама решает, что пункт закрыт. После внедрения реестра выросло число преждевременных закрытий и отказов отвечать. Общая ошибка упала заметно меньше, чем число «потерянных» документов.

⚠️ Длинные цепочки остаются трудными: на четырёх шагах недостающих документов по-прежнему больше всего. Реестр не сделает недоступное доступным.

⚠️ Цена: метод тратит больше токенов и вызовов. На сложном наборе он читал около семи тысяч токенов поиска на вопрос.

⚠️ Старая модель в исследовании: все результаты получены на одной маленькой модели (GPT-4o-mini). Как это изменится на сильных современных моделях — неизвестно.

🔍

Как исследовали

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

Сравнивали с сильным агентом A-RAG на 1000 вопросах из трёх наборов (HotpotQA, 2WikiMultiHopQA, MuSiQue) и с кучей других методов. Каждому неверному ответу присваивали одну причину по строгому порядку: ошибка судьи, отказ, ошибка рассуждения, нехватка документа. На MuSiQue число ответов с недостающим документом упало с 382 до 234 (один поисковик) и с 383 до 274 (второй).

Неожиданность: общая точность выросла с 44,9 до 50,2 — гораздо скромнее. Ошибки рассуждения выросли с 9% до 26%, отказы — с 7% до 13%. Авторы честно оговаривают: часть роста — просто наблюдаемость, потому что у реестра каждое «закрыл пункт» записано, а у базового агента преждевременные ответы засчитывались как «не нашёл». Прирост сильнее всего на 2Wiki, где нужно держать цепочку зависимых подвопросов, а на HotpotQA почти нет. Это подтверждает механизм. Контроль на «просто читает больше текста» тоже есть: на 2Wiki реестр дал максимум прироста при том же или меньшем объёме найденного.

Практический вывод: после починки поиска главная проблема агента — поспешные «готово». Одной декомпозиции мало, нужна проверка достаточности.

💡

Адаптации и экстраполяции

🔧 Техника: ужесточить условие закрытия пункта → меньше преждевременных «resolved»

Статья показывает, что узкое место теперь — достаточность доказательств. Добавьте в проверку (это наша идея, в статье она не тестировалась):

- Перед статусом resolved процитируй фразу из источника, которая прямо
  отвечает на пункт. Нет прямой цитаты — оставь пункт открытым и допиши в заметку,
  чего не хватает.

Экстраполяция: реестр в файле инструкций агента. Для агента-исследователя в Claude Code или в кастомном GPT поместите блок , , в системный промпт или CLAUDE.md. Дополнительно попросите агента вести реестр в отдельном файле register.md и обновлять его после каждого шага. Тогда состояние живёт вне потока рассуждений и не теряется на длинной сессии.

🔗

Ресурсы

  • Работа: Beyond Retrieval Failure: Understanding Why LLMs Miss Evidence in Multi-Hop RAG, DAI '26 (Гонконг).
  • Авторы: Jiaqi Wei (Zhejiang University, Shanghai AI Laboratory), Wenxuan Huang (Fudan University), Chengdong Xu (Sun Yat-sen University), Xiang Zhang (University of British Columbia), Wanli Ouyang (Chinese University of Hong Kong).
  • Наборы данных: MuSiQue, HotpotQA, 2WikiMultiHopQA.
  • Сравнивали с: A-RAG (основной базовый агент), IRCoT, HippoRAG / HippoRAG 2, LinearRAG, LAG, GFM-RAG и др.

📋 Дайджест исследования

Ключевая суть

Обнаружено: в 66–69% неверных ответов сильного поискового агента не хватало хотя бы одного нужного документа. Виноват не поисковик. Агент просто не запросил документ. Метод ExecutionRAG позволяет вести многошаговый поиск и не терять недорешённый подвопрос. Агент ведёт реестр требований: список подвопросов со статусом, заметкой и источниками. Фишка: следующий поиск строится под открытый пункт, а не под весь вопрос. Так лечится дрейф поиска: агент цепляется не за ту сущность и сливает на неё все попытки. Нужные документы теряются заметно реже.

Принцип работы

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

Почему работает

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

Когда применять

Многошаговый поиск → ответ собирается цепочкой зависимых фактов, где каждый следующий запрос зависит от прошлого ответа. Например, поставщик → директор → его другие компании → пересечения с конкурентами. Особенно когда легко схватиться за соседнюю сущность (соучредителя вместо директора). НЕ подходит для простых вопросов в одно-два действия: эффект почти нулевой. Цена тоже есть: больше токенов и вызовов. На сложном наборе агент читал около семи тысяч токенов поиска на вопрос. Важная оговорка. В статье это код-агент, и правила «не удаляй пункт» выполняет программа. Перенос в текстовый промпт авторы не проверяли. В чате модель может эти правила нарушать. Все результаты получены на одной маленькой модели (GPT-4o-mini).

Мини-рецепт

1. Выбери задачу: вопрос, где ответ собирается из 2–4 зависимых фактов.
2. Назови источники: только те, к которым у агента есть доступ.
3. Запрети отвечать раньше времени: <роль>Ты — исследовательский агент. Ты не отвечаешь, пока в реестре есть открытые пункты.
4. Начни с разведки: один пробный поиск, потом реестр. У каждого пункта: номер, формулировка, статус (ждёт / ищем / закрыт / снят), заметка «что известно, чего не хватает», источники.
5. Запусти цикл: взял открытый пункт, составил запрос под него с учётом заметки, нашёл, обновил только затронутые пункты.
6. Покажи только изменения: пункт, статус до → после, заметка. Иначе контекст раздуется.
7. Поставь замки: пункт не убирается молча, только «снят» с причиной. Источники не стираются. Один и тот же запрос не повторять.
8. Задай потолок: лимит поисков, например 10–15. Кончился лимит — частичный ответ и список неподтверждённого.
9. Если важна надёжность: ужесточи закрытие, например «закрыт только с прямой цитатой». Модель любит закрывать пункты досрочно.

Примеры

[ПЛОХО] : Найди, кто директор крупнейшего поставщика категории «умные колонки» на маркетплейсе и в каких ещё компаниях он учредитель
[ХОРОШО] : Ты — исследовательский агент. Не отвечай, пока в реестре есть открытые пункты. Задача: выяснить, кто генеральный директор крупнейшего поставщика категории «умные колонки» на маркетплейсе и в каких ещё компаниях он директор или учредитель. Шаг 0: сделай один пробный поиск. Шаг 1: составь реестр подвопросов. У каждого пункта: номер, статус (ждёт / ищем / закрыт / снят), заметка «что известно, чего не хватает», источники. Один пункт «ищем», остальные «ждёт». Цикл: возьми открытый пункт, составь запрос под него, обнови только затронутые пункты и покажи мне только изменения. Пункт нельзя убрать молча, только «снят» с причиной. Источники не стирай. Закрывай пункт, только если источников хватает для ответа. После 12 поисков, если что-то открыто, дай частичный ответ и перечисли неподтверждённое. Что изменится: агент не схватится за соучредителя вместо директора. Если он схватился, запись в реестре это покажет, и пункт про директора останется открытым. В конце придёт справка со ссылками на пункты. Если цепочка не подтвердилась, модель прямо перечислит дыры, а не додумает.
Источник: Beyond Retrieval Failure: Understanding Why LLMs Miss Evidence in Multi-Hop RAG
ArXiv ID: 2610.21184 | Сгенерировано: 2026-10-16 08:20

Проблемы LLM

ПроблемаСутьКак обойти
В многошаговом поиске модель цепляется не за ту сущность и теряет недорешённый подвопросОтвет собирается цепочкой: компания → директор → его другие компании. Модель находит промежуточный факт и берёт не того человека или не ту фирму. Дальше все запросы строятся вокруг ошибки. Нужный документ был доступен, но его не запросили. В логе это выглядит как «поиск ничего не нашёл». Вину сваливают на поисковик, хотя виновата цепочка запросов. Причина: счётчика открытых вопросов нет. План живёт в потоке рассуждений и размываетсяНе держи план в рассуждениях. Заведи явный список подвопросов со статусами и заметками. Каждый запрос строй под один открытый пункт. Пункт нельзя убрать молча. Подробности в методе ниже
Когда вопросы учтены явным списком, модель закрывает пункты раньше времени или сдаётсяТы добавил структуру, и потерянных подвопросов стало меньше. Теперь модель сама решает, что пункт закрыт. Она отмечает «готово» при слабых источниках. Или отказывается отвечать. Ошибок становится меньше, но не настолько, насколько ожидаешь. Узкое место сместилось с «найти» на «убедиться, что хватает»Ужесточи условие закрытия. Например: «resolved только с прямой цитатой из источника». Требуй записать, чем именно подтверждён пункт. Для важных задач добавь отдельную проверку закрытых пунктов. Авторы такой перенос на чат не проверяли. Модель может нарушать правила

Методы

МетодСуть
Реестр требований — не даёт потерять подвопрос в цепочке поискаЧто делать. Попроси агента вести список подвопросов. У каждого пункта: id, формулировка, статус (pending / active / resolved / retired), заметка «что известно, чего не хватает», источники. Один пункт active, остальные pending. Цикл: взять открытый пункт → построить запрос под него с учётом заметки → обновить только затронутые пункты → показать только изменения («пункт, статус до → после»). Правила: пункт уходит только как retired с причиной. Источники только добавляются. Запросы не повторяются. Отвечать можно, когда открытых пунктов нет. Кончился бюджет поисков: дай частичный ответ и перечисли неподтверждённое. Почему работает: состояние выносится из рассуждений на поверхность. Виден каждый момент «закрыл пункт». Явный список заставляет адресовать каждый шаг конкретному пункту. Из заметки «чего не хватает» модель точно строит следующий запрос. Когда да: ответ собирается из 3+ зависимых фактов, и каждый поиск зависит от прошлого результата. Когда нет: простые вопросы в 1–2 шага. Эффект почти нулевой, а токенов уходит больше. Рычаги: меньше пунктов и поисков для простых задач, больше для длинных цепочек. «Покажи весь реестр» вместо дельты даёт полный обзор, но контекст растёт. Бюджет поисков задай числом, например 10–15
📖 Простыми словами

Beyond Retrieval Failure: Understanding WhyLLMsMiss Evidence in Multi-Hop RAG

arXiv: 2610.21184

Когда модель ищет ответ на сложный вопрос через Multi-Hop RAG, она лажает не из-за тупого поисковика, а из-за собственной памяти. Агент держит весь план расследования «в уме», прямо в бесконечной простыне рассуждений. Стоит ему наткнуться на однофамильца или не ту компанию, фокус слетает, и нужный подвопрос тихо теряется. Модель начинает гуглить по второму кругу уже найденное или закапывается в ложную ветку, выдавая в итоге полный провал вместо ответа.

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

Решение проблемы — метод ExecutionRAG, который превращает хаотичные мысли агента в строгий реестр требований. Модель заставляют делить глобальную задачу на подвопросы со статусами: «ждёт», «ищем сейчас», «закрыт» или «снят». Следующий запрос в поиск формулируется строго под один открытый пункт, а не под исходную кашу из промпта. Финальный ответ агент выдает только тогда, когда незакрытых задач не осталось.

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

Мораль простая: хватит надеяться на «сообразительность» LLM, заменяй надежду на память армейской дисциплиной процессов. В многошаговом поиске решает не размер контекстного окна, а внешний трекинг задач. Заставляй модель документировать статусы через реестр открытых пунктов, иначе твой агент так и останется склеротиком, который уверенно сливает бюджет на холостые запросы.

Работа с исследованием

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

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с