3,583 papers
arXiv:2610.05281 74 4 окт. 2026 г. FREE

Concord: как устаревшие результаты инструментов портят ответы агента, и как это чинить

КЛЮЧЕВАЯ СУТЬ
Агент один раз прочитал файл и навсегда считает его актуальным, даже если файл уже поменяли. Метод Concord позволяет агенту отвечать по свежим данным, когда источник изменился посреди сессии. Это программная прослойка: она помнит, откуда взят каждый кусок контекста. Источник поменялся? Фишка: полезно не само уведомление «файл изменился», а то, что оно заставляет перечитать источник. После повторного чтения агент отвечал верно в 17 случаях из 18, без него только в 2 из 8. Сам Concord требует кода, но его логику можно перенести в правила для агента. Авторы такой перенос не проверяли.
Адаптировать под запрос
⚡

TL;DR

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

Боль знакома тем, кто работает с агентами. Агент отвечает уверенно, но по старой версии: «порог бесплатной доставки 100», хотя в конфиге уже 50. Модель не «забыла» и не «ошиблась в логике». У неё в контексте лежит старая версия файла, и нового сигнала нет. Даже когда рантайм проверял перед ответом и возвращал файл в исходное состояние, агент об этом не знал и повторял прежний ответ.

Сам Concord строится на коде, но из экспериментов вытекают правила, понятные без него. Простое уведомление «файл изменился» помогает только тогда, когда оно заставляет агента перечитать источник. Явный diff («было → стало») работает лучше, но стоит дорого по токенам. Лучше всего оказалась замена устаревшего блока или принудительное перечитывание.


🔬

Схема метода

ШАГ 1. РЕГИСТРАЦИЯ: результат инструмента → блок контекста с привязкой
        к источнику (путь, версия, диапазон строк)
ШАГ 2. ИНВАЛИДАЦИЯ: источник изменился → найти блоки, которые зависят
        от изменённого фрагмента (пересечение диапазонов строк)
ШАГ 3. СОГЛАСОВАНИЕ: выбрать политику для устаревшего блока:
        • обновить (перечитать и подставить новое)
        • пометить предупреждением «устарело»
        • убрать из следующих промптов
        • заставить агента перечитать источник до продолжения

Все три шага выполняет код в рантайме агента (адаптеры + менеджер контекста), а не промпт. Малое локальное изменение (≤ ~20% токенов или сходство ≥ 0,78) заменяется «на месте». Большое: блок убирается, агента заставляют перечитать источник.


🚀

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

В статье нет готовых промптов, она предлагает программный слой. Поэтому пример ниже — перенос принципов Concord в текстовые правила для агента, а не воспроизведение метода. Эффект такого переноса авторы не проверяли.

Задача: Вы ведёте интернет-магазин на Битриксе вместе с Claude Code. Агент в начале сессии прочитал config/delivery.php: бесплатная доставка СДЭК от 3000 ₽. Пока он работает, менеджер правит порог на 2000 ₽ к распродаже. Через час вы спрашиваете: «Заказ на 2500 ₽ едет бесплатно?» Агент должен перечитать конфиг, а не отвечать по памяти.

Промпт (фрагмент для CLAUDE.md или системной инструкции):


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

Результат: Агент перед ответом снова откроет config/delivery.php и ответит по актуальному порогу. В ответе будет указано, откуда взято значение. Если порог изменился, агент отметит «было 3000 → стало 2000». Модель, не знавшая о правке, без инструкции ответила бы по старой цифре.


🧠

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

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

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

Как метод это использует. Concord делает так, чтобы в следующем вызове модели лежала либо свежая версия, либо чёткое требование перечитать. Данные из статьи: если после алерта агент делал новое чтение, он отвечал верно в 17 случаях из 18. Без перечитывания — только в 2 из 8. Значит, полезен не сам сигнал, а то, что он запускает повторное чтение.

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


📋

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

В статье шаблона нет. Ниже — перенос логики Concord (регистрация → инвалидация → согласование) в текстовые правила. Это адаптация, не авторский метод.


  
    Веди таблицу прочитанных источников:
    | источник | что именно прочитано (диапазон/поле) | когда | что извлёк |
    Обновляй её после каждого чтения.
  

  
    Считай запись устаревшей, если:
    - источник менял я, другой агент или внешний процесс;
    - прошло более {N} шагов/минут с чтения;
    - ответ зависит от {тип_данных: цены / конфиги / статусы / код}.
  

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

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

Подставьте: {N} (порог устаревания), {тип_данных} (что у вас часто меняется).

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

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

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

LLM спросит, какие источники у вас меняются во время работы, кто их меняет (люди, другие агенты, скрипты) и что дороже: лишнее перечитывание или устаревший ответ. Это нужно, чтобы выбрать политику и пороги под вашу среду.


