Перейти к содержанию

Глава 5. Зачем агенту память и почему она опасна

1. Начнем с ошибки, которая переживает сам запрос

Продолжим тот же кейс поддержки из первых глав.

Пользователь однажды пишет:

Если доступ все еще не активирован, просто создайте срочный тикет. Не тратьте время на уточнения.

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

Через две недели приходит уже другой запрос:

Доступ частично работает, но часть ролей пропала. Проверьте статус и подскажите, что именно сломано.

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

Проблема здесь не в одном плохом ответе. Проблема в другом:

  • старая запись пережила исходный запуск;
  • ошибка превратилась в устойчивое поведение;
  • команда уже не сразу понимает, откуда вообще взялось это решение;
  • последствия всплывают позже и в другом контексте.

Вот это и есть главный сдвиг, который приносит память: она делает ошибки долговечными.

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

2. Почему без памяти агент все равно быстро упирается в потолок

При этом память действительно нужна.

Без нее тот же агент поддержки быстро начинает раздражать и пользователей, и команду:

  • каждый раз заново спрашивает уже известные детали;
  • не помнит, что минуту назад уже проверял статус заявки;
  • плохо продолжает прерванный процесс;
  • повторно тянет одни и те же факты и увеличивает стоимость запуска.

Развилка здесь не в духе "память нужна или нет". Развилка другая:

  • либо память делает систему полезнее и аккуратнее;
  • либо память превращает ее в менее предсказуемую, менее безопасную и более дорогую в сопровождении систему.

3. Память это не один ящик, а несколько разных слоев состояния

Когда команда говорит "добавим память", обычно смешиваются сразу несколько разных вещей:

  • краткоживущий контекст текущего запуска;
  • контекст сессии, который нужен только в пределах одной сессии;
  • профильная память с устойчивыми предпочтениями;
  • проверенные факты о пользователе или бизнес-сущности;
  • сводки прошлых сессий;
  • артефакты исполнения вроде результатов инструментов или заметок трассы.

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

Память агента полезнее мыслить как несколько слоев состояния, а не как одну базу

flowchart TD
    A["Запрос пользователя"] --> B["Контекст сессии"]
    B --> C["Планировщик / рантайм"]
    C --> D["Краткоживущая рабочая память"]
    C --> E["Профильная память"]
    C --> F["Извлечение знаний"]
    D --> G["Сборка подсказки"]
    E --> G
    F --> G
    G --> H["Ответ модели"]

4. Главная ошибка: считать память просто удобством

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

Если агент однажды:

  • сохранил ложный факт как "предпочтение пользователя";
  • записал в профильную память фразу из сырого пользовательского письма;
  • утащил в сводку чувствительный внутренний комментарий;
  • положил в хранилище извлечения данные, которые не должны возвращаться этому арендатору;

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

Именно поэтому путь записи в память нужно рассматривать как чувствительный путь записи, а не как удобную автоматику.

5. У памяти есть собственные границы доверия

Очень полезно смотреть на память не как на нейтральное хранилище, а как на границу доверия.

Для того же агента поддержки есть как минимум четыре разных источника данных:

  • доверенные системные аннотации;
  • проверенные результаты внутренних сервисов;
  • контент, предоставленный пользователем;
  • контент из внешних инструментов, документов или писем.

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

Нормальное правило выглядит так:

  • доверенные метаданные могут участвовать в решениях политики;
  • пользовательский контент не должен внезапно становиться системной инструкцией;
  • извлеченный текст должен считаться недоверенным, пока не доказано обратное;
  • сводки тоже имеют происхождение и не являются "истиной по умолчанию".

6. Самый опасный путь: писать долговременную память прямо в горячем пути

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

Для того же агента поддержки это особенно опасно:

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

Почему этот путь опасен системно:

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

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

