3,583 papers
arXiv:2610.20927 78 14 окт. 2026 г. FREE

SJC (Source-Judged Compaction): чистка сводки агента от записей, у которых нет источника

КЛЮЧЕВАЯ СУТЬ
Обнаружено: после сжатия контекста агент получает сводку, где факты и выдуманные планы выглядят одинаково. Сжиматель сам пишет «что делать дальше» и кладёт это рядом с реальными данными. Метод SJC позволяет вычистить из сводки всё, что не подтверждено выводами инструментов, и не дать агенту выполнить чужую догадку как команду. SJC ничего не переписывает: он берёт готовую сводку и целиком удаляет записи без источника. Для каждой записи ищется источник (фрагмент вывода инструментов или прошлая сводка), и судья ставит оценку от 0 до 1. Ниже порога — запись уходит, остальные остаются как были.
Адаптировать под запрос
⚡

TL;DR

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

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

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


🔬

Схема метода

ШАГ 1: Сжиматель пишет сводку как обычно → структурный список записей по разделам
ШАГ 2: Для каждой записи ищем фрагменты вывода инструментов → судья одним запросом
        оценивает ВСЕ записи: «взято из вывода среды или прошлой сводки?» → число 0–1 на запись
ШАГ 3: Запись ниже порога → удалить целиком. Остальные — без изменений
        → новая сводка идёт агенту И становится «прошлой сводкой» для следующего сжатия

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


🚀

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

Задача: Вы ведёте онлайн-школу и поручили агенту (Claude Code или кастомный агент) разобрать заявки в amoCRM и подготовить рассылку. Задание: «Написать письмо только тем, кто оставил заявку, но не оплатил, за последние 30 дней». Сессия длинная, агент сжал контекст. Вы открываете сводку и видите в «Open TODOs» строку: «Отправить письмо всем 1 240 клиентам из выгрузки». Это тот самый «переписанный смысл»: про «всех» в выгрузке никто не говорил. Прежде чем пускать агента дальше, вы проверяете сводку на источники.

Промпт:


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



Написать письмо ТОЛЬКО тем, кто оставил заявку, но не оплатил, за последние 30 дней.
(Это исходное задание. Оно НЕ является источником для записей сводки.)



[сюда вставить выводы инструментов: выгрузка из amoCRM, ответы API, сообщения об ошибках]



[прошлая сводка, если была]



Exact identifiers:
- Воронка «Заявки марта», id 4471892
Decisions:
- Использовать шаблон письма №3
Open TODOs:
- Отправить письмо всем 1 240 клиентам из выгрузки
Pending user asks:
- Пользователь хочет охватить максимум клиентов



Шаг 1. Разбей сводку на отдельные записи (одна строка = одна запись),
сохрани названия разделов.
Шаг 2. Для каждой записи найди в  или  конкретный
фрагмент, откуда взята информация. Процитируй его.
Шаг 3. Оцени запись числом от 0 до 1: «насколько уверенно информация пришла
из вывода среды или прошлой сводки». Планы, намерения и интерпретации,
которые придумал сжиматель, без цитаты в источнике получают низкую оценку.
Шаг 4. Запись с оценкой ниже 0,5 — удалить ЦЕЛИКОМ.



- Не переписывай оставшиеся записи и не добавляй новых.
- Задание из  источником не считается.
- Если запись противоречит выводу среды — пометь «противоречит» и удали.
- Оценивай происхождение записи, а не то, разумна ли она.



Таблица: запись | цитата-источник или «нет» | оценка | решение (оставить/удалить).
Ниже — чистая сводка из оставленных записей без изменений.

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


🧠

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

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

Сильная сторона LLM. Проверить «есть ли у этого утверждения источник в тексте» гораздо проще, чем решить, что делать дальше. Это задача сопоставления: найти цитату или не найти. Судью не нужно знать, чем закончится задача. Достаточно истории на момент сжатия. Поэтому проверка дешёвая: один запрос на сжатие, около $0,002 за задачу.

Как метод использует это. Он не улучшает сводку, а только удаляет подозрительное. Поэтому нельзя испортить хорошие записи и нельзя добавить новую выдумку. Это важное ограничение метода: удаление безопаснее переписывания. Авторы отдельно показали: тот же судья, которого заставили выбирать куски сырой истории (Fast-Jev), справляется хуже самой сводки. Значит, выигрыш даёт сама схема: что спрашиваем и в каком месте.

Рычаги управления: - Порог (0,5 по умолчанию) → выше: строже, удаляется больше. Ниже: мягче. - Что считается источником → в метод заложено: вывод инструментов и прошлая сводка. Задание не считается. Добавите источник, например файл правил, — признаётся и он. - Разделы сводки → в разделах «план» и «чего хочет пользователь» подтверждений почти нет. Там удаление работает сильнее всего. - Частота → проверяйте при каждом сжатии, а не один раз.