⚠️

Ограничения

⚠️ Текстовые правила не проверены: авторы тестировали программный слой, а не инструкции в промпте. Сработает ли «перечитывай перед ответом» в Claude Code или Cursor, нужно проверять самому.

⚠️ Искусственный бенчмарк: 40 задач из HotpotQA, где файл подменяют и возвращают по расписанию. Реальные правки менее предсказуемы. Результат «40 из 40» сами авторы называют не гарантией надёжности.

⚠️ Только локальные файлы: базы, GitHub, Slack и другие MCP-ресурсы остались «на будущее». Параллельные агенты и повторные обновления не оценивались.

⚠️ Старые выводы не чинятся: если агент уже составил резюме или план по устаревшим данным, Concord их не пересматривает.

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

⚠️ Сам Concord требует кода: адаптеры, отслеживание изменений и версии источников нужно писать. Для читателя без разработки это не готовый инструмент.


🔍

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

Идея простая: подменить факт в файле, дождаться, пока агент его прочитает, и сразу вернуть файл назад. Исследователи взяли 40 вопросов HotpotQA (ответы требуют нескольких фактов). Документы разложили как рабочую папку и в нужные предложения внесли правдоподобные ошибки: другую цифру, дату, имя. Агент читал «испорченный» файл, и сразу после этого файл восстанавливали. Ответ сверяли с исходным верным.

Сравнивали четыре варианта на трёх современных моделях: Naive (ничего не делать), Alert (дописать «файл изменён»), Diff (инструмент показывает «было → стало» и не даёт ответить без него), Concord. Для верхней планки взяли Oracle, прогон без подмены.

Результаты: Naive правильно отвечал в 37,5–60% случаев, Alert в 57,5–77,5%, Diff в 77,5–95%, Concord во всех 40. При этом Concord потратил на 46,4% меньше токенов, чем сильнейшая неидеальная альтернатива. Удивило то, что простой алерт слабо помогал: агент часто видел предупреждение и всё равно отвечал по памяти. Разбор следов показал: он работает только при последующем перечитывании. Значит, стоит строить схему вокруг действия «перечитать», а не вокруг уведомления.


💡

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

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

Вместо «если файл изменился, учти это» пишите так:

Если ты не перечитал источник в этом ответе, не называй значение «текущим».
Либо перечитай, либо напиши «по состоянию на прошлое чтение, не проверено».

Это прямо следует из находки: сигнал без перечитывания почти не помогает.

Экстраполяция: журнал чтения в многоагентной схеме

Если несколько агентов работают в одном репозитории, дайте им общую заметку:

Перед правкой файла запиши в NOTES.md: «Агент {имя} изменил {файл}, строки {диапазон}, {время}».
Перед ответом по любому файлу проверь NOTES.md: если там есть запись
новее твоего чтения этого файла, перечитай его.

Это ручной аналог связи «источник → блок» из Concord. Эффективность не проверена, это идея по мотивам статьи.


🔗

Ресурсы

  • When Agent Context Goes Stale: Incoherence in Volatile Agent Context — Yingying Liu, Junzhou Fang, Chenxiong Qian, The University of Hong Kong.
  • Бенчмарк ConcordBench-Pioneer построен на HotpotQA.
  • Агентные среды в статье: OpenHands, OpenCode, OpenClaw; протокол MCP.
  • Смежные работы: STORM, CAID, CodeCRDT (согласованность рабочих пространств); MemGPT, Self-GC, STALE (память агентов).

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

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

Агент один раз прочитал файл и навсегда считает его актуальным, даже если файл уже поменяли. Метод Concord позволяет агенту отвечать по свежим данным, когда источник изменился посреди сессии. Это программная прослойка: она помнит, откуда взят каждый кусок контекста. Источник поменялся? Фишка: полезно не само уведомление «файл изменился», а то, что оно заставляет перечитать источник. После повторного чтения агент отвечал верно в 17 случаях из 18, без него только в 2 из 8. Сам Concord требует кода, но его логику можно перенести в правила для агента. Авторы такой перенос не проверяли.

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

Три шага, все делает код в среде выполнения, а не промпт. 1. Регистрация: каждый результат инструмента получает привязку к источнику (путь, версия, диапазон строк). 2. Отметка об устаревании: источник изменился, и код ищет блоки, которые читали именно изменённые строки. 3. Согласование: для устаревшего блока выбирают политику. Обновить, пометить «устарело», убрать из промпта или заставить агента перечитать. Прочитанное в контексте нужно считать снимком, а не текущим состоянием. Это как фото меню на телефоне. Ресторан давно сменил цены, а ты всё заказываешь по фото. Мелкая правка (до ~20% токенов) заменяется на месте. Крупная правка выкидывает блок и отправляет агента читать источник заново.

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