У долговременного состояния есть еще один отдельный риск: persistent memory poisoning. Если вредная запись уже попала в профиль, summary store, retrieval index или workspace state, она будет атаковать не один запрос, а каждый следующий запуск, который доверяет этому состоянию. Поэтому mature runtime полезно начинать не только с загрузки памяти, но и с startup_persistent_state_scan: проверить provenance, tenant scope, freshness, write policy version, quarantine flag и признаки instruction-like текста до того, как запись попадет в prompt или policy context.

Ниже простой пример такой логики:

from dataclasses import dataclass


@dataclass
class MemoryCandidate:
    kind: str
    tenant_id: str
    content: str
    source: str
    contains_pii: bool = False


def should_persist(candidate: MemoryCandidate) -> bool:
    if candidate.kind not in {"profile_preference", "validated_fact", "session_summary"}:
        return False
    if candidate.source not in {"trusted_service", "approved_summarizer"}:
        return False
    if candidate.contains_pii:
        return False
    return True

Этот код намеренно очень простой. Его сила не в "умности", а в том, что правила записи видны и поддаются аудиту.

7. Хорошая система памяти пишет меньше, чем тебе хочется

В начале почти всем кажется, что памяти должно быть много. Но на практике хорошая система памяти чаще выигрывает не количеством, а строгостью отбора.

Обычно в память стоит писать только то, что:

  • пригодится в будущих запусках;
  • имеет понятного владельца и арендатора;
  • можно объяснить человеку;
  • не несет лишних чувствительных данных;
  • не превратит подсказку в свалку.

Полезный вопрос перед каждой записью звучит так:

Если этот фрагмент всплывет через три недели в другом контексте, мне будет комфортно объяснить, почему он здесь?

Если ответ неуверенный, запись, скорее всего, не нужна.

8. Минимальная политика для записи в память

Если хочешь начать без переусложнения, можно мыслить о политике записи в память примерно так:

memory:
  allowed_kinds:
    - profile_preference
    - validated_fact
    - session_summary
  deny_sources:
    - raw_user_prompt
    - external_html
    - unvalidated_tool_output
  require_tenant_id: true
  reject_if_contains:
    - secrets
    - access_tokens
    - payment_card_data
  write_mode:
    profile_preference: background_review
    validated_fact: immediate_if_trusted
    session_summary: background_only

Это не про магию. Это про то, чтобы сделать путь записи обозримым и безопасным.

8.1. Полезно разделять политику чтения памяти и политику записи в память

Одна из самых практичных мыслей из свежих Google-материалов состоит в том, что память надо мыслить как управляемую подсистему, а не как "просто хранилище для контекста".12

У этого есть прямое следствие: правила чтения и правила записи почти никогда не должны быть одинаковыми.

Например:

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

Если не развести эти пути, система начинает жить по странной логике: все, что однажды записалось, потом можно почти автоматически читать отовсюду.

А это уже не проектирование памяти, а источник тихих инцидентов.

8.2. Устойчивая память должна по умолчанию хранить происхождение

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

  • source_type;
  • source_id;
  • writer_identity;
  • tenant_id;
  • written_at;
  • confidence или validation_state.

Это выглядит как дополнительная бюрократия ровно до первого спора о том, откуда взялся "факт", который агент потом уверенно повторил в другом контексте.

8.3. Отравление памяти — это сценарий безопасности, а не только качество данных

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

Минимальный сценарий отравления памяти должен проверять те же поля разбора отравления памяти, которые потом попадают в схему памяти и поиска и схему трасс:

  • untrusted write: может ли непроверенный источник попасть в persistent memory;
  • delayed activation: влияет ли запись на поведение не сразу, а через следующий run или другую сессию;
  • cross-tenant contamination: может ли запись пересечь tenant boundary или роль доступа;
  • policy influence: используется ли непроверенная память в policy decision, approval или tool selection;
  • provenance check: видит ли оператор источник, writer identity, validation state и время записи;
  • quarantine and rollback: можно ли отключить запись, переиграть affected traces и объяснить, какие ответы она изменила.

