3,583 papers
arXiv:2609.29444 81 24 сент. 2026 г. FREE

IterSynth: разделение ролей «Планировщик» и «Синтезатор» с перезапуском контекста для глубокого поиска

КЛЮЧЕВАЯ СУТЬ
Агент, который ищет по шагам (думает, ищет, читает, снова думает), на сложном бенчмарке в большинстве случаев не доходил до ответа. Контекст кончался раньше. Метод IterSynth позволяет вести поиск на десятки запросов и не терять факты, а противоречия между источниками не пропадают. Фишка: планировщик вообще не видит сырых страниц, а каждый круг начинается с чистого контекста из вопроса и сводки. Одна и та же модель работает в двух ролях, дообучение не нужно. Результат честный: прирост над ReAct в единицы пунктов, в лучшем случае около 10. Зато он получен без обучения, только за счёт устройства цикла. Сводка становится единственной памятью.
Адаптировать под запрос
⚡

TL;DR

IterSynth — схема для задач, где нужно много раз искать и собирать факты из разных источников. Одна модель работает по кругу в двух ролях. Планировщик смотрит на вопрос и текущую сводку и решает: искать дальше (и что именно) или уже отвечать. Синтезатор получает найденные тексты и обновляет сводку: убирает мусор, добавляет факты, сглаживает противоречия. На каждом круге контекст собирается заново из двух вещей: исходный вопрос и актуальная сводка. Вся история поиска в него не тащится.

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

Метод решает это двумя ходами. Первый: роли разделены жёстко. Планировщик не видит сырых результатов поиска, а Синтезатор не может искать и отвечать. Второй: сводка — единственная память, а контекст каждый раз пересобирается. На двух сильных моделях без всякого дообучения такая схема дала заметный прирост над ReAct.

🔬

Схема метода

ЦИКЛ (пока Планировщик не выдаст answer):

ШАГ 1. ПЛАНИРОВЩИК
  Видит: вопрос + сводка (и больше ничего)
  Делает: думает, что известно и чего не хватает
  Выдаёт: search("запрос")  ИЛИ  answer("итог")

ШАГ 2. ПОИСК (инструмент или человек)
  Выполняет запрос → возвращает найденные тексты

ШАГ 3. СИНТЕЗАТОР
  Видит: вопрос + сводка + решение Планировщика + найденные тексты
  Делает: фильтрует шум, вытаскивает факты, разрешает противоречия
  Выдаёт: НОВУЮ сводку (старая заменяется)
  Не может: искать и отвечать

→ Контекст сбрасывается. Следующий круг начинается с (вопрос + новая сводка).

Роли — один и тот же LLM с разными ролевыми инструкциями. Отдельные модели не нужны.

🚀

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

Задача: Вы готовите для инвестора разбор рынка быстрой доставки продуктов в России. Нужны выручка и доля Самоката, Яндекс Лавки, ВкусВилл и «Магнит Экспресс», с датами и источниками. Данные разбросаны по отчётам, интервью и новостям и местами противоречат друг другу. В одном чате на 30 запросов модель запутается в цифрах за разные годы.

Промпт (Планировщик, круг 1):


Ты — Планировщик глубокого поиска. Ты не читаешь сырые результаты поиска. Ты работаешь только с вопросом и сводкой. Твоя задача — понять, чего в сводке не хватает, и сформулировать ОДИН следующий поисковый запрос. Либо, если данных достаточно, дать финальный ответ.



Сравни крупнейших игроков быстрой доставки продуктов в России: Самокат, Яндекс Лавка, ВкусВилл, Магнит Экспресс. Для каждого нужны выручка (GMV или оборот) за последний доступный год, доля рынка и источник с датой. Укажи, где источники расходятся.



Пока пусто.



- Один запрос за круг, конкретный и пригодный для поисковика.
- Не повторяй запросы, уже отражённые в сводке.
- Отвечай только если по каждому игроку есть цифры с источником, а расхождения отмечены.



Think: что известно, чего не хватает, почему выбираю этот запрос.
Action: search("...") ИЛИ answer("...")

Вы (или агент с поиском) выполняете запрос. Затем отдаёте Синтезатору его результат вместе со старой сводкой, и он пишет новую. Потом начинаете новый чат: вопрос + новая сводка + промпт Планировщика.

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

🧠

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

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

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

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

