Отравление RAG-памяти агента: что ломается и какой выход предлагают билдеры

Соло-разработчик, который собирает агента с долговременной памятью и инструментами на своей машине, рискует не «странным ответом», а тихим расширением прав: чанк из векторного хранилища часто одновременно попадает в контекст модели и авторизует побочное действие. В разборе эксперимента с самоотравлением RAG мейнтейнер open-source слоя памяти показывает, почему защиты на этапе поиска по хранилищу не переносятся между сменами энкодера — и куда смещать фокус для local-first агентов без облачной модерации.
Почему RAG-память агента — это не просто «поиск по заметкам»
Сюжет вырос из технического треда на r/LangChain: мейнтейнер mnemo / agora-mnemo около недели строил гипотезы, измерял атаки и отгружал выжившие части кода, целенаправленно отравляя собственное RAG-хранилище. jacksonxly, автор публикации, описывает свою роль как в основном фрейминг — синтез обсуждения в связный нарратив.
Параллельно команда вокруг recal формулирует local-first personal memory layer: система наблюдает, как пользователь работает, и может действовать на его машине, но только через approve-gate, который контролирует сам пользователь. Для билдера агента с tools это близкая модель: память живёт рядом с IDE и терминалом, а не в отдельном «безопасном облаке».
Вывод из эксперимента сформулирован жёстко: проблема не в том, чтобы поймать ядовитый чанк, а в том, чтобы ограничить, что непроверенная память может делать.
Разделить чтение памяти и право на действие
В большинстве memory stack retrieval и authority слиплись: попадание чанка в top-k сразу формирует ответ и подталкивает к действию. Ключевой рефрейм — развести retrieval (доступ к чтению) и authority (право авторизовать действие).
Недоверенный контент может информировать модель, но не авторизует действие сам по себе — по аналогии с dual-LLM / capabilities pattern в Google DeepMind CaMeL. Для агента с MCP-подобными инструментами это практичнее, чем очередной фильтр «странного текста»: побочный эффект отделяется от факта, что фрагмент оказался в контексте.
Дополнительный примитив — low-water mark по потоку информации: действие наследует минимальную целостность всего контекста. Одна непроверенная single-source память снижает effective integrity — и действие должно fail closed.
Почему защиты на этапе retrieval не обобщаются
Первая линия обороны в эксперименте — наивная детекция яда: perplexity, поиск выбросов, флаг «странного» чанка. Механизм живёт в embedding space и ломается при смене энкодера: защита, настроенная на одном embedder, «упала» на следующем. Это не баг конкретной библиотеки, а свойство подхода.
Правило «два независимых источника» тоже не спасает. При дешёвом minting источников — новые домены, document id, свежие метки записи — корроборация превращается в Sybil attack: в измерениях два свежезарегистрированных домена проходят count gate.
| Механизм «дорогого» источника | Итог эксперимента |
|---|---|
| Allowlist / registrar | Тестировался |
| Signed attestation | Тестировался |
| Proof of work | Симметричный «налог», не стена |
| Staked-with-decay standing | Единственный с асимметричным корнем |
Стоимость одна лишь оценивает атаку, не блокирует её. Symmetric reputation (Cheng and Friedman, 2005) не Sybil-proof. Outcome-learning уязвим к endogenous signal — атака MINJA, когда агент пишет собственную корроборацию. Standing-gating даёт привилегию hot path; cold long tail живёт под cap постоянно.
Кумулятивный бюджет, provenance и человек на необратимом хвосте
Per-action cap молчит о серии обратимых записей, которые суммарно пересекают порог необратимости — salami-slicing. В эксперименте измерена версия, компаундирующая в irreversible outcome. Ответ: cumulative per-source budget плюс retroactive forfeiture standing как bond при пойманной дефекции. Auto-forfeiture при этом выключен по умолчанию — риск framing attack на influenceable oracle.
Ниже всего этого лежит пол attribution: детектор, budget и gate предполагают корректное присвоение действия источнику; relabel обнуляет все три. Tamper-evident слой — hash-chained receipts (линия Haber and Stornetta); доверие label на write time требует внешнего signing root. Blockchain для этого не требуется.
Практическая рамка для personal, local-first brain в recal:
- источники — собственная активность и заметки пользователя;
- irreversible actions — действия от его имени;
- cloud moderation отсутствует по дизайну.
Отсюда три опоры: gate unproven memory, destructive tail за reversible human gate, provenance как substrate — не четвёртый контроль поверх трёх. «Solved» авторы не называют; shippable win — превратить encoder-resetting arms race в bounded, priced, auditable risk.
Что добавляет дискуссия под постом
В комментариях Dipankar Sarkar разводит retrieval и authorization как capability-security: top-k часто молча выдаёт и чтение, и право на side effect. Его практика — provenance + trust tier at write time: gate actions по minimum tier, не по retrieval rank; unproven memory информирует ответ, но не доходит до tool. Irreversible actions он описывает как two-phase commit с out-of-band confirmation.
Jackson Ly в ответе уточняет: write-time trust tier наследует тот же пол attribution — без external bind (origin signature, real-world corroboration) tier остаётся self-declared authority. Two-phase-commit framing для необратимого хвоста: out-of-band шаг верифицирует не truth памяти — это не вычислимо at commit time — а worth being wrong about; confirmer работает как blast-radius valve, не truth oracle.
Для соло-билдера с агентом на локальной машине это читается прямо: approve-gate на необратимые вызовы инструментов важнее очередной «умной» детекции poisoned text.
Практический вывод для агента с долговременной памятью
FAQ в первоисточнике закрывает типичные ложные надежды:
- knowledge graph или «лучшая» vector DB не чинят poisoning — failure в том, что retrieval = authority;
- детекция AI-generated или poisoned text сама по себе не viable defense;
- первый примитив — provenance that survives transformation (chunking, summarization, re-embedding).
Если вы собираете personal memory layer без облачной модерации, полезный чеклист из материала:
- Развести «память попала в контекст» и «память разрешила действие».
- Не полагаться на детекторы в embedding space при смене энкодера.
- Считать кумулятивный бюджет источника, а не только per-action cap.
- Вешать reversible human gate на необратимый хвост — отправка, удаление, платёж, смена конфига.
- Строить provenance на write time с внешним signing root, а не на post-hoc rank в retrieval.
Материал написан с AI assistance и отредактирован человеком — это зафиксировано в дисклеймере первоисточника. Конкретный стек эксперимента mnemo (vector DB, embedder, agent framework) в публикации не перечислен; цифровые бенчмарки успеха атак тоже не приведены — только качественные формулировки вроде «измерил», «упала», «прошли gate».
Источники
- Jackson Ly (jacksonxly), «What poisoning a RAG store taught us about agent memory» — Dev.to (доступ: 2026-07-06, UTC)
- Комментарии Dev.to к посту (Dipankar Sarkar; ответ Jackson Ly) — https://dev.to/api/comments?a_id=4076598 (доступ: 2026-07-06, UTC)