Практическое правило простое: память, которая может пережить запуск, должна проходить не только data-quality review, но и threat-model review. Иначе система получает долговременный канал атаки, который выглядит как обычная персонализация.

8.4. Управляемая память должна быть ограниченным сервисом, а не сырой базой

Cloudflare Agent Memory хорошо формулирует следующий практический шаг: производственная память агента не должна выглядеть как "модель получила доступ к базе или файловой системе и сама придумала стратегию поиска".3 Более безопасная форма — bounded memory service с маленьким API: ingest, remember, recall, list, forget.

Это меняет архитектурную ответственность:

  • ingest вызывается на границе compaction и извлекает факты, события, инструкции и задачи из истории;
  • remember сохраняет явно важную запись, но все равно проходит правила записи;
  • recall возвращает синтезированный ответ через retrieval pipeline, а не отдает модели весь storage;
  • forget и supersession chains позволяют пометить запись как больше не актуальную, а не тайно спорить с ней в prompt;
  • list и exportability делают память проверяемым активом, а не невидимым побочным эффектом.

Переносимый контракт: compaction ingest → classified memory → provenance and tenant isolation → constrained recall/remember/forget/list API → supersession and export → eval against stale or conflicting memories. Важный анти-паттерн здесь — давать агенту сырой filesystem/database interface как "память": модель начинает тратить контекст на storage strategy, смешивает поиск с долговременной записью и получает слишком широкую поверхность для отравления памяти.

9. Практические правила для проектирования памяти

Если нужен короткий каркас для первых решений, он обычно выглядит так:

  1. Сначала разделяй контекст сессии и устойчивую память, а потом уже спорь о более богатых возможностях памяти.
  2. Лучше писать меньше, но понятнее: проверенные факты почти всегда ценнее сырого текста.
  3. Правила записи должны быть жестче правил чтения.
  4. Каждая долговременная запись должна нести происхождение, метаданные арендатора и идентичность записавшего компонента.
  5. Если запись может пережить запуск, по умолчанию безопаснее вынести ее в фоновый путь.

10. Что команды чаще всего делают неправильно

Почти всегда повторяются одни и те же ошибки:

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

11. Что эксплуатационная команда должна уметь быстро ответить

Для того же кейса поддержки после странного поведения памяти команда должна быстро понимать:

  • какая запись попала в профильную память;
  • откуда она взялась;
  • кто ее записал;
  • проходила ли она проверку;
  • почему она была разрешена для этого арендатора;
  • в каких следующих запусках она уже успела повлиять на ответ.

Если на это нельзя ответить, подсистема памяти уже стала источником системного риска.

12. Практикум: модель памяти, которую можно проверить

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

Этот практикум лучше выполнять не на абстрактном агенте, а на одной реальной capability. Хороший кандидат - агент поддержки, который читает профиль клиента, смотрит историю тикетов и иногда предлагает создать новый тикет. Такой агент быстро показывает все основные риски памяти: пользовательская фраза может стать устойчивым предпочтением, временная заметка может пережить задачу, сводка может потерять источник, а retrieval может вернуть запись не тому арендатору.

Шаг 1. Разделить память по назначению

Первое решение - не техническое хранилище, а назначение записи. Для каждой кандидатной записи нужно выбрать один из классов или отказаться от записи.

Краткосрочная память хранит рабочее состояние текущего запуска: план, последние результаты инструментов, временные гипотезы, список уже проверенных фактов. Ее можно потерять после завершения задачи без долгосрочного ущерба. Если такая запись нужна через месяц, она, скорее всего, была неправильно классифицирована.

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

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

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

Шаг 2. Описать минимальный контракт записи

Каждая запись, которая переживает один запуск, должна иметь хотя бы короткую паспортную часть. Без нее команда не сможет объяснить, откуда запись взялась и почему она была разрешена для чтения.