Модель не видит внешний мир. Для неё результат чтения файла такой же «факт», как строка из твоего запроса. Источник изменился, а в контексте ничего не поменялось. Поводов сомневаться у модели нет. Хуже того, если агент уже ответил по старым данным, он повторяет прежний ответ. Даже когда среда вернула файл в исходное состояние, агент об этом не знал. Модель хорошо реагирует на явный сигнал в тексте: «это устарело», «вот разница». И умеет вызвать инструмент. Concord соединяет одно с другим. Сигнал сам по себе почти бесполезен: с перечитыванием верных ответов 17 из 18, без него 2 из 8. Явная разница «было → стало» работает лучше простой пометки, но стоит в разы больше токенов.

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

Агенты с долгими сессиями (Claude Code, Cursor, свои агенты на файлах и конфигах) → задачи, где данные правят параллельно люди, скрипты или другие агенты, особенно когда ответ зависит от цен, порогов, статусов и содержимого файлов. НЕ подходит для коротких одноразовых запросов, где ничего не успевает измениться. Также не лечит выводы, которые агент уже сделал по старым данным: резюме и планы Concord не пересматривает. Важно: авторы проверяли программный слой на 40 искусственных задачах (HotpotQA), а текстовые правила в промпте не тестировали. Проверяй на своей среде.

Мини-рецепт

1. Объяви прочитанное снимком: впиши в системную инструкцию или CLAUDE.md правило, что всё прочитанное ранее в сессии — состояние на момент чтения, а не на сейчас.
2. Заставь перечитывать: перед ответом про цены, конфиги, статусы агент открывает источник заново. Исключение: он сам только что правил файл и видит результат.
3. Добавь внешние сигналы: если ты или другой агент менял файл, прежнее чтение считается недействительным.
4. Потребуй отчёт: в ответе нужны источник, время чтения и пометка «было → стало», если значение сменилось.
5. Настрой под себя: реши, что дороже, лишнее перечитывание или устаревший ответ. Если дороже ошибка, перечитывай всегда. Если дороже токены, перечитывай только для быстро меняющихся данных.
6. Проверь на живом примере: поменяй значение в файле посреди сессии и задай вопрос. Правило сработало, если агент назвал новое значение.

Примеры

[ПЛОХО] : Заказ на 2500 рублей едет бесплатно? (агент читал конфиг час назад, менеджер с тех пор поменял порог, а агент отвечает по памяти: «Нет, порог 3000»)
[ХОРОШО] : Всё, что ты читал раньше в этой сессии, считай снимком на момент чтения. Перед ответом про пороги, цены и статусы перечитай источник заново. В ответе укажи, откуда значение и когда читал. Если значение изменилось, напиши «было → стало». Вопрос: заказ на 2500 рублей едет бесплатно по config/delivery.php? (агент открывает файл, видит порог 2000 и отвечает: «Да, бесплатно. Прочитано сейчас: было 3000 → стало 2000»)
Источник: When Agent Context Goes Stale: Incoherence in Volatile Agent Context
ArXiv ID: 2610.05281 | Сгенерировано: 2026-10-06 06:00

Проблемы LLM

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

Методы

МетодСуть
Правило «снимок, а не состояние» — ответ по свежим даннымДобавь в системную инструкцию агента три вещи. Первое: прочитанное ранее считается снимком. Второе: перед ответом о текущем состоянии источник читается заново. Третье: в ответе пишется, свежие данные или из прошлого чтения; если значение изменилось, пишется «было → стало». Почему работает: модель хорошо вызывает инструмент и читает снова. Ей не хватает только причины это сделать. Правило даёт причину заранее, до того как данные устарели. Пометка «из прошлого чтения» не даёт выдать старое за факт. Когда применять: долгие сессии, источники правят другие люди или процессы, цена ошибки выше цены лишнего чтения. Когда не работает или дорого: источник недоступен (пусть скажет об этом, а не отвечает по снимку), данные не меняются, каждое чтение стоит много токенов. Для таких случаев добавь порог: перечитывать только данные нужного типа или старше N шагов. Важно: эффект именно текстового правила не проверен. Проверь на своей среде
📖 Простыми словами

WhenAgentContext Goes Stale: Incoherence in VolatileAgentContext

arXiv: 2610.05281

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

Это как распечатать утренний прогноз погоды на принтере, положить перед носом и весь день сверяться только с этой бумажкой, игнорируя ливень за окном. Формально документ на руках, но ты выходишь на мороз в шортах, потому что бумага врать не может. Самый облом в том, что если модель уже успела сгенерировать вывод по старому файлу, она впадает в ступор и начинает тупо повторять свой прошлый ответ.

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

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

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

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

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

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