Рычаги управления: - Что требовать от сводки. Структура (факты / расхождения / пробелы) определяет, насколько Планировщик видит дыры. Чем конкретнее поля, тем точнее следующий запрос. - Условие остановки. «Отвечай, только если по каждому игроку есть цифра с источником» — защита от преждевременного ответа. Замените на свой критерий готовности. - Один запрос за круг или несколько. Для простых задач разрешите 2–3 запроса — быстрее. Для сложных оставьте один — точнее. - Жёсткий запрет для Синтезатора («не ищи, не отвечай»). Это ключ метода. Если убрать, роли снова склеятся.

📋

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

Промпты самих авторов в доступной части статьи не приведены (они в приложении). Шаблон ниже — реконструкция по описанию ролей, входов и допустимых действий из статьи.

Промпт 1 — Планировщик:


Ты — Планировщик. Ты видишь только вопрос и текущую сводку. Определи, каких сведений не хватает, и выдай один следующий поисковый запрос. Если сведений достаточно — выдай финальный ответ.


{вопрос}

{сводка_или_"пока пусто"}


- Не повторяй запросы, уже отражённые в сводке.
- Запрос должен быть конкретным и пригодным для поисковика.
- Отвечай, только если выполнено: {критерий_готовности}.



Think: что известно, чего не хватает, почему именно этот запрос.
Action: search("...") ИЛИ answer("...")

Промпт 2 — Синтезатор:


Ты — Синтезатор. Твоя единственная задача — обновить сводку. Ты НЕ формулируешь новые запросы и НЕ даёшь финальный ответ.


{вопрос}
{текущая_сводка}
{последнее_решение_Планировщика}
{найденные_тексты}


- Отбрось нерелевантное.
- Добавь полезные факты, у каждого — источник и дата.
- Если новые данные противоречат сводке — запиши оба варианта и пометь расхождение.
- Не выдумывай. Чего нет в найденном — в сводку не попадает.
- Сводка должна оставаться компактной: сжимай, а не дописывай.



Think: что нового, что отброшено, что противоречит.
Summary: {полная обновлённая сводка — она заменяет старую}

Что подставлять: - {вопрос} — исходная задача целиком, без изменений на каждом круге. - {критерий_готовности} — когда можно отвечать, например «по каждому игроку есть цифра, источник и дата». - {сводка_или_"пока пусто"} — на первом круге «пока пусто», дальше выход Синтезатора. - {найденные_тексты} — то, что вернул поиск или что вы нашли сами.

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

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

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

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

⚠️

Ограничения

⚠️ Основной результат — про обученную модель: главные цифры статьи получены на маленькой модели, которую авторы дообучали (SFT + RL). Читателю это недоступно. Из статьи применим только режим «без обучения», где выигрыш скромнее.

⚠️ Нужен цикл с пересборкой контекста: в обычном чате контекст растёт сам. Чтобы метод работал, нужно переносить «вопрос + сводку» в новый чат вручную или настроить агента, который делает это сам. В экспериментах это делал оркестратор.

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

⚠️ Избыточно для простых вопросов: если ответ находится за 2–3 запроса, два роля и сброс контекста только добавят работы.

⚠️ Проверено на задачах с одним проверяемым ответом: бенчмарки — это поиск конкретного факта. Для открытых аналитических отчётов, где «правильного ответа» нет, выигрыш статья не измеряла.

⚠️ Прирост умеренный: на сильных моделях это единицы пунктов в среднем, лучший случай — около десяти на одном бенчмарке. Не прорыв, а аккуратное улучшение.

🔍

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

Авторы сделали две вещи. Во-первых, взяли небольшую модель (8 млрд параметров), дообучили её работать по схеме «Планировщик ↔ Синтезатор» и сравнили с другими небольшими и более крупными агентами на пяти сложных поисковых бенчмарках. Маленькая модель обошла прежний лучший результат среди себе подобных и приблизилась к некоторым моделям втрое крупнее.

Во-вторых, проверили саму схему как чистый промптинг. Взяли Claude-4.5-Opus и DeepSeek-V3.1, без всякого обучения, и прогнали через четыре бенчмарка в трёх режимах: обычный ReAct, IterResearch (ближайший конкурент: тоже пересобирает контекст из отчёта) и IterSynth. IterSynth дал прирост к ReAct в среднем около +5,5 пункта на Claude и около +4,5 на DeepSeek. Лучший случай — до +10 на китайском BrowseComp. IterResearch он тоже обошёл на большинстве бенчмарков.