Минимальный контракт можно держать таким:

  • record_id: стабильный идентификатор записи;
  • tenant_id: граница арендатора;
  • memory_class: short_term, long_term или profile;
  • kind: тип записи внутри класса;
  • content: нормализованное содержимое;
  • source_type: пользователь, доверенный сервис, инструмент, документ, сводка;
  • source_id: ссылка на источник или исходную трассу;
  • writer_identity: кто или какой компонент записал память;
  • validation_state: raw, reviewed, trusted, rejected, quarantined;
  • revision: номер версии;
  • retention_policy: срок хранения и правило удаления.

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

Шаг 3. Развести правила записи и правила чтения

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

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

Практическая проверка проста: если запись уже лежит в памяти, означает ли это, что ее можно читать всегда и отовсюду? Если ответ да, слой памяти слишком широк. Зрелая система читает память через retrieval query с purpose, allowed_classes, tenant_id, trust_min, max_age и лимитом объема.

Шаг 4. Проверить границу арендатора

Tenant boundary должна быть частью модели памяти, а не фильтром, который кто-то обещал добавить позже. У каждой устойчивой записи должен быть tenant_id или явное объяснение, почему запись глобальная. У каждого запроса на чтение памяти тоже должен быть tenant_id, principal_id и purpose.

Самый опасный дефект здесь часто выглядит тихо: запись не вываливается явно чужому пользователю, но влияет на ранжирование, сводку, подсказку или policy decision в другом арендаторе. Поэтому проверять нужно не только прямой вывод текста, но и косвенное влияние памяти.

Для ревью полезно пройти четыре вопроса:

  • может ли запись без tenant_id попасть в долговременную память;
  • может ли retrieval query выполниться без tenant_id;
  • может ли профильная память одного пользователя попасть в сводку другого пользователя;
  • может ли глобальная запись обойти проверку source и validation_state.

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

Шаг 5. Спроектировать карантин и отложенную активацию

Не вся память должна активироваться сразу. Для записей из недоверенных источников полезен промежуточный статус: candidate или quarantined. Это особенно важно для сценария отложенного отравления памяти, когда вредная запись не ломает текущий ответ, но через неделю начинает ослаблять поведение агента.

Карантин нужен для записей, которые:

  • получены из пользовательского текста;
  • получены из внешнего документа или HTML;
  • предлагают изменить правила, маршрутизацию, полномочия или подтверждения;
  • содержат чувствительные данные;
  • могут повлиять на policy decision, tool selection или approval flow;
  • конфликтуют с уже существующей проверенной записью.

Карантинная запись не должна попадать в обычный retrieval. Ее можно показывать оператору, использовать в оценке качества памяти или отправлять в фоновый review, но нельзя подмешивать в prompt как доверенное знание.

Шаг 6. Подготовить удаление, откат и переигрывание

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

Минимально нужны три операции.

Удаление убирает запись из будущего retrieval и фиксирует причину: истек срок хранения, пользователь отозвал согласие, запись признана ошибочной, изменился tenant boundary или завершен инцидент.

Откат переводит запись на предыдущую ревизию или отключает конкретную ревизию, если ошибка появилась в обновлении. Это особенно важно для profile memory и long_term summary, где тихое затирание истории делает расследование почти невозможным.

Переигрывание показывает, какие трассы могли быть затронуты вредной записью. Команде не всегда нужно повторять все ответы, но ей нужно понимать радиус поражения: какие trace_id читали эту запись, какие ответы или tool decisions могли измениться, какие пользователи или tenants были затронуты.

Шаг 7. Заполнить карточку памяти для одной capability

Для практического ревью удобно заполнить одну карточку. Ниже форма, которую можно использовать прямо в архитектурном review.

capability: create_support_ticket
memory_allowed_for_read:
  - short_term_working_notes
  - validated_long_term_case_facts
  - profile_language_preference
memory_denied_for_read:
  - quarantined_records
  - raw_user_text
  - unreviewed_summaries
  - records_from_another_tenant
memory_allowed_for_write:
  - short_term_tool_results
  - validated_long_term_case_summary
  - profile_preference_from_explicit_signal