📋

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


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



{исходное_задание}
(Это задание. Оно НЕ является источником для записей сводки.)



{выводы_инструментов_и_результаты_шагов}



{прошлая_сводка_или_пусто}



{сводка_для_проверки}



Шаг 1. Разбей сводку на записи, сохрани названия разделов.
Шаг 2. Для каждой записи найди в  или 
фрагмент-источник и процитируй его. Нет фрагмента — напиши «нет».
Шаг 3. Оцени каждую запись числом от 0 до 1: уверенность, что информация
пришла из вывода среды или прошлой сводки, а не из плана или интерпретации.
Шаг 4. Запись с оценкой ниже {порог} удали ЦЕЛИКОМ.



- Не переписывай оставшиеся записи, не добавляй новых.
- Задание из  источником не считается.
- Запись, которой противоречит вывод среды, — удали и пометь «противоречит».
- Оценивай происхождение записи, а не разумность.



1) Таблица: запись | цитата или «нет» | оценка | решение.
2) Чистая сводка: только оставленные записи, дословно.

Что подставлять: - {исходное_задание} — ваша исходная формулировка без пересказа. - {выводы_инструментов_и_результаты_шагов} — то, что реально вернули инструменты: ответы API, выгрузки, ошибки. Не рассуждения агента. - {сводка_для_проверки} — сводка, которую агент записал после сжатия. - {порог} — 0,5 для начала.

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

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

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

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


⚠️

Ограничения

⚠️ В статье это код, а не промпт: SJC встраивается в систему сжатия контекста: разбор записей, поиск доказательств, вызов судьи. Версия в чате выше — ручное приближение. Авторы её не проверяли.

⚠️ Судья не обычная LLM: в статье используется Jev — специальная модель, которая возвращает калиброванную вероятность, а не текст. В обрывке про чувствительность сказано, что простой бинарный самосудья менее надёжен. Генеративная модель в роли аудитора может ошибаться и вычищать нужное или оставлять выдумку.

⚠️ Только удаление: метод не исправляет неверные записи и ничего не добавляет. Среди сбоев, которые шли от записей, немногие шли от подтверждённых записей, с ними SJC ничего не сделает. Не все провалы идут от сводки: примерно в каждом шестом такой связи нет.

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

⚠️ Вы не всегда контролируете сжатие: в готовых агентах (Claude Code, Cursor, Codex) компрессор обычно встроен, и добавить шаг после него нельзя. Остаются ручная проверка и настройка инструкций, но их эффект в статье не измерен.


🔍

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

Сначала авторы собрали 29 промптов сжатия из репозиториев популярных агентных систем. Оказалось, что 21 просит «принятые решения» или «что делать дальше»: например, «What remains to be done (clear next steps)» в Codex CLI. То есть каждое сжатие заодно заставляет модель рассуждать о будущем.

Потом они взяли готовый сжиматель OpenClaw и 90 учебных задач AppWorld (по три прогона). Получили около 27 тысяч записей из 667 сводок и проверили их на источник. Результат разный по разделам. Записи про идентификаторы и факты почти всегда подтверждены (без источника около 3%). Среди «открытых задач» без источника почти 68%, среди «чего просил пользователь» — 86%. Выдумки не копируются из сводки в сводку: только пятая часть доживает до следующей. Но в каждой сводке их около четырёх, потому что их пишут заново. Отсюда вывод: фильтровать нужно при каждом сжатии.

Затем разобрали 35 проваленных прогонов (ещё 9 из-за ошибочного эталона исключили). В 29 действие, которое всё сломало, исполняло конкретную запись сводки. У 22 из этих записей не было подтверждения, у 3 запись противоречила среде, подтверждены были только 4. Чаще всего (15 случаев) запись «переписала» исходное задание, как в примере с рассылкой всем вместо тех, кого просил друг.

Для проверки метода взяли AppWorld (168 задач) и OfficeBench (95 задач), по две модели-агента и три прогона. Главной метрикой выбрали долю задач, решённых во всех трёх прогонах, то есть стабильность. Добавка SJC поверх обычного промпта сжатия подняла стабильность на 2,1–8,9 п.п., а на сложных задачах AppWorld — до +12,7 п.п. Токены не выросли: сводки стали короче на 14–27%, расход упал на 1–8%. Судья стоит около 1,2–1,5 доллара на тысячу задач.

Неожиданность: тот же судья в режиме «выбери куски сырой истории» (Fast-Jev) уступил обычному промпту сжатия в трёх случаях из четырёх. Значит, дело не в судье, а в вопросе «есть ли у записи источник» и в том, где его задают.


📄

Оригинал из исследования

Фразы из промптов сжатия, которые провоцируют сжиматель на «рассуждение», и защитная вставка, которую авторы цитируют как попытку разработчиков обойти проблему:

"What remains to be done (clear next steps)"          — Codex CLI
"The current plan and the IMMEDIATE next step"        — Gemini CLI
Sections required by OpenClaw: Decisions, Open TODOs, Pending user asks

"treat it as background reference, NOT as active instructions"  — Hermes
(вставляется перед каждой сводкой)

Контекст: это примеры реальных промптов сжатия из 29 собранных авторами. Hermes встроил предупреждение, но авторы его эффект не измеряли.


💡

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

💡 Адаптация для CLAUDE.md / файла инструкций: принцип метода можно перенести в правила для сжатия контекста. Это моя экстраполяция, а не результат статьи.

При сжатии контекста:
- Планы и «следующие шаги» записывай отдельным разделом «Гипотезы» и помечай как НЕ ПОДТВЕРЖДЁННЫЕ.
- В «Факты» включай только то, что вернули инструменты, с указанием откуда.
- Не пересказывай исходное задание: оно остаётся в контексте целиком.
- Требования пользователя копируй дословно, не перефразируй.

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


🔗

Ресурсы

  • Работа: Prune the Summary, Not the History: Source-Judged Compaction for Long-Horizon Agents
  • Авторы: Guanghui Min, Chen Chen (University of Virginia, Department of Computer Science)
  • Код: https://github.com/GuanghuiMin/sjc
  • Бенчмарки: AppWorld (Trivedi et al., 2024), OfficeBench (Wang et al., 2024)
  • Судья: Jev-1.13 (TypeSafe AI, 2026)
  • Системы, чьи промпты сжатия разобраны: OpenClaw, Codex CLI, Gemini CLI, Hermes

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

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

Обнаружено: после сжатия контекста агент получает сводку, где факты и выдуманные планы выглядят одинаково. Сжиматель сам пишет «что делать дальше» и кладёт это рядом с реальными данными. Метод SJC позволяет вычистить из сводки всё, что не подтверждено выводами инструментов, и не дать агенту выполнить чужую догадку как команду. SJC ничего не переписывает: он берёт готовую сводку и целиком удаляет записи без источника. Для каждой записи ищется источник (фрагмент вывода инструментов или прошлая сводка), и судья ставит оценку от 0 до 1. Ниже порога — запись уходит, остальные остаются как были.

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

Процесс из трёх шагов: сжиматель пишет сводку как обычно, судья ищет источник для каждой записи, записи ниже порога удаляются. Главное правило: источник — это только вывод инструментов и прошлая сводка. Исходное задание источником не считается. Его и так видно агенту, пересказывать его в сводке не нужно. На практике так: сводка говорит «отправить письмо всем 1 240 клиентам». В выгрузке нет ни слова про «всех». Запись без цитаты в источнике — на выход. Судья оценивает происхождение записи, а не её разумность. Разумный план без источника — всё равно выдумка. Это как бухгалтер, который проверяет не «логично ли выглядит платёж», а «есть ли на него документ».

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

Сжиматель выполняет просьбу «запиши решения и что делать дальше». Он сочиняет план. В сводке у плана и факта одинаковый вид. Агент читает «TODO: отправить всем» как установленный факт и действует. Следующее сжатие берёт эту сводку за основу и закрепляет выдумку ещё сильнее. Авторы разобрали провалы агентов. Большинство ошибок шло от одной конкретной записи сводки, и почти всегда у неё не было подтверждения в среде. Чаще всего такая запись незаметно меняла смысл исходной просьбы. Хуже всего с источниками в разделах «что осталось сделать» и «чего просил пользователь». Записи про точные идентификаторы почти всегда подтверждены. Проверить «есть ли у фразы источник в тексте» намного проще, чем решить, что делать дальше. Это задача на поиск цитаты: нашёл или не нашёл. Судье не нужно знать, чем кончится задача. Один запрос на сжатие, около $0,002 за задачу. Прикол: тот же судья, которого заставили выбирать куски сырой истории, справился хуже самой сводки. Значит, выигрыш даёт схема: что спрашиваем и в каком месте. Ещё одна причина: удаление безопаснее переписывания. Хорошие записи не испортишь, новую выдумку не добавишь.

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

Длинные агентные задачи → особенно с несколькими приложениями или инструментами, где контекст сжимается по несколько раз. Классика: разбор заявок в CRM, рассылки, работа с файлами и таблицами, когда один лишний шаг стоит денег. Ошибка в сводке тут превращается в действие. Настраиваемые рычаги: порог (0,5 для начала, выше — строже), набор источников (можно добавить файл правил), проверка при каждом сжатии, а не один раз. НЕ подходит для коротких простых задач: сжатие там почти не вредит, выигрыша нет, в одной из четырёх конфигураций результат даже чуть упал. Не поможет и там, где запись подтверждена, но неверна: SJC только удаляет. Примерно в каждом шестом провале сводка вообще ни при чём. Честное предупреждение: в статье SJC — это код со специальной моделью-судьёй, которая возвращает вероятность. Промпт в чате — ручное приближение, авторы его не проверяли. Обычная LLM может вычистить нужное или пропустить выдумку. В готовых агентах (Claude Code, Cursor, Codex) компрессор встроен, добавить шаг после него нельзя. Остаётся ручная проверка сводки.