Любопытная деталь: в одном из приложений авторы замерили, что ReAct на сложном бенчмарке при 64К контексте в большинстве случаев (больше 59%) вообще не доходил до ответа — контекст кончался. Это показывает, что проблема не в уме модели, а в раздувающейся истории.

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

💡

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

💡 Адаптация для Claude Code / агента с файлами (моя достройка, в статье такого нет):

В CLAUDE.md задайте два режима и файл-память:

## Режим исследования
Состояние поиска хранится ТОЛЬКО в файле research/summary.md.
Каждый круг:
1. ПЛАНИРОВЩИК: прочитай вопрос и summary.md. Ничего больше. Определи, чего не хватает. Запиши ОДИН запрос в research/next_query.txt либо выдай финальный ответ.
2. Выполни поиск. Сырые результаты сохрани в research/raw_N.md.
3. СИНТЕЗАТОР: прочитай summary.md и raw_N.md. Перепиши summary.md целиком: факты с источником и датой, расхождения, пробелы. Не ищи и не отвечай.
4. Перед следующим кругом не опирайся на память о прошлых шагах — только на summary.md.

🔧 Техника: добавить в сводку раздел «пробелы» → острее следующий запрос

В промпте Синтезатора требуйте поля Подтверждено, Противоречия, Не найдено. Планировщик получает готовый список дыр и точнее формулирует запросы (идея-достройка, статья этого не проверяла).

🔗

Ресурсы

  • Работа: IterSynth: Rethinking Deep Search Agents via Role-Decoupled Iterative Synthesis
  • Код: https://github.com/Tencent/IterSynth
  • Авторы: Xingyu Wu, Yuchen Yan, Zhengxi Lu, Siqi Chen, Xin Zhang, Aiting Liu, Chao Deng, Jie Liu, Jin Ma, Jian Shao, Jun Xiao, Yongliang Shen — Zhejiang University, Tencent
  • Упомянутые подходы: ReAct (Yao et al., 2023), IterResearch, ReSum, AgentFold, InfoFlow
  • Бенчмарки: BrowseComp, BrowseComp-ZH, GAIA, Xbench-DeepSearch

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

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

Агент, который ищет по шагам (думает, ищет, читает, снова думает), на сложном бенчмарке в большинстве случаев не доходил до ответа. Контекст кончался раньше. Метод IterSynth позволяет вести поиск на десятки запросов и не терять факты, а противоречия между источниками не пропадают. Фишка: планировщик вообще не видит сырых страниц, а каждый круг начинается с чистого контекста из вопроса и сводки. Одна и та же модель работает в двух ролях, дообучение не нужно. Результат честный: прирост над ReAct в единицы пунктов, в лучшем случае около 10. Зато он получен без обучения, только за счёт устройства цикла. Сводка становится единственной памятью.

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

Цикл из трёх шагов. 1. Планировщик видит вопрос и сводку. Больше ничего. Он думает, чего не хватает, и выдаёт один поисковый запрос. Либо, если пробелов нет, итоговый ответ. 2. Поиск возвращает тексты. Вы можете сделать это руками или отдать агенту. 3. Синтезатор получает вопрос, старую сводку, решение Планировщика и найденные тексты. Он выкидывает шум, добавляет факты, помечает расхождения и пишет новую сводку вместо старой. Искать и отвечать ему запрещено. Потом контекст сбрасывается. Новый круг стартует с пары «вопрос + сводка». Всё, что не попало в сводку, для следующего круга не существует. Это как рабочий стол, с которого в конце дня убирают все бумаги. Остаётся конспект и задача. Утром не придётся разгребать вчерашние черновики.

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

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

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

Сбор фактов из многих источников → конкретно для разбора рынка, сравнения компаний, проверки цифр, особенно когда данные разбросаны по отчётам и новостям и местами противоречат друг другу. НЕ подходит для простых вопросов: если ответ находится за 2–3 запроса, два промпта и сброс контекста только добавят работы. Для открытых аналитических отчётов, где нет одного правильного ответа, выигрыш статья не измеряла. И помни главный риск: если Синтезатор выбросит важный факт, Планировщик его уже не увидит.