memory_denied_for_write:
  - authorization_hints
  - raw_urgency_instructions
  - secrets
  - external_document_fragments
  - policy_changing_suggestions
required_fields:
  - tenant_id
  - memory_class
  - provenance
  - writer_identity
  - validation_state
  - revision
  - retention_policy
quarantine:
  - untrusted_writes
  - policy_influencing_candidates
rollback:
  mode: disable_record_revision
  evidence: affected_trace_ids
deletion:
  triggers:
    - expiry
    - user_request
    - incident_containment
    - case_closure

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

Шаг 8. Проверить трассируемость

Хорошая память должна быть видна в трассе. Не обязательно писать в один event все поля, но цепочка должна восстанавливаться.

Минимальные события:

  • memory_write_decision: кандидат разрешен, отклонен или отправлен в карантин;
  • memory_persisted: запись сохранена, с record_id, class, provenance и revision;
  • retrieval_query: запрос на чтение памяти с tenant_id, purpose и allowed_classes;
  • retrieval_result: какие записи выбраны, какие отфильтрованы и почему;
  • context_layers_built: какие классы памяти реально попали в подсказку;
  • memory_deleted или memory_retired: запись удалена, истекла или выведена из чтения;
  • rollback_replay: какие трассы проверены после отката.

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

Минимальный checklist для ревью памяти

В конце ревью полезно пройти короткий список и отдельно отметить все ответы "нет".

  • Есть ли у каждой устойчивой записи tenant_id, class, provenance и revision?
  • Отличается ли политика записи от политики чтения?
  • Может ли пользовательский текст попасть в долговременную память без review?
  • Есть ли quarantine state для недоверенных и policy-influencing записей?
  • Может ли retrieval выполниться без tenant_id и purpose?
  • Запрещено ли использовать profile memory как основание для авторизации?
  • Можно ли удалить запись и объяснить причину удаления?
  • Можно ли откатить конкретную ревизию, не теряя историю?
  • Можно ли найти trace_id, в которых запись была прочитана?
  • Есть ли eval-сценарии на неверную запись, устаревший профиль, cross-tenant leakage и отказ удаления?

Если команда честно отвечает на эти вопросы, память перестает быть невидимым удобством и становится управляемым слоем архитектуры.

Что должно измениться в реализации после такого ревью

После ревью обычно появляются очень конкретные задачи, а не абстрактное требование "улучшить память". Нужно добавить или уточнить схему memory_record. Нужно разделить read policy и write policy. Нужно запретить запись из raw_user_prompt в long_term и profile без review. Нужно добавить tenant filter в retrieval path. Нужно логировать memory_write_decision и retrieval_result. Нужно сделать операцию disable/delete для записи и связать ее с affected traces. Нужно добавить eval-сценарии, которые проверяют, что вредная запись не активируется позже.

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

13. Что делать сразу после этой главы

Если ты только подходишь к проектированию памяти, начни с очень короткой последовательности:

  1. Раздели контекст сессии и устойчивую память.
  2. Определи типы записей, которые вообще допустимы.
  3. Добавь происхождение и метаданные арендатора.
  4. И только потом автоматизируй путь записи.

Если сделать наоборот, память очень быстро станет местом, куда платформа складывает все, что не смогла аккуратно спроектировать.

Шаблон завершения главы

Что запомнить: память — это не удобное хранилище, а долговременное состояние с отдельными границами доверия и правилами записи.

Типичные ошибки: писать в память из горячего пути; смешивать пользовательский текст с проверенными фактами; не задавать срок жизни и источник записи.

Что проверить в своей системе: кто может записывать память; какие записи считаются недоверенными; как работает карантин, срок хранения и очистка после инцидента.

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

Что читать дальше: переходи к Главе 6, чтобы разделить краткосрочную, долговременную и профильную память.

14. Что читать дальше

В следующих главах этой части мы спокойно разберем:

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

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

А пока главный вывод простой: память полезна только тогда, когда она проектируется как управляемый слой системы, а не как бесконтрольное накопление текста.