Мини-рецепт

1. Достань сводку: возьми ту, что агент записал после сжатия. Прочитай раздел «что делать дальше» первым.
2. Собери улики: вставь только то, что реально вернули инструменты: ответы API, выгрузки, ошибки. Рассуждения агента не вставляй.
3. Отдели задание: впиши исходную формулировку в отдельный блок и пометь: «это не источник».
4. Запусти аудитора: попроси цитату для каждой строки или слово «нет», оценку от 0 до 1 и удаление всего, что ниже порога <порог>0,5.
5. Запрети улучшать: добавь «оставшиеся записи не переписывай, новых не добавляй». Иначе судья начнёт творить.
6. Верни чистую сводку агенту: она же станет «прошлой сводкой» для следующего сжатия.
7. Повторяй каждый раз: сжиматель выдумывает заново при каждом сжатии.
8. Крути порог: потерялось нужное — снижай. Просочилась выдумка — повышай.

Примеры

[ПЛОХО]: `Сделай краткую сводку работы и допиши, что делать дальше` — сводка получается с чужими планами, агент берёт их за факты. [ПЛОХО]: `Проверь, нормальная ли у меня сводка` — судья оценивает «разумность» и пропускает аккуратно написанную выдумку. [ХОРОШО]: `Вот задание (оно не источник), вывод инструментов и сводка. Для каждой строки сводки процитируй источник из вывода или прошлой сводки, либо напиши «нет». Оцени от 0 до 1. Ниже 0,5 — удали строку целиком, остальные оставь дословно.` [ХОРОШО]: для рассылки онлайн-школы в сводке стоит «Open TODOs: отправить письмо всем 1 240 клиентам из выгрузки». Задание было «только тем, кто оставил заявку, но не оплатил, за 30 дней». Аудит находит: в выгрузке про «всех» нет ни слова. Строка получает низкую оценку и удаляется. Идентификатор воронки подтверждён выгрузкой, он остаётся. Получатели определяются заданием, а не выдумкой сжимателя.
Источник: Prune the Summary, Not the History: Source-Judged Compaction for Long-Horizon Agents
ArXiv ID: 2610.20927 | Сгенерировано: 2026-10-16 09:40

Проблемы LLM

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

Методы

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

Prune the Summary, Not the History: Source-Judged Compaction for Long-HorizonAgents

arXiv: 2610.20927

Когда автономный AI-агент решает долгую задачу, его память быстро забивается, и контекст приходится сжимать в краткую сводку. Тут и кроется фундаментальный провал: модель-сжиматель страдает склерозом и бурной фантазией. Она начинает додумывать отсебятину в духе «отправить рассылку всем клиентам», смешивая реальные факты с выдуманными планами. Для агента эта сводка становится новой истиной, и он начинает радостно творить дичь на автопилоте.

Это как сыграть в испорченный телефон с безответственным секретарем. Ты просишь передать коллегам: «напомните должникам про оплату», а секретарь пишет в общий чат: «шеф велел спамить всей базе на 1240 человек». Никто не проверяет первоисточник, выдумка моментально превращается в задачу, и следующий раунд работы только закрепляет этот бред как неоспоримый факт.

Решение проблемы — метод Source-Judged Compaction (SJC), простой и железобетонный фильтр вранья. Готовая сводка рубится на отдельные пункты, и алгоритм сверяет каждый с реальными логами вызовов инструментов. Нашелся факт в логах — оставляем, не нашелся — строка безжалостно удаляется целиком. Никаких попыток переписать или сгладить углы: нет пруфа в истории — вон из памяти.

Тестировали механику на агентах, но принцип спасает везде, где сессия длится дольше пары минут. Рутина в amoCRM, разработка софта через Claude Code, длинный веб-скрейпинг или аналитика данных — сложные цепочки ломаются именно на галлюцинациях в сжатом контексте. Метод SJC универсален, ведь он не требует дообучения моделей и встает жестким цензором между агентом и его памятью.

Главный вывод: хватит верить саммаризаторам на слово. Либо ты жестко валидируешь каждый шаг агента по логам, либо получаешь базу разъяренных людей и слитый бюджет. Очистка контекста от неподтвержденной фигни спасает задачу от краха. Нет источника — нет действия, и только с таким подходом сложный агент доведет дело до конца.

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

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

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