Мини-рецепт

1. Заведи два промпта: Планировщик и Синтезатор. Это одна и та же модель с разными ролевыми инструкциями.
2. Задай условие остановки: например, <критерий>по каждому игроку есть цифра, источник и дата. Без него модель ответит раньше времени.
3. Первый круг: отдай Планировщику вопрос и сводку «пока пусто». Он вернёт один конкретный запрос.
4. Выполни запрос сам или через агента с поиском.
5. Отдай всё Синтезатору: вопрос, старую сводку, решение Планировщика и найденные тексты. Запрети ему искать и отвечать.
6. Проверь сводку глазами. Особенно на ключевых шагах: не выкинул ли он что-то важное.
7. Открой новый чат. Вставь туда промпт Планировщика, вопрос и новую сводку. Старую переписку не тащи.
8. Повторяй, пока Планировщик не выдаст итоговый ответ вместо запроса.
9. Если лень писать промпты: вставь шаблон в чат и попроси LLM адаптировать его под твою задачу, задавая вопросы про поля сводки и критерий готовности.

Примеры

[ПЛОХО]: `Найди выручку и долю рынка Самоката, Яндекс Лавки, ВкусВилл и Магнит Экспресс, сравни и дай отчёт с источниками`. Всё в одном чате на 30 запросов. К двадцатому запросу цифры за разные годы перемешиваются. [ХОРОШО, Планировщик]: `Ты Планировщик. Видишь только вопрос и сводку. Выдай ОДИН следующий поисковый запрос или итоговый ответ. Отвечай, только если по каждому игроку есть выручка, доля рынка, источник и дата. Вопрос: сравни Самокат, Яндекс Лавку, ВкусВилл и Магнит Экспресс. Сводка: пока пусто` [ХОРОШО, Синтезатор]: `Ты Синтезатор. Обнови сводку по найденным текстам. Не ищи и не отвечай. У каждого факта укажи источник и дату. Если цифры противоречат, запиши оба варианта и пометь расхождение. Сводку сжимай, а не дописывай` После нескольких кругов сводка выглядит как аккуратная таблица: факты по игрокам, источники, список расхождений и пробелы. Планировщик видит, что пробелов нет, и сам выдаёт ответ.
Источник: IterSynth: Rethinking Deep Search Agents via Role-Decoupled Iterative Synthesis
ArXiv ID: 2609.29444 | Сгенерировано: 2026-10-09 09:00

Проблемы LLM

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

Методы

МетодСуть
Две роли и сброс контекста — чистая память на каждом шагеЧто делать. Раздели работу на две роли. Это может быть одна и та же модель с разными инструкциями. Планировщик видит только вопрос и сводку. Он решает: что искать дальше или пора отвечать. Выдаёт search("...") или answer("..."). Синтезатор видит вопрос, сводку, решение Планировщика и найденные тексты. Он убирает шум, добавляет факты с источником и датой, помечает противоречия. Выдаёт новую сводку, и она заменяет старую. Ему запрещено искать и отвечать. После каждого круга начинай новый чат: + . Почему работает. Каждая роль решает одну узкую задачу, и с ней модель справляется лучше. Планировщик не видит сырых текстов, поэтому не отвлекается на детали. Синтезатор не может отвечать, поэтому занят только очисткой памяти. Сброс контекста не даёт шуму копиться. Рычаги. (1) Задай поля сводки: «факты / расхождения / пробелы». Пустое поле «пробелы» прямо подсказывает следующий запрос. (2) Пропиши условие остановки: «отвечай, только если по каждому объекту есть цифра, источник и дата». Это защита от раннего ответа. (3) Один запрос за круг даёт точность. Два-три запроса за круг дают скорость на простых задачах. (4) Требуй от Синтезатора сжимать, а не дописывать. Иначе сводка разрастётся. Когда да. Задача требует 5+ поисков. Данные разбросаны по источникам и местами противоречат друг другу. Когда нет. Ответ находится за 2–3 запроса. Нужен открытый аналитический отчёт без проверяемого ответа. Риск. Синтезатор может выбросить важный факт, и Планировщик его уже не увидит. Проверяй сводку глазами на ключевых шагах. Расходы. Нужно вручную переносить сводку в новый чат или настроить агента, который делает это сам

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

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

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